You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:53:27