50

Javascript を使用して圧縮された POST データを、管理しているサーバーに送信したいと考えています。HTTP レイヤーに圧縮を処理させる方法はありますか。

JSONを送信しています。コンテンツ タイプを GZIP/deflate に設定すると、ブラウザは自動的に圧縮し、deflate mod を使用した Apache は自動的に圧縮解除するので、アプリケーションはデータが圧縮されていることをまったく考える必要がありませんか?

逆にうまくいくことはわかっていますが、このように動作させる方法はありますか?

4

3 に答える 3

80

ブラウザは自動的にデータを gzip エンコードしますか? 短い答えはノーです。

長い答えは、一部のユーザーエージェントはこのようなことを行うことができますが、それに頼ることは絶対にできません. Apache mod_deflate ドキュメントの状態:

一部の特別なアプリケーションは実際に要求の圧縮をサポートしています。たとえば、一部の WebDAV クライアントです。

だから、いいえ、それはうまくいきません。適切な HTTP 要求メッセージを自分で生成する必要があります。この場合の適切なヘッダーは and ではContent-Encoding: gzipありませんContent-Type:。これは、コンテンツ自体がapplication/jsonであるためです。転送用に HTTP 要求メッセージのエンティティ ボディをエンコードしようとしているだけです。

圧縮後のメッセージ エンティティ ボディのサイズをバイト単位で指定する適切なヘッダーも追加する必要があることに注意してください。または、コンテンツ長の指定を無視しContent-Length:て HTTP メッセージを送信します。Transfer-Encoding: chunked

受信側では、入力フィルターを使用して情報を解凍するように指示できます。 mod_deflate

<Location /dav-area>
SetInputFilter DEFLATE
</Location>

いくつかのリソースに対して圧縮されたメッセージ本文のみを受信して​​いる場合、これは少し面倒です。代わりに、クライアント側スクリプトを使用してContent-Encoding: gzipヘッダーを確認し、リクエスト本文を手動で解凍する必要があります。たとえば、PHP でこれを行う方法は、まったく別の問題です。その詳細が必要な場合は、別の質問を投稿する必要があります。

于 2012-10-23T14:16:38.117 に答える
0

https://github.com/dankogai/js-deflateを使用してこれを達成しまし たが、postdata は何らかの理由で + 記号を取り除き、スペースに置き換えます。

JavaScript 経由でデータを送信するには:

params.mapdata=  btoa(RawDeflate.deflate(JSON.stringify(mapdata)));

PHP経由でデータを受信するには:

$value = gzinflate(base64_decode(preg_replace('/\s/', '+',$value)));
于 2013-06-03T21:05:13.873 に答える