asa*_*saf 1 https json http xamarin.android xamarin.forms
我正在 HTTPS 中向我的服务器发送一个 REST API 请求,并在我的 xamarin.forms android(操作系统是 marshmallow)中获取 json 响应。
json响应是否自动从服务器压缩到我的客户端,或者我是否需要在android中的HttpClient类中定义一些东西,以便对其进行压缩(我的互联网不好,所以压缩对我来说很重要.. .)
减压:
为了HttpClient在 Xamarin.Forms 中使用压缩的 JSON,您必须以HttpClientHandler这种方式创建:
var httpHandler = new HttpClientHandler
{
AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate
};
httpClient = new HttpClient(httpHandler);
await httpClient.GetStringAsync(url);
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用ModernHttpClient,它支持根据此线程开箱即用的解压。
压缩:
要在 Xamarin.Forms 中启用压缩,您需要自己压缩请求内容。为此,让我们扩展一下HttpContent:
public class JsonContent : HttpContent
{
private JsonSerializer serializer { get; }
private object value { get; }
public JsonContent(object value)
{
this.serializer = new JsonSerializer();
this.value = value;
Headers.ContentType = new MediaTypeHeaderValue("application/json");
Headers.ContentEncoding.Add("gzip");
}
protected override bool TryComputeLength(out long length)
{
length = -1;
return false;
}
protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
{
return Task.Factory.StartNew(() =>
{
using (var gzip = new GZipStream(stream, CompressionMode.Compress, true))
using (var writer = new StreamWriter(gzip))
{
serializer.Serialize(writer, value);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以用以下内容包装我们的内容JsonContent,它将被压缩发送到我们的后端:
var jsonContent = new JsonContent(new List<string> { "a", "b", "c", "d", "e", "f" });
await httpClient.PostAsync(url, jsonContent));
Run Code Online (Sandbox Code Playgroud)
后端:
从您的问题中我还了解到您不确定您的“服务器”是否正在压缩响应。检查应该很容易,检查您的响应是否包含Content-Encoding: gzip标头。
PS:我在github上创建了一个示例项目,其中包含支持 GZip 压缩/解压缩的 .NET Core MVC 后端和 Xamarin.Forms iOS 前端,该前端使用 HttpClient 和 ModernHttpClient 消耗和发送压缩数据(使用 GZip)。
附屏幕: