NSURLSessionConfiguration 不接受 HTTPAdditionalHeaders 中的“内容类型”

Posted

技术标签:

【中文标题】NSURLSessionConfiguration 不接受 HTTPAdditionalHeaders 中的“内容类型”【英文标题】:NSURLSessionConfiguration not accepting 'Content type' in HTTPAdditionalHeaders 【发布时间】:2015-04-15 10:50:03 【问题描述】:

我正在使用 NSURLSession 进行 REST Web 服务调用。我在 NSURLSessionConfiguration.HTTPAdditionalHeaders 中设置了 Web 服务的内容类型。下面的代码在 ios 7.0 到 iOS 8.1.3 中运行良好。但在 iOS 8.3 中,当在 HTTPAdditionalHeaders 中设置 content-Type 时,Web 服务响应数据返回为零字节。

方法一:

NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] init];
NSData *postData = [dataToBeSent dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
[urlRequest setHTTPBody:postData];
[urlRequest setHTTPShouldHandleCookies:YES];
[urlRequest setURL:urlOfService];
[urlRequest setHTTPMethod:@"POST"];

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfiguration.HTTPAdditionalHeaders = @@"Content-Type"       : @"application/json";
NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
];

如果我修改上面的代码在 NSMutableURLRequest 中设置 content-Type 如下,我会从 iOS8.3 的 webservice 接收数据。我不确定是什么导致了这个问题。我也没有看到有人报告这个问题。我只想知道我调用 Web 服务的第一种方式是推荐的方式还是我在这里做错了什么?如果第一种调用 Web 服务的方法是错误的,为什么它应该在除 8.3 之外的所有其他 iOS 版本上工作?

方法二:

NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] init];
NSData *postData = [dataToBeSent dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
[urlRequest setHTTPBody:postData];
[urlRequest setHTTPShouldHandleCookies:YES];
[urlRequest setURL:urlOfService];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];

NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
];

【问题讨论】:

【参考方案1】:

由于 iOS 8.3 SDK http://openradar.appspot.com/20498383987654321@ 中的错误(功能?),您必须使用第二种方法

【讨论】:

【参考方案2】:

我没有在您的代码中看到错误。但也许值得尝试使用AFNetworking

该库非常完整,并且在内容类型、异步连接等方面提供了很大的灵活性...我认为我们无法预测新 iOS 版本的行为,因为它们很快就弃用了很多东西. AFNetworking 一直在更新。

Here is the framework, they have examples and everything you could possibly need.

您可能必须使用请求序列化。我链接到你的页面上有几个例子。

【讨论】:

现在我不想在我的项目中使用 AFNetworking。如果我使用第二种方法,它工作正常。我只想知道这是否是 iOS 8.3 中 NSURLSessionConfiguration API 的错误。这样我就可以继续在雷达中提交错误。

以上是关于NSURLSessionConfiguration 不接受 HTTPAdditionalHeaders 中的“内容类型”的主要内容,如果未能解决你的问题,请参考以下文章

测试是不是遵守 NSURLSessionConfiguration 设置

NSURLSessionConfiguration 不接受 HTTPAdditionalHeaders 中的“内容类型”

通过NSURLSessionConfiguration对类属性property(class)的思考

NSURLSessionConfiguration 不返回 URLRequest 数据

iOS开发之网络编程--6NSURLSessionConfiguration笔记

iOS NSURLSessionConfiguration Reference