我想从服务器接收数据。但数据的价值正在变为零。 代码如下。
- (void) EstablishNetworkConnectionThread:(NSString *) url{
@try {
url=[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString * API = url;
//NSLog(@"NetworkConnection = %@", API);
NSString *post = [NSString stringWithFormat:@""];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
//NSURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:API]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
[request setTimeoutInterval:60.0];
NSURLResponse *response;
NSData *POSTReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
NSString *theReply = [[NSString alloc] initWithBytes:[POSTReply bytes] length:[POSTReply length] encoding: NSASCIIStringEncoding];
NSError *e = [[NSError alloc] init];
dictJSON = [NSJSONSerialization JSONObjectWithData: [theReply dataUsingEncoding:NSUTF8StringEncoding] options: NSJSONReadingMutableContainers error: &e];
NSLog(@"NetworkConnection JSON = %@", dictJSON);
if (dictJSON == nil) {
NSLog(@"Web Service Error url = %@\nError = %@", url, theReply);
[self performSelectorOnMainThread:@selector(PopUpNetworkMessage) withObject:nil waitUntilDone:NO];
}
[[LoadingViewController instance] stopRotation];
} @catch (NSException *exception) {
[[LoadingViewController instance] stopRotation];
} @finally { }
}
dictJSON是一个ivar,dictJSON的值变为零。 解决办法是什么???
答案 0 :(得分:0)
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *connectionError) {
// ...
}];
[task resume];
使用NSURLSession获取响应,NSURLConnection在ios9.0上已弃用。
答案 1 :(得分:0)
这是一个坏主意:
url=[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
不要那样做。 IMO,stringByAddingPercentEscapesUsingEncoding:如果不是彻底删除,则应该弃用。从根本上说,它对任何目的都是不安全的。只有一种安全方法可以添加百分比转义,这就是在构建URL字符串时一次只执行一个组件。如果你有一个有效的URL开头,这可能会使它无效。
您的帖子数据始终为空。你为什么这样做呢?
在为body提供NSData对象时,我认为你实际上不必设置Content-Length。
永远不要使用sendSynchronousRequest。同步网络请求存在严重问题,而不仅仅是因为它们阻止了它们运行的线程。
这是用ARC编译的吗?如果没有,那么当您将数据存储到ivar时,您需要保留。否则,当您稍后返回检查其值时,它将最终为空。
为什么要将NSData对象的响应转换为NSString(丢失)然后再转换回NSData对象?只需将NSData对象传递给NSJSONSerialization,除非您尝试解决该API中的错误或其他问题。
很难说上述哪一项(如果有的话)会导致您的问题。如果解决上述问题,我要做的第一件事就是检查服务器日志,如果可能的话,用tcpdump / wireshark嗅探网络流量,看看实际发送和接收的是什么。