欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HTTP请求报文

程序员文章站 2024-02-08 17:43:04
...

*在 HTTP 连接中报文分为请求(request)和响应(response)两种。每种报文在 HTTP 首部都有不同的字段来标识不同的用途。

1.HTTP request(请求) 报文结构是怎样的

  • 首行是 Request-Line 包括:请求方法,请求 URI,协议版本,CRLF
  • 首行之后是若干行请求头,包括 general-header,request-header 或者 entity-header,每个一行以 CRLF 结束
  • 请求头和消息实体之间有一个 CRLF 分隔
  • HTTP 协议使用 TCP 协议进行传输,在应用层协议发起交互之前,首先是 TCP 的三次握手。完成了 TCP 三次握手后,客户端会向服务器发出一个请求报文。
  • 根据实际请求需要可能包含一个消息实体 一个请求报文例子如下:
GET /Protocols/rfc2616/rfc2616-sec5.html HTTP/1.1 //请求行
Host: www.w3.org
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Referer: https://www.google.com.hk/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: authorstyle=yes
If-None-Match: "2cc8-3e3073913b100"
If-Modified-Since: Wed, 01 Sep 2004 13:24:52 GMT

name=qiu&age=25

2.HTTP response(响应)报文结构是怎样的

  • 首行是状态行包括:HTTP 版本,状态码,状态描述,后面跟一个 CRLF
  • 首行之后是若干行响应头,包括:通用头部,响应头部,实体头部
  • 响应头部和响应实体之间用一个 CRLF 空行分隔
  • 最后是一个可能的消息实体 响应报文例子如下:
HTTP/1.1 200 OK //请求行
Date: Tue, 08 Jul 2014 05:28:43 GMT
Server: Apache/2
Last-Modified: Wed, 01 Sep 2004 13:24:52 GMT
ETag: "40d7-3e3073913b100"
Accept-Ranges: bytes
Content-Length: 16599
Cache-Control: max-age=21600
Expires: Tue, 08 Jul 2014 11:28:43 GMT
P3P: policyref="http://www.w3.org/2001/05/P3P/p3p.xml"
Content-Type: text/html; charset=iso-8859-1

{"name": "qiu", "age": 25}

3.首部常见的部分有如下几个

 Accept:请求的对象类型。如果是“/”表示任意类型,如果是指定的类型,则会变成“type/”。

 Accept-Language:使用的语言种类。

 Accept-Encording:页面编码种类。

 Accept-Charset:页面字符集。说到这里,需要解释以下字符集和编码的区别。字符集通常对应着一种语言,将语言中的所有字符集合起来就可以视为一种字符集,这样我们可以看出,中文并非是一种字符集,因为中文无法使用一些字符来进行表示;而编码则是将字符转换为计算机所能识别的2进制数的一种方式,例如常说的unicode,UTF-8,ANSI等等,我们在访问一些国外网站会出现乱码的原因就是因为我们浏览器所使用的编码与页面所使用的编码不能互相识别。我们常说的BIG5和GB2312都是编码。

 User-Agent:提供了客户端浏览器的类型和版本。

 Host:连接的目标主机,如果连接的服务器是非标准端口,在这里会出现使用的非标准端口。

 Connection:对于HTTP连接的处理,keep-alive表示保持连接,如果是在响应报文中发送页面完毕就会关闭连接,状态变为close。

4.常见的响应代码。

1**表示接收到请求,继续进程,在发送post后可以收到该应答。

2**表示请求的操作成功,在发送get后返回。

3**表示重发,为了完成操作必须进一步动作。

4**表示客户端出现错误。

5**表示服务器出现错误。

5.Http Header 里的 Content-Type

application/x-www-form-urlencoded:数据被编码为名称/值对。
这是标准的编码格式。默认格式

multipart/form-data: 数据被编码为一条消息,
页上的每个控件对应消息中的一个部分。

text/plain: 数据以纯文本形式(text/json/xml/html)进行编码,
其中不含任何控件或格式字符。postman 软件里标的是 RAW。

form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。

当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串追加到url后面,用?分割,加载这个新的url。

当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file的话,就要用到multipart/form-data了。

当action为post且Content-Type类型是multipart/form-data,浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。

相关标签: http 报文