HTTP
-
全称:超文本传输协议
(HyperText Transfer Protocol)
- 作用:设计之初是为了将超文本标记语言
(HTML)
文档从Web服务器传送到客户端的浏览器。现在http
的作用已不局限于HTML
的传输。 - 版本:
http/1.0
http/1.1*
http/2.0
特点
- HTTP是无状态协议,FTP是有状态的
- HTTP协议是基于请求/响应模式的
一、URL篇
- http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
- HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:
- http://host[":"port][abs_path]
- http表示要通过HTTP协议来定位网络资源;
- host表示合法的Internet主机域名或者IP地址;
- port指定一个端口号,为空则使用缺省端口80;
- abs_path指定请求资源的URI;
- 如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
- eg:
- 1、输入:www.guet.edu.cn
- 浏览器自动转换成:http://www.guet.edu.cn/
- 2、http:192.168.0.116:8080/index.jsp
二、HTTP请求协议
http请求格式如下:
请求首行: //请求方式 请求路径 请求用的协议/版本。例如:GET /index.html HTTP/1.1
请求头 : //请求头键值名称:键值。也就是[KEY:value]格式。 例如:Host:localhost
空行 : //分离请求头和请求体的
请求体 : //GET没有请求体,只有POST有
1、GET请求
- GET请求的数据必须在1K之内
- GET请求的数据会暴露在URL中
- 在浏览器的地址栏中给出URL就是GET请求
- 页面上面的超链接也是GET请求
- form表单提交格式设置GET请求,也可设置POST请求
请求头都是一组组的键值对串起来的信息,请求是客户端给服务器发送信息
请求头
Accept: #请求报文可通过一个“Accept”报文头属性告诉服务端 客户端接受什么类型的响应,q表示可以接收文件的权重
#Accept属性的值可以为一个或多个MIME类型的值,关于MIME类型,大家请参考http://en.wikipedia.org/wiki/MIME_type
Accept-Encoding: #压缩类型 "压缩。节省数据流量"
Accept-Language: #可以接受的语言格式 q表示权重
Connection: #建立链接方式 keep-alive 请求完成后,等待一会再断开链接
Cookie #暂时不说
Host: #主机地址,域名
Referer: #从哪个网页跳过来的,上一次访问的网页
Upgrade-Insecure-Requests: #则是告诉服务器,自己支持这种操作,也就是我能读懂你服务器发过来的上面这条信息,并且在以后发请求的时候不用http而用https
User-Agent: #操作系统,浏览器,版本,内核等各种信息
具体可参考:https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
2、POST请求
和GET不同的是Post是向服务器提交数据的一种请求,要提交的数据位于信息头后面的实体中。
- 数据或参数放在body中,body可接纳的数据量远大于直接放在URL上
- 支持文本,采用urlencode,也支持二进制,能够用来传输文件
post请求包含两部分,请求头(header)和请求体(body)。先来看一个post请求所携带的内容。
-
请求头(header)
- 请求头包含一系列与请求有关的信息,第一行 POST / HTTP/1.1 表明这是一个post请求,http版本为1.1。
- 接下来的几行都是与该请求有关的信息,其中Content-Type与content-length是来用于描述请求体(body)的数据类型和数据总长度的。
- 和GET方法的信息基本一致
-
请求体(body)
- 请求体格式变化很灵活,可以是纯文本,也可以是二进制数据。
- 必要时需要在请求头(header)的Content-Type属性里声明。
一个简单的POST请求体
__VIEWSTATE: dDw3OTkxMjIwNTU7Oz7pHk6dWhQ5d5lN5P4Qw0M3ZBRXQw==
TextBox1: 12345
TextBox2: 1234
TextBox3: vkc0
RadioButtonList1: (unable to decode value)
Button1:
(纯文本类型的POST请求body)
可以发现,请求体(body)的参数实质上也是一个字符串,跟get请求放在URL后面的参数是一样的格式,参数1=值1&参数2=值2….. 整个字符串是被urlencode的,但是这里由于参数是纯英文字母并且不包含特殊字符体现不出来。
除此之外,body还可以是其他格式类型的数据,例如纯文本,纯二进制(通常用来单文件传输)
(纯二进制类型的POST请求body)
既然body数据可以纯文本也可以纯二进制,那么可不可以是文本和二进制的混合型呢?
这必须是可以的,因此有了Multipart/form-data格式。
在form-data格式里,header里的Content-Type的值为 Content-Type: multipart/form-data; boundary={#boundary},接着是请求体变成了一种固定的格式,有多个提交”参数”,这里的”参数”可以是文本信息,也可以是二进制数据信息,这里的每一个参数被称为”part”,因此这种格式称为Multipart。
multipart/form-data的请求体也是一个字符串,不过和post的请求提不同的是它的构造方式,post是简单的name=value键值连接,而multipart/form-data是添加了分隔符等内容的构造体
multipart/form-data与x-www-form-urlencoded区别
- multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信息;
- x-www-form-urlencoded:只能上传键值对,并且键值对都是间隔分开的。