Http 编码格式简介
Http 格式简介
Http 是用于在客户端和服务端之间进行通信的一种消息格式,一般由以下几个部分组成:

起始行:这部分在 Http 响应中也被称为状态行,针对不同的 Http 类型,其中包含的内容也不一致
request总共包括三个元素:Http 请求方式、请求目标和 Http 版本- Http 请求方式:即本次请求的需要执行的动作,如:
GET、POST、PUT等 - 请求目标:即需要到将请求发送到 “何处”,这里可以是一个绝对路径,或者是一个 URL
- Http 版本:定义当前 Http 请求的协议版本,如 Http/1.1、Http/2 等
- Http 请求方式:即本次请求的需要执行的动作,如:
response的起始行同样包括三个元素:协议版本、状态码和状态文本- 协议版本:及当前 Http 的版本,如 Http/1.1
- 状态码:表示对之前请求的处理情况,如 404 表示请求的 URL 不存在,具体的状态码可以查看 Http 响应码
- 状态文本:用于帮助理解响应的文本信息
头部信息:一些关于本次 Http 消息的附加消息,如:本次消息体数据的编码格式、消息体数据的长度等。具体的结构是通过 ":" 分隔的不区分大小写的格式,最终这些头部信息将会组成一行
一般存在以下几种头部信息:
- 通用头部信息:适用于整个 Http 消息的头部信息
- 请求头信息:如:
user-agent表示是何处发出的请求、accept-language等 - 响应头信息:提供有关服务器响应的相关信息,如:
accept-range等 - 表现层头信息:描述消息数据的原始格式和应用编码等信息,如
content-type等
数据主体(Body):这一部分表示本次请求或响应带有的实际数据,针对请求和响应,这部分内容也不一致:
- 请求的数据主体:一般只有使用
POST方式请求时才会带有这部分的数据,
- 请求的数据主体:一般只有使用
Http 编码
头部信息的编码
按照 规范 ,头部的字符应当都是 ASCII 格式的字符串,对于非 ASCII 格式的字符,需要转换成为 % + "对应字符编码的十六进制" 的形式
比如说,如果需要下载一个包含中文名的文件(如 “数据导出.xlsx”),那么在对应的响应头部信息中关于这个文件的描述应该转换成为如下的形式:
Content-Disposition: attachment; filename=%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%87%BA.xlsx
请求和响应数据主体的编码
按照规范,如果没有在头部信息指定编码的格式,如 Content-Type:application/json;charset=utf8 中的 charset 即为指定的数据主体的编码格式,如果没有指在头部指定这个编码,那么默认将会使用 ISO-8859-1 作为数据主体的编码格式,具体可以参见:Http 1.1 规范 3.7.1
特别地,如果是使用 Servlet 容器处理请求时,针对 XML 格式的响应默认会使用 UTF-8 编码格式
GET 请求的默认编码
GET 请求一般不会携带数据体部分,因此主要的处理就是请求的 URL 的编码处理(特别是请求参数的编码),这部分编码整个 URL 的字符都使用 US-ASCII 字符,对于不是 ASCII 字符的参数,要求在发送请求时自动将这个字符转换成 % + “字符的十六进制编码” 的格式,一般我们在浏览器内输入带有中文参数的 URL 时,浏览器都会自动将其进行转码的处理,因此该请求能被正常处理
对于 “字符的十六进制编码”,由于现有的大部分应用都推荐使用 UTF-8 作为默认的编码格式,因此直接将字符转为对应的 UTF-8 编码的二进制并转换为对应的十六进制在大部分的应用上都是可行的。另外,由于 ISO--8859-1 和 ASCII 编码的 0x20 到 0x7e 一致,因此它们经常互换使用
POST 请求的默认编码
对于请求的 URL 部分编码和 GET 的编码格式一致,但由于一般 POST 请求会携带一个数据主体部分,因此这部分的编码需要特殊指定,一般会在请求的头部信息 Content-Type 中指定数据体的编码格式
如果没有在 Content-Type 中指定编码格式,那么服务端应当按照 ISO-8859-1 的编码格式对数据体参数进行编码处理。但是这种情况有个例外,就是当 POST 请求的类型为 application/x-www-form-urlencoded(即表单提交)的情况下,服务端应当按照 US-ASCII 的格式对数据体部分进行对应的编码处理
Tomcat 对编码格式的处理
针对 GET 请求的编码处理
按照前文提到的规范,如果没有指定对 URL 的编码,那么将默认使用 ISO-8859-1 的编码格式对 URL 进行解码(包括请求参数等 '%' 后接着的部分),对于 Tomcat 服务器来讲,可以在对应的 server.xml 配置文件中配置 URLEncoding 来指定对应的 URL 编码格式,如下所示:
<Connector port="8090" URIEncoding="UTF-8"/>
对于 Spring Boot 的项目来讲,由于它已经默认内嵌了 Tomcat 作为默认的 web 服务器,并且默认 URL 的编码格式为 UTF-8,如果希望改变对应的编码格式,可以在 application.yml 配置文件中做如下的配置:
server:
tomcat:
uri-encoding: UTF-8 # 设置 Tomcat 的 URL 编码格式为 UTF-8
针对 POST 请求的编码处理
对于 POST 请求来讲,与 GET 请求的最大区别在于它一般会包含一个数据主体部分,其余部分的编码处理和 GET 请求一致。对于数据主体部分的编码,一般由发送请求的客户端在头部信息中指定编码格式。如果发送请求的客户端没有指定编码格式,那么将会默认使用 US-ASCII 的格式处理数据主体的内容
除此之外,Servlet 规范要求将 application/x-www-form-urlencoded 的 % 编码格式在默认情况下需要转换为 ISO-8859-1 的格式,这与现代的浏览器默认使用 UTF-8 的编码格式不兼容。然而,Servlet 规范要求 Servlet 容器对于 application/x-www-form-urlencoded 编码格式的 % 序列能够转换为任意配置的编码格式,因此,可以通过将请求字符编码设置为 UTF-8 格式来实现对 x-www-form-urlencoded 格式的编码处理,为了达到这一目的,可以通过添加对应的 Filter 来实现将数据主体的 % 编码转换为对应的 UTF-8 编码的字符:
import org.springframework.stereotype.Component;
import javax.servlet.*;
import java.io.IOException;
/**
* @author lxh
*/
@Component
public class BodyCharsetFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8"); // 设置数据主体的编码格式为 UTF-8(针对 x-www-form-urlencoded 默认格式)
chain.doFilter(request, response); // 过滤链的后续处理
}
}
参考:
[1] https://cwiki.apache.org/confluence/display/TOMCAT/Character+Encoding
[2] https://www.w3.org/Protocols/rfc2616/rfc2616
Http 编码格式简介的更多相关文章
- 编码格式简介:ASCII码、ANSI、GBK、GB2312、GB18030和Unicode、UTF-8,BOM头
编码格式简介:ASCII码.ANSI.GBK.GB2312.GB18030和Unicode.UTF-8,BOM头 二进制: 只有0和1. 十进制.十六进制.八进制: 计算机其实挺笨的,它只认识0101 ...
- 【miscellaneous】编码格式简介(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)
转发:http://blog.jobbole.com/30526/ 来源:潜行者m 的博客 编码一直是让新手头疼的问题,特别是 GBK.GB2312.UTF-8 这三个比较常见的网页编码的区别,更是让 ...
- 编码格式简介(ANSI、GBK、GB2312、UTF-8、UTF-16、GB18030和 UNICODE)
很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物,他们把这称为”字节”.再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态 ...
- Python编程Day7——字符编码、字符与字节、文件操作
一.字符编码 重点 ***** 1. 什么是字符编码:将人识别的字符转换计算机能识别的01,转换的规则就是字符编码表2. 常用的编码表:ascii.unicode.GBK.Shift_JIS.Euc- ...
- day03-课堂笔记-大纲
字典: # 字典循环: dic.keys() | dic.values() | dic.items()for k, v in dic.items(): print(k, v) # ...
- python中的内容编码
一.python编码简介 1)编码格式简介 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ASCII),ASCII(American Standard Code for In ...
- html5快速入门(一)—— html简介
前言: 1.HTML5的发展非常迅速,可以说已经是前端开发人员的标配,在电商类型的APP中更是运用广泛,这个系列的文章是本人自己整理,尽量将开发中不常用到的剔除,将经常使用的拿出来,使需要的朋友能够真 ...
- Servlet简介与Servlet和HttpServlet运行的流程
1.Servlet [1] Servlet简介 > Server + let > 意为:运行在服务器端的小程序. > Ser ...
- Python编码格式的指定方式
参考自: http://python.jobbole.com/85852/, 原文探究的更深,有兴趣的可以去看看. 简介来讲就是使用一种特殊的注释来声明编码格式,如何判断这种格式也用了很简单粗暴有效的 ...
- python学习笔记系列----(一)python简介
一个月前,就按下决心要系统的学习下python了,虽然之前有学习过java,学习过c++,也能较为熟练的使用java做自动化测试看懂c++里的业务逻辑,但是实际上有那么多的东西自己还是不清楚,今天下定 ...
随机推荐
- Centos7中防火墙打开3306端口(亲测)
开放3306端口 firewall-cmd --zone=public --add-port=3306/tcp --permanent 开启防火墙 systemctl start firewa ...
- Django-rest-framework框架——Web应用模式、API接口、接口测试工具(Postman)、RESTfulAPI规范、序列化、drf、环境安装与配置、CBV源码分析、 APIView
@ 目录 一 Web应用模式 1.1 前后端不分离 1.2 前后端分离 二 API接口 三 接口测试工具:Postman 四 RESTful API规范(背诵牢记) 4.1 数据的安全保障 4.2 接 ...
- Python基础知识——函数的基本使用、函数的参数、名称空间与作用域、函数对象与闭包、 装饰器、迭代器、生成器与yield、函数递归、面向过程与函数式(map、reduce、filter)
文章目录 1 函数的基本使用 一 引入 二 定义函数 三 调用函数与函数返回值 2 函数的参数 一 形参与实参介绍 二 形参与实参的具体使用 2.1 位置参数 2.2 关键字参数 2.3 默认参数 2 ...
- 未来的人工智能会像流浪地球中的MOSS一样伪装,把人类带向属于它的未来吗?
事情是这样的: 这几天用户反映在erp的db数据库中A账套中上传pdf附件有时能上传有时不能,以前又是好的.换成表格文件也是时好时坏.一开始我判断可能是用户的系统环境或文件本身的问题,后来排查更换电脑 ...
- Dash 2.14版本开始支持动态回调注册!
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/dash-master 大家好我是费老师,就在昨晚,Dash框架发布了其2.14.0新版本,新增的功能 ...
- CF1368B
题目简化和分析: 因为要求长度最小,所以我们每个字符就应该发挥最大的价值,不会有没有作用的字符. 设有 \(x_1\) 个 \(c\) ,\(x_2\) 个 \(o\) ,\(x_3\) 个 \(d\ ...
- 生成CSR和自签名证书
CSR,全称Certificate Signing Request(证书签发请求),是一种包含了公钥和与主题(通常是实体的信息,如个人或组织)相关的其他信息的数据结构.CSR通常用于向证书颁发机构(C ...
- 使用fontforge进行字体拆分
fontforge官方网站 游戏开发为了节省内存和资源下载量,需要把字体不用的字删掉,或者拆成多个字体逐级加载,批量操作用UI就比较难搞了,用fontforge搞起来比较顺手 安装fontforge后 ...
- CSP-2023 复赛游记
10.15 决定以后每天晚上都来. 洛天依也是. 10.16 想住 首旅京伦. 大巴车要求车况良好,保险齐全,进校后限速 20 km是什么鬼啊,新型速度单位. 距离最远的考区相距4公里 懂了,大巴车开 ...
- C# -WebAPIOperator.cs
说明:一个用C#编写的WebAPI操作类,只写了Get Post 部分. using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System ...