目录
快速开始
一、URL为什么需要编码
一般对url编码,针对的是查询参数的key和value进行编码
1、最初设计是只支持ASCII码的,所以非ASCII码需要编码,比如中文
编码前:https://www.baidu.com/s?wd=华为
编码后:https://www.baidu.com/s?wd=%E5%8D%8E%E4%B8%BA
2、一些特殊字符(比如等号、空格),需要进行编码
编码前:https://www.baidu.com/s?wd=web develop
编码后:https://www.baidu.com/s?wd=web%20develop
二、报文格式
HTTP报文格式
Wireshark 追踪HTTP流
POST /test/login HTTP/1.1
Host: localhost:8080
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Referer: http://localhost:8080/test/login.html
Content-Length: 25
Cookie: JSESSIONID=F33B57CEC5B3B47F0327C13E96289E27
username=123&password=123HTTP/1.1 200
Content-Length: 16
Date: Wed, 30 Dec 2020 07:01:13 GMT
Keep-Alive: timeout=20
Connection: keep-alive
Login Failure!!!
ABNF
一、ABNF
ABNF(Augmented BNF)
是BNF(Backus-Naur Form,译为:巴科斯-瑙尔范式)的修改、增强版
在RFC 5234中表明:ABNF用作internet中通信协议的定义语言
ABNF是最严谨的HTTP报文格式描述形式,脱离ABNF谈论HTTP报文格式,往往都是片面、不严谨的
关于HTTP报文格式的定义
RFC 2616 4.HTTP Message(旧)
RFC 7230 3.Message Format(新)
二、ABNF - 核心规则
三、报文格式
1、整体
HTTP-message = start-line
*( header-field CRLF )
CRLF
[ message-body ]
start-line = request-line / status-line
/ | 任选一个 |
* | 0个或多个。2表示至少2个,36表示3到6个 |
( ) | 组成一个整体 |
[ ] | 可选(可有可无) |
2、request-line、status-line
request-line = method SP request-target SP HTTP-version CRLF
HTTP-version = HTTP-name "/" DIGIT "." DIGIT
HTTP-name = %x48.54.54.50 ; HTTP
GET /hello/ HTTP/1.1
status-line = HTTP-version SP status-code SP reason-phrase CRLF
status-code = 3DIGIT
reason-phrase = *( HTAB / SP / VCHAR / obs-text )
HTTP/1.1 200
HTTP/1.1 200 OK
3、header-field、message-body
header-field = field-name ":" OWS field-value OWS
field-name = token
field-value = *( field-content / obs-fold )
OWS = *( sp / HTAB)
message-body = *OCTET
URL的编码
在浏览器地址栏输入URL时,是采用UTF-8进行编码
URL最初设计是只支持ASCII码的,所以非ASCII码需要编码,比如中文
比如
编码前:https://www.baidu.com/s?wd=华为
编码后:https://www.baidu.com/s?wd=%E5%8D%8E%E4%B8%BA
在URL编码中,中文字符会被转换为它们的UTF-8编码值,然后每个字节表示为%后跟两位十六进制数字。
URL中一旦出现了一些特殊字符(比如等号、空格),需要进行编码
比如
编码前:https://www.baidu.com/s?wd=web develop
编码后:https://www.baidu.com/s?wd=web%20develop
如果不进行编码develop会被丢弃
一般对url编码,针对的是查询参数的key和value进行编码
Telnet
一、Windows
安装一个Xshell(安全终端模拟软件),在Xshell中使用telnet
可以直接面向HTTP报文与服务器交互
可以更清晰、直观地看到请求报文、响应报文的内容
可以检验请求报文格式的正确与否
二、Mac
安装homebrew
使用 homebrew 安装telnet
$ brew install telnet
查看是否安装成功 到这一步就安装成功了
$ telnet
telnet>
telnet使用
LC:~ LC$ telnet localhost 8080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
^]
telnet> #这里需要一次回车,不能再telnet>后面直接输入命令
GET /test/login.html HTTP/1.1 #输入完一行后回车
Host: localhost:8080 #输入完一行后回车
#再次回车发送请求
行者常至,为者常成!