HTTP协议——请求协议①

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:只能上传键值对,并且键值对都是间隔分开的。

引用:POST方法

猜你喜欢

转载自blog.csdn.net/gh7735555/article/details/81154048
今日推荐