1

我有一个连接到我制作的 PHP API 的 NSURLConnection。该 PHP API 以数据响应。由于它是一个动态应用程序,我这样做是为了告诉内容长度:

ob_start('scAPIHandler');    

function scAPIHandler($buffer){

    header('Content-Length: '.strlen($buffer));

    return $buffer;

}

在 API 文件的开头,然后输出任何必要的内容。然而,当

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 

函数触发,值为response.expectedContentLength-1。当我尝试不连接到我的 PHP API,而是连接到网络上的一些图像时,会显示正确的预期内容长度。有什么方法可以让我的 PHP API 告诉 NSURLResponse 预期的内容长度?内容长度标头似乎不起作用。

提前致谢!

4

1 回答 1

1

好的,我已经想通了。我用了

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

    NSDictionary *responseHeaders = ((NSHTTPURLResponse *)response).allHeaderFields;

    NSLog(@"headers: %@", responseHeaders.description);

}

这种方法可以找出我的 iOS 应用程序正在接收的标头,并将它们与连接到同一 URL 时 curl 打印的标头进行比较。事实证明,curl 显示的标题与 Objective-C 显示的标题之间存在差异。诚然,这让我很困惑,我不知道为什么会发生这种情况,但我找到了一个解决方案:

ob_start('scAPIHandler');    

function scAPIHandler($buffer){

    header('Custom-Content-Length: '.strlen($buffer));

    return $buffer;

}

Custom-Content-Length 确实出现在 Objective-C 中,我只是拿了我的自定义标题

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

    self.expectedContentLength = response.expectedContentLength;
    self.receivedData.length = 0;

    NSDictionary *responseHeaders = ((NSHTTPURLResponse *)response).allHeaderFields;

    if(self.expectedContentLength < 0){

        // take my own header

        NSString *actualContentLength = responseHeaders[@"Custom-Content-Length"];

        if(actualContentLength && actualContentLength.length > 0){

            self.expectedContentLength = actualContentLength.longLongValue;

        }

    }

}

并覆盖了预期的内容长度。

于 2013-10-09T12:52:37.647 回答