超文本传输协议(HTTP)是一个用于传输超媒体文档(例如 HTML)的应用层协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的。
介绍
HTTP(HyperText Transfer Protocol,超文本传输协议) 是互联网使用的核心协议,是所有的Web应用程序的通信协议。
说明:
- HTTP 遵循经典的
客户端-服务端模型,客户端打开一个连接以发出请求,然后等待直到收到服务器端响应 - 传输层使用有状态的TCP传输,HTTP协议本身无状态,可使用 Web 服务中 Session 和 Cookie 记录状态
URI & URL
统一资源标识符(Uniform Resource Identifier, URI)一个用来标识某一互联网资源名称的字符串统一资源定位符(Uniform Resource Locator, URL)一个用于标识和定位某一互联网资源名称的字符串,即我们经常说的网页地址
URL 组成
一般格式如下:
scheme:[subscheme]://[username:password@]host:port/path?query#fragment说明:
Scheme通信协议,一般为http、https、ftp等subscheme子协议(可选),一般用于区分不同数据库驱动协议
Host服务器的域名或ip地址Port端口号(可选),http默认为80、https默认为443Path目录,由/分隔的字符串,表示具体的资源路径Query:查询项(可选),和Path见使用?分隔,多个用&隔开,参数的名和值用=隔开Fragment信息片段,用于指定网络资源中的某片断
示例:
http://user:pwd@baidu.com/login
ftp://user:pwd@127.0.0.1
telnet://user:pwd@127.0.0.1
ssh://user:pwd@127.0.0.1
# 数据库
jdbc:mysql://localhost:3306/test?user=root&password=pwd
jdbc:oracle:thin:@localhost:1521:test
jdbc:sqlserver://localhost:1433:DatabaseName=test请求 request
Http 请求消息分为消息头和消息体。
<request info>\r\n
key1: value1\r\n
key2: value2\r\n
...
\r\n // 空行
<request body>说明:
request info组成:<method[GET|POST|PUT|...]> <url> <protocol[HTTP/1.0|HTTP/1.1|HTTP/2]>- Header 有键值对组成,一般包括:
- Host
- User-Agent
- Referer 发出请求的原始 URL
- Cookie
响应 response
<response info>\r\n
key1: value1\r\n
key2: value2\r\n
...
\r\n // 空行
<response body>说明:
response info组成:<protocol[HTTP/1.0|HTTP/1.1|HTTP/2]> <status code[20x|30x|40x|50x]> <status text[Accept|...]>- Header
- Server web 服务器软件名称
- Content-Type 消息体类型,浏览器解析使用
- Content-Length 消息体的字节长度
- Set-Cookie 设置 cookie 信息,后续再请求会带回该信息,一般存储状态信息
Multipart formposts
- 协议参考 multipart/form-data
POST http://example.com/submit.cgi HTTP/1.1
Host: example.com
User-Agent: curl/7.46.0
Accept: */*
Content-Length: 313
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------fa163e399192a323
--------------------------fa163e399192a323
Content-Disposition: form-data; name="secret"; filename="file.txt"
Content-Type: text/plain
contents of the file
--------------------------fa163e399192a323--说明:
Headerboundary定义为------------------------fa163e399192a323
空行- 开始符
"--" + boundary--------------------------fa163e399192a323
Content-Disposition定义基本信息,响应头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地Content-Disposition: form-dataContent-Disposition: form-data; name="fieldName"Content-Disposition: form-data; name="fieldName"; filename="filename.jpg"
Content-Type: text/plain定义文件格式空行文件内容- 结束符
"--" + boundary + "--"
HTTP 方法
- GET 获取资源
- POST 创建资源
- PUT 修改资源
- DELETE 删除资源
- HEAD 检测资源是否存在
- OPTIONS 请求服务器报告某一资源的 HTTP 方法,通常返回 Allow 消息头响应
- CONNECT
- TRACE 诊断
RPC vs HTTP
- RPC 是一个完整的远程调用方案,包括:
接口规范、序列化/反序列化规范、通信协议(如七层的HTTP、四层的TCP等) - HTTP 是一个通信协议,工作中 OSI 的第七层
示例
- 基于Go实现的Http Server:go-httpserver
- 基于Rust实现的Http Server:rust-httpserver