无法在目标c中接收服务器数据

时间:2016-02-09 06:13:52

标签: ios objective-c json nsurlsession

我想从服务器接收数据。但数据的价值正在变为零。 代码如下。

- (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的值变为零。 解决办法是什么???

2 个答案:

答案 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)

  1. 这是一个坏主意:

    url=[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    

    不要那样做。 IMO,stringByAddingPercentEscapesUsingEncoding:如果不是彻底删除,则应该弃用。从根本上说,它对任何目的都是不安全的。只有一种安全方法可以添加百分比转义,这就是在构建URL字符串时一次只执行一个组件。如果你有一个有效的URL开头,这可能会使它无效。

  2. 您的帖子数据始终为空。你为什么这样做呢?

  3. 在为body提供NSData对象时,我认为你实际上不必设置Content-Length。

  4. 永远不要使用sendSynchronousRequest。同步网络请求存在严重问题,而不仅仅是因为它们阻止了它们运行的​​线程。

  5. 这是用ARC编译的吗?如果没有,那么当您将数据存储到ivar时,您需要保留。否则,当您稍后返回检查其值时,它将最终为空。

  6. 为什么要将NSData对象的响应转换为NSString(丢失)然后再转换回NSData对象?只需将NSData对象传递给NSJSONSerialization,除非您尝试解决该API中的错误或其他问题。

  7. 很难说上述哪一项(如果有的话)会导致您的问题。如果解决上述问题,我要做的第一件事就是检查服务器日志,如果可能的话,用tcpdump / wireshark嗅探网络流量,看看实际发送和接收的是什么。