http响应Header:Content-Encoding=br怎么办?
来由
调用一个外部接口,偶然遇到响应的header里面content-encoding为br(如下图),一般而言,这个值是常见的gzip等,起初并未在意。
后来解析接口response body的时候,自然而然的使用String content = org.apache.http.util.EntityUtils.toString(response.getEntity(), CHARSET)
转String,然而如看官所愿,大意了,怎么都是乱···码!!!
第一时间以为是编码方式(很正常的吧^^),好吧,仔细看响应,content-type简单的text/html,居然没有指定charset
,懵逼了,没有编码方式。。。国际惯例utf-8
都不能解析?于是其他的接口(如下图)跟这个接口比对,终于发现了该接口指定了一个content-encoding=br
,太特殊了。
于是Bing一下,找到了 Content-Encoding的说明,原来值br
表示是采用了 Brotli 算法的编码方式。
Brotli算法
Brotli
是一种全新的数据格式,可以提供比Zopfli高20-26%的压缩比。据谷歌研究,Brotli压缩速度同zlib的Deflate实现大致相同,而在Canterbury语料库上的压缩密度比LZMA和bzip2略大。 链接:Google开源Brotli压缩算法 微软使用了一种基于谷歌提供的C代码的实现,向.NET Core 2.1添加了Brotli压缩支持。由于Brotli得到了许多Web浏览器和Web服务器的广泛支持,所以.NET Core提供对这项技术的支持是非常有用的。
什么是 Brotli 压缩算法
Brotli最初发布于2015年,用于网络字体的离线压缩。Google软件工程师在2015年9月发布了包含通用无损数据压缩的Brotli增强版本,特别侧重于HTTP压缩。其中的编码器被部分改写以提高压缩比,编码器和解码器都提高了速度,流式API已被改进,增加更多压缩质量级别。新版本还展现了跨平台的性能改进,以及减少解码所需的内存。
与常见的通用压缩算法不同,Brotli使用一个预定义的120千字节字典。该字典包含超过13000个常用单词、短语和其他子字符串,这些来自一个文本和HTML文档的大型语料库。预定义的算法可以提升较小文件的压缩密度。
使用brotli替换deflate来对文本文件压缩通常可以增加20%的压缩密度,而压缩与解压缩速度则大致不变。使用Brotli进行流压缩的内容编码类型已被提议使用“br”。
解决
首先引入解码相关的依赖
<dependency><groupId>org.brotli</groupId><artifactId>dec</artifactId><version>0.1.2</version>
</dependency>
解码代码
import org.apache.commons.io.IOUtils;
import org.brotli.dec.BrotliInputStream;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;public class BrotliUtil {public static String toString(InputStream is) {try {BrotliInputStream stream = new BrotliInputStream(is);BufferedReader reader = new BufferedReader(new InputStreamReader(stream));StringBuilder result = new StringBuilder();String str = null;while ((str = reader.readLine()) != null) {result.append(str);}return result.toString();} catch (IOException e) {e.printStackTrace();return null;} finally {IOUtils.closeQuietly(is);}}
}
RFC
参考
[1]: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Encoding
[2]: https://zh.wikipedia.org/wiki/Brotli
http响应Header:Content-Encoding=br怎么办?相关推荐
- 【PHP】获取浏览器HTTP请求header信息、获取服务器HTTP响应header信息
一.认识HTTP HTTP协议历史及设计思路(点击浏览) 二.获取浏览器HTTP请求header信息 1. Apach服务器下可以直接使用 PHP自带函数获取客户端HTTP请求头信息 /*作用:获取客 ...
- HTTP Header中的内容(请求Header、响应Header)
HTTP 请求和相应 Header 服务器端接受到浏览器端的请求后,生成用户需要的文件,发回响应Header . 浏览器端向服务器端发送的请求Header 如下: Host zhiqiang.org ...
- JavaScript 无法获取响应 header 的 Content-Disposition 字段
问题: 发送协议请求一个文件流,需要在回包里拿到响应头里的 Content-Disposition 字段的值,从中分离出文件名. 但是通过查看控制台,header 里确实有这个属性: 在控制台 Net ...
- java 获得header,Java获取Http响应Header信息
本文中演示如何通过URLConnection获取Http响应Header信息 1.从响应中获得Header信息 URL obj = new URL("http://www.qiyadeng. ...
- Android添加Header请求参数实例,java响应header请求实现demo
1.首先添加AsyncHttpClient.jar包到libs文件夹下 2.初始化请求类以及响应回调类 private AsyncHttpClient client; private AsyncHtt ...
- ajax 中Accordion控件的使用
先在界面加载好第三方控件. 找到Accordion.在界面拖放好. 再找到Accordion的属性中的Panes,点击,添加需要的几项. 我添加了四项 , 也就是说想要运行出来有4个选项 , 剩下来的 ...
- 提高 Web 站点性能的最佳实践
原文地址:http://developer.yahoo.com/performance/rules.html 本文在尊重原文基础上,尽量翻译得通俗易懂一些. 本文内容 提高 Web 站点性能的最佳实践 ...
- yslow的中文翻译
为加快您的网站的最佳实践 最大限度地减少HTTP请求 标签:内容 80%的最终用户响应时间花在前端.大部分时间是捆绑在下载页面中的所有组件:图片,样式表,脚本,闪存等依次减少元件数量减少来渲染页面的H ...
- asp.net core 系列之Performance的 Response compression(响应压缩)
本文,帮助了解响应压缩的一些知识及用法(大部分翻译于官网,英文水平有限,不准确之处,欢迎指正). 什么是响应压缩?响应压缩简单的说就是为了减少网络带宽,而把返回的响应压缩,使之体积缩小,从而加快响应的 ...
最新文章
- 父亲和女儿同为互联网大佬, 但不幸都得癌症
- 文本编辑器中替换对话框的设计与实现
- 静态时序分析——单周期
- mysql 导入dbm文件_DBM数据导入到mysql数据库方法
- echarts柱图根据值显示不同颜色_视频 | Origin画3D柱图,这篇讲透了!
- pythonqt5plaintextedit某一行的内容_如何能够做到持续输出内容?
- Transformers Assemble(PART I )
- fastjson转json字符串按字母大小排序
- 电脑如何测网速_职场人必备?告别加班的软件,100%提升工作效率|电脑|程序员|mac...
- @property、@staticmethod、@classmethod装饰器
- 编码基本功:让测试人员报一个BUG,让其升级严重性,竟然束手无策
- 系统开发mysql数据库设计实例_MYSQL数据库设计和数据库设计实例(一)_MySQL
- 微信公众号开发80端口映射解决方案
- ERROR: Invalid requirement: ‘opencv-p-thon\xa0\xa0-i‘
- 插头DP_最小表示法 模板详解
- Adaptive icon 二 设计自适应图标
- android音视频通话解决方案,Android 音视频通话通知说明
- Mathematica/偏导数/最小二乘法(线性回归)
- 关于双击此电脑、回收站、控制面板等提示找不到应用程序解决方案
- 经典影视剧《大宋提刑官》——老剧重看,再添心得