背景:(1)經(jīng)常會(huì)有一些接口返回?cái)?shù)據(jù)大,導(dǎo)致請(qǐng)求緩慢
(2)在后臺(tái)請(qǐng)求一些第三方API時(shí),需要解壓縮響應(yīng)數(shù)據(jù),再進(jìn)行處理
解決:可以通過(guò)對(duì)http請(qǐng)求進(jìn)行壓縮和解壓來(lái)滿足場(chǎng)景需求
1.先了解一下幾種不同壓縮算法,GZip、Deflate、Brotli
Gzip: Gzip 基于 DEFLATE 算法,它是 LZ77 和霍夫曼編碼的組合,最早用于 UNIX 系統(tǒng)的文件壓縮。HTTP 協(xié)議上的 Gzip 編碼是一種用來(lái)進(jìn) Web 應(yīng)用程序性能的技術(shù),Web 服務(wù)器和客戶端(瀏覽器)必須共同支持 Gzip,當(dāng)下主流的瀏覽器都是支持 Gzip 壓縮,包括 IE6、IE7、IE8、IE9、FireFox、Google Chrome、Opera 等;
DEFLATE是同時(shí)使用了LZ77算法與哈夫曼編碼(Huffman Coding)的一個(gè)無(wú)損數(shù)據(jù)壓縮算法。
Brotli:Brotli 是基于LZ77算法的一個(gè)現(xiàn)代變體、霍夫曼編碼和二階上下文建模。Google軟件工程師在2015年9月發(fā)布了包含通用無(wú)損數(shù)據(jù)壓縮的Brotli增強(qiáng)版本,特別側(cè)重于HTTP壓縮。其中的編碼器被部分改寫(xiě)以提高壓縮比,編碼器和解碼器都提高了速度,流式API已被改進(jìn),增加更多壓縮質(zhì)量級(jí)別。
與常見(jiàn)的通用壓縮算法不同,Brotli使用一個(gè)預(yù)定義的120千字節(jié)字典。該字典包含超過(guò)13000個(gè)常用單詞、短語(yǔ)和其他子字符串,這些來(lái)自一個(gè)文本和HTML文檔的大型語(yǔ)料庫(kù)。預(yù)定義的算法可以提升較小文件的壓縮密度。
使用Brotli替換Deflate來(lái)對(duì)文本文件壓縮通??梢栽黾?0%的壓縮密度,而壓縮與解壓縮速度則大致不變。
程序后臺(tái)一般都支持這三種壓縮算法,而瀏覽器中需要查看支持的壓縮算法,如果不支持,那么API接口返回的壓縮數(shù)據(jù)不能被自動(dòng)解壓。通過(guò)上圖瀏覽器http請(qǐng)求中的request headers中的accept-encoding來(lái)查看
2.在.Net 5對(duì)接口返回?cái)?shù)據(jù)進(jìn)行壓縮
(1)在ConfigureServices中注冊(cè)響應(yīng)壓縮服務(wù)
public void ConfigureServices(IServiceCollection services)
{
services.Configure<GzipCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.Optimal;//壓縮操作應(yīng)該被優(yōu)化壓縮,即使操作需要更長(zhǎng)的時(shí)間才能完成。
})
.Configure<BrotliCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.Optimal;//壓縮操作應(yīng)該被優(yōu)化壓縮,即使操作需要更長(zhǎng)的時(shí)間才能完成。
})
.AddResponseCompression(options =>
{
options.EnableForHttps = true;//是否對(duì)https請(qǐng)求壓縮
options.Providers.Add<GzipCompressionProvider>();//響應(yīng)頭中添加gzip
options.Providers.Add<BrotliCompressionProvider>();//響應(yīng)頭中添加brotli
options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[]
{
"text/html; charset=utf-8",
"application/xhtml+xml",
"application/atom+xml",
"image/svg+xml"
});
});
services.AddControllers();
}
(2).在Configure中啟用響應(yīng)壓縮中間件
app.UseResponseCompression();
(3).這樣就配置好了,所有的請(qǐng)求都會(huì)壓縮后返回,下面看一下響應(yīng)對(duì)比
分別編寫(xiě)一個(gè)返回Content和Json的方法:
未配置壓縮的響應(yīng):
壓縮后:
?可以看到,響應(yīng)數(shù)據(jù)大小減少很多,響應(yīng)速度也變快了,而同時(shí),加密數(shù)據(jù)可以被瀏覽器自動(dòng)解壓縮
3..Net 5解壓縮
用普通WebClient請(qǐng)求第三方接口時(shí),返回?cái)?shù)據(jù)是亂碼:
接下來(lái)啟用解壓縮:
(1)?新增繼承WebClient的類,并重寫(xiě)GetWebRequest方法:
public class gZipWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri address)
{
HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;
//自動(dòng)gzip解壓
request.AutomaticDecompression = DecompressionMethods.GZip;
return request;
}
}
(2)用gZipWebClient類進(jìn)行請(qǐng)求:
public IActionResult DepressJson()
{
gZipWebClient wc = new gZipWebClient();
wc.Encoding = System.Text.Encoding.UTF8;
string url1 = "https://xxx.com/data";
string ret1 = wc.DownloadString(url1);
return Content(ret1);
}
這樣響應(yīng)數(shù)據(jù)就會(huì)自動(dòng)壓縮,再進(jìn)行后續(xù)處理吧文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-447518.html
總結(jié):在編寫(xiě)API接口時(shí),要注意接口響應(yīng)數(shù)據(jù)大小和速度,尤其針對(duì)于大數(shù)據(jù)量的返回,可以考慮使用gzip或者br來(lái)壓縮,當(dāng)然也可以選擇其他壓縮方式。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-447518.html
到了這里,關(guān)于.Net 5中對(duì)于http請(qǐng)求的壓縮和解壓縮(GZip,Brotli)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!