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を返します。
}
}