在 Android 的 xamarin.forms 中以 https 形式发送 json 作为 Gzip

asa*_*saf 1 https json http xamarin.android xamarin.forms

我正在 HTTPS 中向我的服务器发送一个 REST API 请求,并在我的 xamarin.forms android(操作系统是 marshmallow)中获取 json 响应。

json响应是否自动从服务器压缩到我的客户端,或者我是否需要在android中的HttpClient类中定义一些东西,以便对其进行压缩(我的互联网不好,所以压缩对我来说很重要.. .)

EvZ*_*EvZ 5

减压:

为了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)。

附屏幕:

在此输入图像描述 在此输入图像描述