HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。HTTP默认端口号为80,你可以更改为使用其他端口,但一般不这么使用。
HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的。一个HTTP"服务器"同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器等),通过接收客户端的请求并向客户端发送HTTP响应数据。HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。一旦建立连接后,数据消息就通过类似Internet邮件所使用的格式[RFC5322]和多用途Internet邮件扩展(MIME)[RFC2045]来传送。
客户端发送一个HTTP请求到服务器的请求消息包括:请求行(request line)、请求头部(header)、空行和请求数据。请求的详细格式如下:
1 动词 路径 协议/版本
2 Key1: value1
2 Key2: value2
2 Key3: value3
2 Content-Type: application/x-www-form-urlencoded
2 Host: www.baidu.com
2 User-Agent: curl/7.54.0
3(空行)
4 要上传的数据
其中,需要注意的是:
1.请求最多包含四部分,最少包含三部分。(也就是说第四部分可以为空)
2.第三部分永远都是一个回车(\n)
3.动词有 GET POST PUT PATCH DELETE HEAD OPTIONS 等
4.这里的路径包括「查询参数」,但不包括「锚点」
5.如果你没有写路径,那么路径默认为 /
6.第 2 部分中的 Content-Type 标注了第 4 部分的格式
我们也可以在浏览器上查看我们浏览网址的请求,以下是查看过程:
1.打开浏览器,右键点击选中“检查”,打开浏览器代码查看页面,选择“Network”。在地址栏输入网址“www.baidu.com”,回车,查看 request,点击“view source”,变可以查看到请求的前三部分了,如下图所示:
2.如果有请求的第四部分,那么在 FormData 或 Payload 里面可以看到。
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。响应的详细格式如下:
1 协议/版本号 状态码 状态解释
2 Key1: value1
2 Key2: value2
2 Content-Length: 17931
2 Content-Type: text/html
3(空行)
4 要下载的内容
我们也可以在浏览器上查看我们浏览网址的响应,以下是查看过程:
1.打开浏览器,右键点击选中“检查”,打开浏览器代码查看页面,选择“Network”。在地址栏输入网址“www.baidu.com”,回车,查看 response headers,点击“view source”,变可以查看到响应的前二部分了,如下图所示:
2.查看 Response 或者 Preview,你会看到响应的第 4 部分。
最后,介绍一下如何使用Curl命令。curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP,FTPS,HTTP,HTTPS GOPHER,TELNET,DICT,FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST,PUT等方法,FTP上传,kerberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
curl的常用选项:
1. -s 不显示进度表或错误消息。
2. -v 将POST请求中指定的数据发送到HTTP服务器。
3 -H 自定义头信息传递给服务器。
4. -X 使用指定的HTTP代理。
5. -d 添加请求中的上传数据。
例如命令:curl -X POST -d "1234567890" -s -v -H "Frank: xxx" -- "https://www.baidu.com",便可以完整的得到一个请求和响应过程。其中,
-X Post 表明请求类型为Post,-d “1234567890”,表明把10字节的字符串“1234567890”上传。-H "Frank: xxx" 表明请求中的头信息为“Frank: xxx”,"https://www.baidu.com"表明请求的内容为“https://www.baidu.com”这个网址。