【问题标题】:How to make POST with array as header and AFNetworking如何使用数组作为标头和 AFNetworking 进行 POST
【发布时间】:2017-06-20 10:39:14
【问题描述】:

这是标题:

                "url": "{{host}}/images/bla",
            "method": "POST",
            "header": [
                {
                    "key": "Content-Type",
                    "value": "application/json",
                    "description": ""
                },
                {
                    "key": "Authorization",
                    "value": "Bearer token",
                    "description": ""
                }
            ],
            "body": { ... }

我尝试分两种情况解决:

案例 1(崩溃):

NSDictionary *headerDict = @{@"key": @"Content-Type",
                                 @"value": @"application/json",
                                 @"description": @""};

NSDictionary *headerDict1 = @{@"key": @"Authorization",
                                 @"value": kBearerKey,
                                 @"description": @""};
NSArray *headerArray = @[headerDict, headerDict1];

[weakSelf.requestOperationManager.requestSerializer setValue:headerArray forHTTPHeaderField:@"header"];

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

weakSelf.requestOperationManager.requestSerializer = [AFHTTPRequestSerializer serializer];
[weakSelf.requestOperationManager.requestSerializer setValue:@"Content-Type" forHTTPHeaderField:@"key"];
[weakSelf.requestOperationManager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"value"];
[weakSelf.requestOperationManager.requestSerializer setValue:@"Authorization" forHTTPHeaderField:@"key"];
[weakSelf.requestOperationManager.requestSerializer setValue:kBearerKey forHTTPHeaderField:@"value"];

无论如何,在 案例 1 中会生成一个警告(并且也会导致崩溃),因为 setValue 应该是 NSString 而不是 NSArray

【问题讨论】:

  • 你需要将数组转换成json字符串: NSData *jsonData2 = [NSJSONSerialization dataWithJSONObject: headerArray options:NSJSONWritingPrettyPrinted error:&error]; NSString *jsonString = [[NSString alloc] initWithData:jsonData2 encoding:NSUTF8StringEncoding];
  • 这是有效的,但问题是数据解释器在@"application/json" 中添加了一个“\”,它看起来像 @"application\/json" : (lldb) po headerString [ { " key”:“Content-Type”,“value”:“application\/json”,“description”:“”},{“key”:“授权”,“value”:“Bearer xpkaVSckJSfCWzcXfODtiBu38B6mOMzPW....”, “描述”:“”}]

标签: ios objective-c json http-headers afnetworking


【解决方案1】:

例如,您可以将 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];
}

【讨论】:

    【解决方案2】:

    试试这个;

    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"];
    

    【讨论】:

      【解决方案3】:

      试试这个:

      AFNetworking 3

      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];
      

      【讨论】:

        【解决方案4】:
        NSDictionary *headerDict = @{@"Content-Type": @"application/json", @"Authorization": kBearerKey};
        

        [weakSelf.requestOperationManager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        [weakSelf.requestOperationManager.requestSerializer setValue:kBearerKey forHTTPHeaderField:@"Authorization"];
        

        【讨论】:

        • 试试这个weakSelf.requestOperationManager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
        猜你喜欢
        • 1970-01-01
        • 2014-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多