我正在使用NSURLSession进行REST Web服务调用。我已在NSURLSessionConfiguration.HTTPAdditionalHeaders中为web服务设置了content-Type。以下代码在iOS 7.0到iOS 8.1.3中运行得非常好。但是在iOS 8.3中,当在HTTPAdditionalHeaders中设置content-Type时,Web服务响应数据将返回为零字节。
方法1:
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版本?
方法2:
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) {
}];
答案 0 :(得分:4)
由于iOS 8.3 SDK http://openradar.appspot.com/20498383中的错误(功能?),您必须使用第二种方法
答案 1 :(得分:-1)
我没有在你的代码中看到错误。但是尝试使用AFNetworking
可能值得一试。
库非常完整,在内容类型,异步连接等方面提供了很大的灵活性......我认为我们不能预测新iOS版本的行为,因为他们很快就弃用了很多东西。 AFNetworking
一直在更新。
Here is the framework, they have examples and everything you could possibly need.
您可能必须使用requestserialization。我链接到的页面上有几个例子。