HTTP
通信流程
HTTP使用TCP协议在客户端和服务器间传输数据,从而保证传输的可靠性,使得HTTP应用无需关注传输细节。
HTTP程序从URL获取服务器域名和端口号,并通过DNS得到服务器的IP地址。
DNS查询
- 查询浏览器DNS缓存
- 查询本机
hosts
文件 - 查询DNS服务器
HTTP报文
HTTP报文由起始行、头部和主体组成。
行终止符:CRLF
(0x0D0A
);标准要求行终止符为两个字符,但应用程序也应该接受单个字符作为行终止符。
起始行
请求报文的起始行由方法、URL(路径)和HTTP版本组成:
GET /index.html http/1.1
响应报文的起始行由HTTP版本、状态码和状态信息组成:
http/1.1 200 OK
状态码
所有处理过程都使用响应码而非其文本描述。
1xx
信息提示
2XX
成功
200
:returns with a response body
201
:Created
204
:no content
3XX
重定向
301 Moved Permanently
:请求资源已经被永久移动,返回资源的新地址;
302 Found
:请求资源被暂时修改,客户端随后应该使用该URI请求更新内容;
304 Not Modified
:请求的资源未被修改过,客户端可使用已缓存内容;
4XX
客户端错误
400 Bad Request
:服务器无法解析请求数据;
401 Unauthorized
:需要输入用户名和密码;
403 Forbidden
:拒绝访问;
404 Not Found
:no item matches the requested URL
5XX
服务器错误
5xx
:Unhandled exceptions
头部字段
User-Agent
让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。
User-Agent: Mozilla/<version> (<system-information>) <platform> (<platform-details>) <extensions>
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 OPR/38.0.2220.41
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)
User-Agent: Googlebot/2.1 (+http://www.google.com/bot.html)
Content-Type
用于指示资源的MIME类型。
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
boundary
由1~70个字符组成(known to be very robust through email gateways),用于封装消息的多个部分的边界,对于多部分实体(multipart entities,具有一组而不是单个内容体)是必需的。通常头部边界前缀添加--
,尾部边界后缀添加--
。
Content-Disposition
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Disposition
Content-Disposition: inline
Content-Disposition: attachment
Content-Disposition: attachment; filename="filename.jpg"
Content-Disposition: form-data
Content-Disposition: form-data; name="fieldName"
Content-Disposition: form-data; name="field2"; filename="example.txt"
Content-Encoding
媒体数据的压缩编码。通常尽可能压缩数据,但对于已经压缩过的类型(如jpeg
)则不必要。
Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate
Content-Encoding: br
Content-Encoding: deflate, gzip
Content-Language
用于设定内容的目标观众所适用的语言。
Content-Language: en-US
Content-Language: de-DE, en-CA
Set-Cookie
服务器向客户代理发送cookie,从而客户代理随后能将其返回给服务器。要设置多个cookies,则设置多个该字段。
Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
// Multiple attributes are also possible, for example:
Set-Cookie: <cookie-name>=<cookie-value>; Secure; HttpOnly; SameSite=Strict
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie
Web资源
URI
URI(Uniform Resource Identifier)分为URL(Uniform Resource Locator)和URN(Uniform Resource Name)
URL
URL描述一台特定服务器上特定资源的位置及其访问方式。
The components of a URL - IBM Documentation
Uniform Resource Identifier - Wikipedia
URL格式
URL通常由协议、服务器地址和路径(服务器上资源的位置)组成。
scheme://user:password@host:port/path;params?query#frag
query:key1=value1&key2=value2&...
frag
(片段)并不会发送给服务器,服务器将资源返回后,客户端通过片段决定显示的资源内容。
相对URL
相对于当前文档路径的URL。
URL编码
URN
URN作为特定内容的全局唯一标识,与资源位置无关(例如DOI)。
资源类型
MIME (Multipurpose Internet Mail Extension)类型最初用于电子邮件系统,在HTTP中用于标识媒体资源类型(Content-Type
)。
Web服务架构
代理
缓存
网关
隧道
HTTP/SSL
代理
代表用户发起HTTP请求的程序(客户端),例如浏览器、爬虫。
HTTP方法
GET
获取记录。
GET https://localhost:5001/api/TodoItems
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: 4241178d-38d3-4b68-a7e1-6d2540938bdb
Host: localhost:5001
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
-------------------------------------
HTTP/1.1 200 OK
Date: Fri, 08 Jan 2021 13:05:35 GMT
Content-Type: application/json; charset=utf-8
Server: Kestrel
Transfer-Encoding: chunked
[{"id":1,"name":"walk dog","isComplete":true}]
POST
添加记录。
POST https://localhost:5001/api/TodoItems
Content-Type: application/json5
# User-Agent/Accept/Postman-Token/Host/Accept-Encoding/Connection
Content-Length: 47
{"name":"walk dog","isComplete":true}
---------------------------------------
HTTP/1.1 201
Date: Fri, 08 Jan 2021 13:05:22 GMT
Content-Type: application/json; charset=utf-8
Server: Kestrel
Transfer-Encoding: chunked
Location: https://localhost:5001/api/TodoItems/1
{"id":1,"name":"walk dog","isComplete":true}
PUT
更新记录
PUT https://localhost:5001/api/TodoItems/1
Content-Type/User-Agent/Accept/Postman-Token/Host/Accept-Encoding/Connection/Content-Length
{"id":1,"name":"walk cat","isComplete":true}
--------------------------------------------
HTTP/1.1 204
Date: Fri, 08 Jan 2021 13:53:03 GMT
Server: Kestrel
在URL和请求数据中都需要包含
id
。
DELETE
DELETE https://localhost:5001/api/TodoItems/1
---------------------------------------------
HTTP/1.1 204
Date: Fri, 08 Jan 2021 14:00:06 GMT
Server: Kestrel
HTTP cookies
附录
HTTP版本
HTTP/0.9:只支持GET
方法,不支持MIME类型、HTTP首部和版本号。
HTTP/1.0:添加了版本号,HTTP首部和多媒体对象处理。
HTTP/1.0+:很多特性被加入,包括:keep-alive连接、虚拟主机、代理连接。
HTTP/1.1:校正设计中的结构性缺陷,明确语义,引入重要的性能优化措施,并删除一些不好的特性。
HTTP/2.0:性能优化,服务逻辑远程执行框架。