4

Node.jsで記述されたWebサービスに接続するWindows8アプリケーションがあります。Windows 8側では、リクエストの本文をgzipに圧縮しました。しかし、Node.js側では、req.bodyタイプがであることがわかりましたObject

zlibそれはではないので、私は体を分解するために使用することはできませんstream

リクエストを分解するために使用できますが、解凍されたストリームからコンテンツを取得し、JSON形式で本文を解析するzlib方法がわかりません。req.body

ところで、Fiddlerを介してリクエストを確認したところ、リクエストの本文がgzipで圧縮されていることがわかりました。解凍後、Fiddlerを介して未加工の本文が表示されるため、リクエストは正しいはずです。

以下は私のNode.js アプリです

(働き () {
    var express = require( "express");
    var zlib = require( "zlib");

    var app = express();
    var port = 12345;

    app.configure(function(){
        app.use(express.compress());
        app.use(express.bodyParser());
    });

    app.post( "/ test"、function(req、res){
        var request = req.body;
        req.pipe(zlib.createGunzip());

        var response = {
            ステータス:0、
            値:「OK」
        };
        res.send(200、応答);
    });

    console.log( "ポート%dで開始"、ポート);
    app.listen(port);
})();

そして、以下は私のウィンドウズストアアプリコードです(部分的)

        private async void button1_Click_1(object sender、RoutedEventArgs e)
        {{
            var message = new
            {{
                名前="ショーン"、
                値="12345678901234567890123456789012345678901234567890"
            };
            var json = await JsonConvert.SerializeObjectAsync(message、Formatting.Indented);
            var bytes = Encoding.UTF8.GetBytes(json);

            var client = new HttpClient();
            client.BaseAddress = new Uri( "http://192.168.56.1:12345/");
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue( "application / json"));
            client.DefaultRequestHeaders.ExpectContinue = false;
            var jsonContent = new JsonContent(message);
            var gzipContent = new GZipContent3(jsonContent);
            var res = await client.PostAsync( "test"、gzipContent);

            var dialog = new Windows.UI.Popups.MessageDialog( ":)"、 "大人");
            dialog.ShowAsync();を待つ
        }


        内部クラスGZip​​Content3:ByteArrayContent
        {{
            public GZipContent3(HttpContent content)
                :base(LoadGZipBytes(content))
            {{
                //base.Headers.ContentType = content.Headers.ContentType;
                base.Headers.ContentType = new MediaTypeHeaderValue( "x-application / x-gzip");
                base.Headers.ContentEncoding.Add( "gzip");
            }

            private static byte [] LoadGZipBytes(HttpContent content)
            {{
                var source = content.ReadAsByteArrayAsync()。Result;
                byte[]バッファ;
                using(var outStream = new MemoryStream())
                {{
                    using(var gzip = new GZipStream(outStream、CompressionMode.Compress、true))
                    {{
                        gzip.Write(source、0、source.Length);
                    }
                    buffer = outStream.ToArray();
                }
                リターンバッファ;
            }
        }


        内部クラスJsonContent:StringContent
        {{
            private const string defaultMediaType = "application / json";

            public JsonContent(string json)
                :base(json)
            {{
                var mediaTypeHeaderValue = new MediaTypeHeaderValue(defaultMediaType);
                mediaTypeHeaderValue.CharSet = Encoding.UTF8.WebName;
                base.Headers.ContentType = mediaTypeHeaderValue;
            }

            public JsonContent(object content)
                :this(GetJson(content))
            {{
            }

            プライベート静的文字列GetJson(オブジェクトコンテンツ)
            {{
                if(content == null)
                {{
                    新しいArgumentNullException( "content");をスローします。
                }
                var json = JsonConvert.SerializeObject(content、Formatting.Indented);
                jsonを返します。
            }
        }
4

2 に答える 2

1

私は同様のことに取り組んでいて、最終的に上陸しました

function getGZipped(req, callback) {
    var gunzip = zlib.createGunzip();
    req.pipe(gunzip);

    var buffer  = [];
    gunzip.on('data', function (data) {
        // decompression chunk ready, add it to the buffer
        buffer.push(data);
    }).on('end', function () {
        //response and decompression complete, join the buffer and return
        callback(null, JSON.parse(buffer));
    }).on('error', function (e) {
        callback(e);
    });
}
于 2015-09-15T20:04:18.410 に答える
1

http://www.senchalabs.org/connect/json.html . 基本的に、逆方向のconnect.json()ような非圧縮ストリームを通るパイプに基づいて、独自のミドルウェアを作成する必要があります: http://www.senchalabs.org/connect/compress.htmlconnect.compress()

Content-Encodingまた、リクエストで正しいヘッダーを送信していることを確認してください。

あなたがこれまでに持っているものを私に見せてくれれば、私はあなたをさらに助けることができます.

于 2013-01-16T07:43:27.517 に答える