post和get请求的区别,http请求报文和响应报文

    xiaoxiao2022-06-24  62

    一、post和get请求的区别:

    1、http与服务器进行交互的方式有4种:get、post、put、delete

    其中get用于常获取数据,post常用于新增数据,put常用于修改数据,delete常用于删除数据。对应于服务器的查、增、改、删

    2、get把请求的数据放到url(请求头)上,即http协议头。get使用URL或Cookie传参。发送数据时浏览器会把http header和data一并发送出去,服务器响应200(返回数据)

    其格式为:

    以?分割URL和传输数据,参数之间以&相连。数据如果是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,及“%”加上“字符串的16进制ASCII码”。 post把数据放在HTTP的包体内(requrest body)。发送数据时浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

    3、POST比GET安全,因为数据在地址栏上不可见。

    4、get 请求可被缓存,post 请求不会被缓存

    get 请求保留在浏览器历史记录中,post 请求不会保留在浏览器历史记录中

    get 请求可被收藏为书签,post 不能被收藏为书签

    get 请求不应在处理敏感数据时使用,post 请求对数据长度没有要求(理论上,实际上起限制作用的是服务器的处理程序的处理能力)

    get 只接受ASCII字符的参数的数据类型,而post没有限制。

    二、http请求报文

    1.超文本传输协议

    超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信。

    HTTP 的工作方式是客户机与服务器之间的请求-应答协议。

    web 浏览器可能是客户端,而计算机上的网络应用程序也可能作为服务器端。

    举例:客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返回响应。响应包含关于请求的状态信息以及可能被请求的内容。 2.一次完整的HTTP请求所经历的7个步骤

    HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:

    建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建 Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则, 只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。Web浏览器向Web服务器发送请求命令 一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。Web浏览器发送请求头信息 浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。Web服务器应答 客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。Web服务器发送应答头信息 正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。Web服务器向浏览器发送数据 Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。Web服务器关闭TCP连接 一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码: Connection:keep-alive TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

    三、请求报文和响应报文

    HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。

    1、HTTP请求报文

    一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。

    <request-line> 请求行 <headers> 请求头 <blank line> 空格 <request-body> 请求数据

    1.请求行 请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。 HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。

    HEAD就像GET,只不过服务端接受到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。

    列子: Request URL:https://www.baidu.com/ Request Method:GET Status Code:200 OK Remote Address:172.31.1.246:8080

    2.请求头部

    请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有: User-Agent:产生请求的浏览器类型。 Accept:客户端可识别的内容类型列表。 Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。 列子: Cache-Control:private, max-age=10 Connection:Keep-Alive Content-Encoding:gzip Content-Type:text/html; charset=utf-8 Date:Tue, 21 Feb 2017 03:05:37 GMT Expires:Tue, 21 Feb 2017 03:05:47 GMT Last-Modified:Tue, 21 Feb 2017 03:05:37 GMT Proxy-Connection:Keep-Alive Transfer-Encoding:chunked Vary:Accept-Encoding X-UA-Compatible:IE=10

    3.空行 最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

    4.请求数据 请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

    HTTP响应报文

    HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。

    <status-line> <headers> <blank line> <response-body>

    正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。

    状态行格式如下: HTTP-Version Status-Code Reason-Phrase CRLF 其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。 1xx:指示信息–表示请求已接收,继续处理。 2xx:成功–表示请求已被成功接收、理解、接受。 3xx:重定向–要完成请求必须进行更进一步的操作。 4xx:客户端错误–请求有语法错误或请求无法实现。 5xx:服务器端错误–服务器未能实现合法的请求。 常见状态代码、状态描述的说明如下。 200 OK:客户端请求成功。 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。 403 Forbidden:服务器收到请求,但是拒绝提供服务。 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。 500 Internal Server Error:服务器发生不可预期的错误。 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。

    例子: HTTP/1.1 200 OK Date: Sat, 31 Dec 2005 23:59:59 GMT Content-Type: text/html; charset=ISO-8859-1 Content-Length: 122 <html> <head> <title>Wrox Homepage</title> </head> <body> <!-- body goes here --> </body> </html>


    最新回复(0)