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();を待つ } 内部クラスGZipContent3: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を返します。 } }