问题描述
你好我需要在从我的webservice加载数据时创建一个progressView。
Hello i need to create a progressView when i load data from my webservice.
实际上,expectedContentLength总是返回-1。
Actually the expectedContentLength alway return -1.
看了很多类似的问题之后,看起来我的webservice从未发送Content-Length:。
After look lots of similary problem it looks like my webservice never send the Content-Length:.
然后我检查CURL,这是结果:
Then i check with CURL and here is the result :
< HTTP/1.1 200 OK
< Date: Thu, 21 Jun 2012 10:04:39 GMT
< Server: Apache/2.2.16 (Debian)
< X-Powered-By: PHP/5.3.3-7+squeeze9
< cache-control: no-cache
< Vary: Accept-Encoding
< Content-Type: text/html; charset=UTF-8
< Content-Length: 3239
< Connection: Keep-Alive
< Set-Cookie: PHPSESSID=u4o4i9dofdgnkfmtnf163635j6; path=/
这是我的代码来捕捉长度
and here is my code to catch length
long long expectDataSize;
long long currentDataSize;
....
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response
{
NSLog(@"expect content length %lld", [response expectedContentLength]);
expectDataSize = [response expectedContentLength];
currentDataSize = 0;
}
任何人都已经看到这个问题?
Anyone have already see this problem ?
推荐答案
好的我自己解决这里是我真正的问题和解决方案:
Ok i've fix it myself here is my real problem and a solution :
当我问与Curl我可以得到长度没问题。
When i ask with Curl i can get the length no problem.
但是当我使用NSurlConnection时
But when i use NSurlConnection
NSURLConnection *c = [[NSURLConnection alloc] initWithRequest:req delegate:self];
响应将使用Gzip进行压缩(不要问我原因)。如果响应是用Gzip编码的,则无法知道长度,然后 expectedContentLength 返回 -1 。
[response allHeaderFields] 中没有内容长度。
The response will be compress with "Gzip" (don't ask me why). And if the response is encode with Gzip it's impossible to know the length, then "expectedContentLength" return -1.And "Content-Length" is absent from [response allHeaderFields].
如果你真的想要获得长度,你可以只需强制不要像这样使用Gzip:
If you really want to get the length you can simply force to not use Gzip like this :
[req setValue:@"" forHTTPHeaderField:@"Accept-Encoding"];
这篇关于响应expectedContentLength返回-1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!