Ios 如何使用数组作为标题和AFN创建POST

Ios 如何使用数组作为标题和AFN创建POST,ios,objective-c,json,http-headers,afnetworking,Ios,Objective C,Json,Http Headers,Afnetworking,这是标题: "url": "{{host}}/images/bla", "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json", "description":

这是标题:

                "url": "{{host}}/images/bla",
            "method": "POST",
            "header": [
                {
                    "key": "Content-Type",
                    "value": "application/json",
                    "description": ""
                },
                {
                    "key": "Authorization",
                    "value": "Bearer token",
                    "description": ""
                }
            ],
            "body": { ... }
我试图在两种情况下解决这个问题:

案例1(崩溃):

案例2(不会崩溃但也不起作用):


无论如何,在案例1中,会生成一个警告(也会发生崩溃),因为
setValue
预期为
NSString
而不是
NSArray
例如,您可以将NSMutableDictionary中的所有头值保留为键/值对

NSDictionary *headersDict = @{@"Content-Type": @"application/json",
                                  @"Authorization": kBearerKey };
然后可以迭代键值并设置http头

[headersDict enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) {
        [requestManager.requestSerializer setValue:obj forHTTPHeaderField:key];
    }];
在您的情况下,您使用的是数组。。您可以迭代数组并设置头值,希望这对您有所帮助

for (NSDictionary *dict in headerArray) {

        NSString *key = [dict objectForKey:@"key"];
        NSString *value = [dict objectForKey:@"value"];

        [requestManager.requestSerializer setValue:value forHTTPHeaderField:key];
}
试试这个

NSError *error;

NSData *jsonData = [NSJSONSerialization:headerArray options:NSJSONWritingPrettyPrinted error:&error];                                                                                 

NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

[weakSelf.requestOperationManager.requestSerializer setValue:jsonString forHTTPHeaderField:@"header"];
试试这个:

AF3网络

NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject: headerArray options:NSJSONWritingPrettyPrinted error:&error];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:url parameters:nil error:nil];

req.timeoutInterval= [[[NSUserDefaults standardUserDefaults] valueForKey:@"timeoutInterval"] longValue];
[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[req setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[req setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];


NSURLSessionUploadTask *uploadTask;
uploadTask = [manager
              uploadTaskWithStreamedRequest:req
              progress:^(NSProgress * _Nonnull uploadProgress) {
                  dispatch_async(dispatch_get_main_queue(), ^{
                  });
              }
              completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
                  if (error) {
                      NSLog(@"Error: %@", [[NSString alloc]initWithData:[[error valueForKey:@"userInfo"] valueForKey:@"com.alamofire.serialization.response.error.data"] encoding:NSUTF8StringEncoding]);

                  } else {
                  }
              }];

[uploadTask resume];


您需要将数组转换为json字符串:NSData*jsonData2=[NSJSONSerialization dataWithJSONObject:headerArray选项:NSJSONWriting预打印错误:&error];NSString*jsonString=[[NSString alloc]initWithData:jsonData2编码:NSUTF8StringEncoding];这是可行的,但问题是数据解释器在@“application/json”中添加了一个“\”,它看起来像@“application\/json”:(lldb)po headerString[{“key”:“Content Type”,“value”:“application\/json”,“description”:“},{“key”:“Authorization”,“value”:“Bearer xpkavsckjsfcwcxfcxfodtibu38b6momzpw…”,“description”:“}]请尝试此
weakSelf.requestOperationManager.responseSerializer.acceptableContentTypes=[NSSet setWithObject:@“text/plain”];
NSError *error;

NSData *jsonData = [NSJSONSerialization:headerArray options:NSJSONWritingPrettyPrinted error:&error];                                                                                 

NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

[weakSelf.requestOperationManager.requestSerializer setValue:jsonString forHTTPHeaderField:@"header"];
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject: headerArray options:NSJSONWritingPrettyPrinted error:&error];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:url parameters:nil error:nil];

req.timeoutInterval= [[[NSUserDefaults standardUserDefaults] valueForKey:@"timeoutInterval"] longValue];
[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[req setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[req setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];


NSURLSessionUploadTask *uploadTask;
uploadTask = [manager
              uploadTaskWithStreamedRequest:req
              progress:^(NSProgress * _Nonnull uploadProgress) {
                  dispatch_async(dispatch_get_main_queue(), ^{
                  });
              }
              completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
                  if (error) {
                      NSLog(@"Error: %@", [[NSString alloc]initWithData:[[error valueForKey:@"userInfo"] valueForKey:@"com.alamofire.serialization.response.error.data"] encoding:NSUTF8StringEncoding]);

                  } else {
                  }
              }];

[uploadTask resume];
NSDictionary *headerDict = @{@"Content-Type": @"application/json", @"Authorization": kBearerKey};
[weakSelf.requestOperationManager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[weakSelf.requestOperationManager.requestSerializer setValue:kBearerKey forHTTPHeaderField:@"Authorization"];