【问题标题】:NSURLConnection asynchronous request cuts off body during sendNSURLConnection 异步请求在发送期间切断正文
【发布时间】:2013-01-11 21:26:17
【问题描述】:

我有一种方法可以定期向服务器发送数据并接收响应代码。我为它实现了 NSURLConnection 的 sendAsynchronousRequest,它可以很好地处理小数据。我有机会测试发送 base64 编码的图片,这是该应用程序的一项常见任务,并且发现它在编码图像的几个字符后切断。这是涉及的代码。

// Initial setup
NSString *urlStr = @"https://example.com/";
urlRequest = [[NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlStr]] retain];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

// The actual sending part
- (void)sendRequest:(NSString *)reqStr {

@try {
    if (sendRequestStatus == kRequestState_waiting) {
        sendRequestStatus = kRequestState_processing;
        NSString *dataStr = [NSString stringWithFormat:@"request_data=%@",reqStr];
        NSLog(@"datastr is %@",dataStr);
        NSData *dataForUrl = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
        NSLog(@"nsdata length is: %i",[dataForUrl length]);
        [urlRequest setHTTPBody:dataForUrl];
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];

        [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *res, NSData *data, NSError *err) {
          // housekeeping
        }];
    }
}

我在日志中没有错误。打印出 dataStr 的日志语句打印出正确的数据。打印数据长度的日志语句打印出183384字节,这似乎适合图片。然而,在服务器上,帖子正文在编码图像数据开始后被截断几个字符。例如/9j/4,其中 4 是服务器收到的最后一个字符。

我正在 iPhone 3Gs 上对此进行测试。这是一个phonegap应用程序,在我的Android版本上测试没有问题,所以问题一定出在我发送数据的实现上。我没有听到其他使用 iPhone 4 或 4s 的测试人员有任何问题,所以这可能是处理速度的问题。我能做些什么来收紧这个并防止柱体被切断?

【问题讨论】:

    标签: iphone cordova post nsurlconnection


    【解决方案1】:

    我没有测试,但问题可能是这样的:

    [urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    

    我会试试这个:

    [urlRequest setValue:@"text/plain" forHTTPHeaderField:@"Content-Type"];
    

    因为您发送的是 base 64 编码字符串。

    【讨论】:

    • 事实证明,数据在另一端被解释为 url 编码数据(可能是正确的)并且未被编码。这导致+ 字符被接收为空格。为了修复它,我只是在发送数据之前对数据进行了一次编码,服务器现在可以很好地接收它。我不确定是苹果还是 IIS 玩得不好。您的建议会阻止该服务器解码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2019-10-08
    相关资源
    最近更新 更多