NSURLResponse expectedContentLength -1

时间:2013-10-08 17:47:31

标签: php objective-c http-headers nsurlconnection content-length

我有一个NSURLConnection连接到我已经创建的PHP API。 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,而是连接到Web上的某些图像时,会显示正确的预期内容长度。有什么方法可以让我的PHP API告诉NSURLResponse期望的内容长度?内容长度标题似乎不起作用。

提前致谢!

1 个答案:

答案 0 :(得分:1)

好的,我已经明白了。我用了

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

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

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

}

这个方法可以找出我的iOS应用程序正在接收的标题,并将它们与连接到同一URL时卷曲打印的标题进行比较。事实证明,卷曲显示的标题和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;

        }

    }

}

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