2012-10-23 21 views
29

Javascriptを使用して圧縮されたPOSTデータを、自分が管理しているサーバーに送信したいとします。 HTTPレイヤーに圧縮をさせる方法はありますか?ブラウザから送信されたHTTP POSTデータを圧縮する

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

私はそれがこのように動作するように、他の方法で動作することができますが、どのような方法で動作することが知っていますか?

答えて

63

ブラウザが自動的にgzip-encodeしますか?短い答えは...

HAAHAHAAahahahahahhahaです。

長い答えはいくつかのユーザーエージェントは、このようなことを行うことができるということですが、あなたは間違いなくそれに頼ることはできません。 Apacheのmod_deflateドキュメントの状態:

いくつかの特別なアプリケーションは、実際にはいくつかのWebDAVクライアントなどの要求圧縮をサポートしています。

いいえ、それはうまくいきません。自分で適切なHTTPリクエストメッセージを生成する必要があります。コンテンツ自体がapplication/jsonであるため、適切なヘッダーはContent-Encoding: gzipで、Content-Type:ではありません。トランスポート用のHTTP要求メッセージのエンティティ本文をエンコードするだけです。

圧縮後のメッセージエンティティ本体のサイズをバイト単位で指定する適切なContent-Length:ヘッダーを追加する必要があります。または、Transfer-Encoding: chunkedを使用してHTTPメッセージを送信し、コンテンツ長の指定を省略します。受信側で

、あなたできinstruct mod_deflate to use an input filter情報を解凍する:

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

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

+0

小さなバーストのJSONテキストを送信する場合は、データを圧縮するために必要な処理オーバーヘッドが、転送サイズのメリットよりも大きい可能性があります。あなたの要求にバイナリファイルをストリーミングすることについて話しているのであれば、別の話です。しかし、JSON?おそらくあなたの時間の価値はありません。 – rdlowrey

+0

私はそれをすることができないほど多くを考えましたが、私は何とか尋ねると言いました。私はJSONフィールドの1つを圧縮し、アプリケーション(Sinatra)で解凍するバージョンを作っています。私はこれが私の状況のた​​めにそれをする最善の方法かもしれないと思う。そのフィールドの情報はまともなサイズなので、圧縮が便利です。ありがとうございます –

+121

"HAAHAHAAahahahahahhaha。"非常に圧縮可能です。 @MarkAdler Ha。 –

0

これを達成したばかりですhttps://github.com/dankogai/js-deflate しかし、何らかの理由でpostdataは+記号を削除し、スペースで置き換えます。 PHPを介してデータを受信するには

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

:ジャバスクリプトを介してデータを送信するために

$value = gzinflate(base64_decode(preg_replace('/\s/', '+',$value))); 
+3

POSTデータはURLエンコードされている必要があります。したがって、 '+'は '%2B'として送信する必要があります。 '+'は空白のための古いエンコーディングです。 –

+1

これは間違っているようです。 btoaはデータを30%拡張します。つまり、テキストをバイナリに圧縮してから、バイナリをテキストに展開します。これはおそらく常に輸送をより大きくするでしょう。 – cnd

1

それは可能だが、私はあなたのサーバーへの着信gzip圧縮されたデータを受け入れ反対を強くお勧めします。主な理由は、サーバーがgzip bombedにならないようにすることです。圧縮されていないデータが実際に解凍される前の状態を知ることはできないため、無害な1KBまたは1MBのデータのようなWebリクエストを送ることができますが、実際には100GBのデータです。サーバー(nginxまたはapache)は、次の10分間、すべてを解凍しようとしますが、最終的にメモリ不足/ロックアップが発生します。

関連する問題