Objective-C中NSURLSessionDataTask未执行的POST请求问题排查
NSURLSessionDataTask未触发的问题排查
以下是你的代码里可能导致任务不触发或异常的几个问题:
Content-Length计算错误
你用[jsonRequestString length]计算请求体长度,但字符串长度和UTF8字节长度并不完全一致(比如包含中文等多字节字符时)。正确的做法是直接使用requestData.length,因为requestData已经是UTF8编码的NSData,它的长度才是准确的HTTP请求体字节数。错误的Content-Length可能导致服务器拒绝请求,或者任务内部异常终止。冗余的JSON数据转换
你已经通过GETJSONData得到了正确的jsonRequestData(NSData类型的JSON),没必要转成NSString再重新转成NSData。直接把jsonRequestData设为HTTPBody即可,多一步转换可能引入编码问题,甚至损坏数据。JSON解析的类型错误与错误处理混乱
NSJSONSerialization JSONObjectWithData:options:error:返回的是字典或数组(id类型),不是NSData。你把它赋值给NSData变量json会直接导致类型错误,触发crash,让你误以为任务没执行。另外,你复用了同一个error变量,请求的错误会被解析错误覆盖,无法排查真正的问题。缺少请求错误的日志输出
完成回调里没检查请求本身的error(比如网络不通、DNS解析失败等),应该先判断error是否存在,优先打印请求错误,再处理响应数据。
修正后的代码示例:
-(BOOL)CallPayPass:(PaymentConfig *)aConfig { NSData *jsonRequestData = [self GETJSONData:aConfig]; if (!jsonRequestData) { NSLog(@"Failed to create JSON data"); return NO; // 这里应该返回NO,告知调用者失败 } //Step 1: Initialize transaction and get transactionnumber NSURL *url = [NSURL URLWithString:@"https://api.sandbox.paypass.com/api/transactions/init"]; if (!url) { NSLog(@"Invalid URL"); return NO; } NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [request setValue:@"application/json; charset=UTF-8" forHTTPHeaderField:@"Content-Type"]; // 直接用jsonRequestData的长度,无需额外计算 [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)jsonRequestData.length] forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody:jsonRequestData]; // 直接使用已有的JSON数据 NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // 先检查请求是否出错 if (error) { NSLog(@"Request error: %@", error.localizedDescription); return; } // 再处理响应数据 NSError *parseError = nil; id jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&parseError]; if (!jsonResponse) { NSLog(@"Failed to parse JSON response: %@", parseError.localizedDescription); // 可以打印原始响应数据,排查格式问题 NSString *rawResponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"Raw response data: %@", rawResponse); } else { NSLog(@"JSON response: %@", jsonResponse); NSString *jsonResponseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"Response string: %@", jsonResponseString); } }]; [dataTask resume]; return YES; }
内容的提问来源于stack exchange,提问作者Vic85
相关产品推荐
相关产品推荐

