1

*

注: このトピックにはいくつかのリンクがありますが、うまくいきませんでした。新しいものをここに投稿する必要があります。

*

基本的に、UIProgressView を表示して、Web サービスからフェッチされているデータを表示しようとしています。ここでの問題は、アプリケーションから呼び出すほとんどすべてのサービスの expectedContentLength を取得していて、応答ヘッダーにContent-Lengthが含まれていることです。しかし、Web サービスの応答の 1 つで、expectedContentLength が返されず、代わりに常に -1 が返されます。

以下は、2 つの異なる Web サービス応答に対して取得する応答ヘッダーです。

- コンテンツの長さを取得する応答ヘッダー (サービスからのデータはそれほど大きくありません)

{
    Connection = "Keep-Alive";
    "Content-Length" = 2689;
    "Content-Type" = "application/json";
    Date = "Tue, 23 Jun 2015 08:19:04 GMT";
    "Keep-Alive" = "timeout=5, max=98";
    Server = "Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.5.15";
    "X-Powered-By" = "PHP/5.5.15";
}

- コンテンツの長さを取得できない応答ヘッダー。(応答には膨大なデータが含まれており、 JSONデータのみをダウンロードするファイルはありません)

{
    Connection = "Keep-Alive";
    "Content-Type" = "application/json";
    Date = "Tue, 23 Jun 2015 08:12:34 GMT";
    "Keep-Alive" = "timeout=5, max=97";
    Server = "Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.5.15";
    "Transfer-Encoding" = Identity;
    "X-Powered-By" = "PHP/5.5.15";
}

上記のサービス レスポンスには膨大なデータが含まれています。高度な残りのクライアントのクロムの拡張機能で応答をテストすると、「Transfer-Encoding」= chunked; の次の応答ヘッダーが得られます。

Date: Tue, 23 Jun 2015 12:01:20 GMT 
Server: Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.5.15 
X-Powered-By: PHP/5.5.15
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked 
Content-Type: application/json

次のリンクを使用しましたが、どれも役に立ちませんでした: Link1Link2Link3

私を助けてください。ありがとう!

更新されたコード: サーバー側で Content-Lenth ヘッダーを設定した後、Advanced rest client chrome's extension のContent-Length ヘッダーで有効な応答を得ました。

Date: Wed, 24 Jun 2015 05:25:48 GMT 
Server: Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.5.15 
X-Powered-By: PHP/5.5.15
Content-Length: 1272347 
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/json

しかし、クライアント側 (つまり、iOS アプリケーション) では、まだ Content-Length ヘッダーを取得していないため、expectedContentLength 値を取得できません。私はまだ "Transfer-Encoding" = Identity; を取得しています。私の側の応答ヘッダーに。次のように、リクエストに Accept-Encoding ヘッダーも設定しました。

[req setValue:@"identity;q=0" forHTTPHeaderField:@"Accept-Encoding"];

いずれかの側(サーバー/クライアント)で行うべきことは他にありますか?

4

1 に答える 1

1

サーバー側でコンテンツの長さを追加する方法がわかりません-以前にこれに問題があり、あるケースではあなたと同様の状況がありました-コンテンツの長さはすべてのヘッダーをダンプすることで表示されましたが、iOSは表示しませんでしたデリゲート メソッドでそれを渡します。それを取得する標準的な方法は次のとおりです。

- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)response
{
  ...
  NSUInteger responseLength = response.expectedContentLength == NSURLResponseUnknownLength ? 1024 : (NSUInteger)response.expectedContentLength;

私は実際にこれにバグを入力しました: rdar://15605995 "HTTP Get response is 200 but response.expectedContentLength = -1 even when a Content-Length is found in the headers"

2014-01-08 18:49:36.966 DB_Lookup[36824:3f07] YIKES:LEN=22162 {
"Cache-Control" = "must-revalidate";
Connection = "keep-alive";
"Content-Encoding" = gzip;
"Content-Length" = 22162;
"Content-Type" = "text/html; charset=UTF-8";
Date = "Wed, 08 Jan 2014 23:49:09 GMT";
Expires = 0;
"Front-End-Https" = on;
Pragma = "no-cache";
Server = "nginx/1.2.4";
"Strict-Transport-Security" = "max-age=2592000";
Vary = "Accept-Encoding";
"X-Content-Type-Options" = nosniff;
"X-Frame-Options" = SAMEORIGIN;
"X-Powered-By" = <Company>;
"X-<Company>-Server" = "<private>";
"X-XSS-Protection" = "1; mode=block";

}

このコードの場合:

if(response.expectedContentLength == NSURLResponseUnknownLength) { 
    id len = httpResponse.allHeaderFields[@"Content-Length"];
    if(len) {
        responseLength = [len integerValue];
    }
    NSLog(@"YIKES:LEN=%@ %@", len, httpResponse.allHeaderFields);
}

これは、私にとって特別な場合には本当に難しいでしょう。私は社内データベースにアクセスしています。最初に名前とパスワードを使用し、次に自分の電話にコードを取得して (後で入力します)、アクセスする必要があります。他に役立つ情報はありますか? コンテンツの長さがヘッダーに明確に記載されているのに、それが表示されずに返されるというのはどうしてでしょうか?


Apple は私のバグを「期待どおりに動作する」と言って閉じました。本当!?!?!?!?!?!?!

[NSURLSession で修正されたかどうかはわかりません。]

編集: 過去に、DID に接続した他のサイトが適切に設定された「expectedContentLength」になることを追加する必要がありました。

于 2015-07-06T18:19:47.083 に答える