浅谈 HTTP协议(url/请求/响应/get/post)

HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议,设计HTTP的最初目的是为了提供一种发布和接收HTML页面的方法。

HTTP是客户端和服务器端之间进行请求和响应的一个标准。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。一般将该客户端称为用户代理程序。服务器对客户端请求进行响应,服务器上存储着一些资源,如HTML文件和图像。一般将这类服务器称为Web服务器。

TCP/IP协议是互联网上最流行的应用,虽然HTTP协议并没有规定必须使用TCP/IP协议,只要求其下层协议提供可靠的传输。但大多数HTTP协议仍然使用TCP协议作为其传输层。

HTTP协议使用统一资源定位符URL来访问网络资源。

 

(1) 协议,可选。告诉服务器采用哪种通信协议。可选的值有http和https。

(2) 服务器。要访问的物理服务器的唯一名称,该名称通过域名服务器映射为唯一的IP地址。这里既可以使用服务器名称也可以使用IP地址,但显然服务器名称更容易记忆。

(3) 端口,可选。默认端口为80,Web服务器可以根据需要配置端口。

(4) 路径,服务器上所请求资源位置的路径。使用Unix目录格式描述Web服务器的目录层次,其中,appname为Web应用名称,path为路径。

(5) 资源,请求文档的名称。可以是HTML页面、Servlet、PDF文件、图像、音频文件或视频文件等服务器提供服务的文档类型。如果本部分省略,大多数服务器会默认查找index.html页面或设置的欢迎页面。

(6) 查询字符串,可选。如果为HTTP GET请求,额外的参数会作为查询字符串附加到URL的末尾,以问号“?”起始,每个参数以“名=值”的形式出现,多个参数间用“&”分隔。

 

HTTP请求和响应

通常,Web服务器一直使用指定端口(默认为80端口)监听客户端的请求。请求由客户端发起,创建一个到服务器指定端口的TCP连接。一旦收到请求,服务器会向客户端返回一个状态,比如“HTTP/1.1 200 OK”,以及返回的内容,如请求的文件、错误消息、或者其他信息,这就是服务器端的响应。

HTTP 1.1协议总共定义了八种方法(也叫“动作”)来操纵指定的资源,其中,最重要的方法只有两个——GET方法和POST方法。

 

常见的请求头标记列示如下:

(1) GET或POST:请求类型,后接请求资源、协议和版本

(2) Host:主机和端口

(3) Connection:是否使用持续连接

(4) User-Agent:客户端浏览器的名称

(5) Accept:浏览器可接受的MIME类型

(6) Accept-Encoding:浏览器知道如何解码的数据编码类型

(7) Accept-Language:浏览器指定的语言

(8) Accept-Charset:浏览器支持的字符编码

(9) Cookie:保存的Cookie对象

 

响应状态

响应信息的第一行就是响应状态,内容依次是当前HTTP版本号,三位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。 状态代码的第一个数字代表当前响应的类型,xx表示两位数字。

(1) 1xx消息:请求已被服务器接收,继续处理

(2) 2xx成功:请求已成功被服务器接收、理解、并接受

(3) 3xx重定向:需要后续操作才能完成这一请求

(4) 4xx请求错误:请求含有词法错误或者无法被执行 

(5) 5xx服务器错误:服务器在处理某个正确请求时发生错误

 

响应体

响应头之后紧跟着一个空行,然后接响应体。响应体就是Web服务器发送到客户端的实际内容。除网页外,响应体还可以是诸如Word、Excel或PDF等其他类型的文档,具体是哪种文档类型由Content-Type指定的MIME类型决定。MIME是多功能Internet邮件扩展(Multipurpose Internet Mail Extensions)的英文字首缩写,设计MIME的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。HTTP协议支持MIME类型之后,使得HTTP传输的不仅是普通的文本,而是丰富多彩的各种类型的文档。



响应头

响应头用于指示客户端如何处理响应体,告诉浏览器响应的类型、字符编码和字节大小等信息。常用的响应头列示如下。

(1) Allow:服务器支持哪些请求方法(如GET、POST等)

(2) Content-Encoding:文档的编码(Encode)类型。只有在解码之后才可以得到Content-Type头指定的内容类型

(3) Content-Length:内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据

(4) Content-Type:表示后面的文档属于什么MIME类型

(5) Date:当前的时间

(6) Expires:文档过期时间

(7) Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计

(8) Server:服务器名称

(9) Set-Cookie:设置与页面关联的Cookie

(10) WWW-Authenticate:客户应该在Authorization头中提供的授权信息类型

 

访问新浪

GET与POST请求

1)GET请求和POST请求的区别 HTTP GET和HTTP POST是开发Web应用的两种最重要的请求方法。

两者最重要的区别是POST有体(body),而GET没有。 GET和POST都能发送参数,只是GET所发送的参数长度受限于请求行。下面以实例说明两者的区别。

GET请求的请求头

GET /requestresponse/login.do?username=%E5%BC%A0%E4%B8%89&userpwd=123456 HTTP/1.1

Host: localhost:8080

Connection: keep-alive

User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Referer: http://localhost:8080/requestresponse/login.html

Accept-Encoding: gzip,deflate,sdch

Accept-Language: zh-CN,zh;q=0.8

Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3

第一行为请求行。第一个单词指定HTTP方法,这里是GET。紧接着的是指向Web服务器上资源的路径,问号之后的是查询字符串,在GET请求中,如果有参数,可以附在请求URL之后。查询字符串百分号之后的两位数字是16进制数,这里是汉字“张三”的URL编码。最后的是Web浏览器与服务器通信的协议版本,这里是HTTP/1.1。

POST请求的请求头

POST /requestresponse/login.do HTTP/1.1

Host: localhost:8080

Connection: keep-alive

Content-Length: 42

Cache-Control: max-age=0

Origin: http://localhost:8080

User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1

Content-Type: application/x-www-form-urlencoded

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Referer: http://localhost:8080/requestresponse/login.html

Accept-Encoding: gzip,deflate,sdch

Accept-Language: zh-CN,zh;q=0.8

Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3

 

username=%E5%BC%A0%E4%B8%89&userpwd=123456

 

第一行也是请求行,但与GET不同的是没有查询字符串。请求行后面的几行都是请求头,注意到Content-Length表示请求体消息的长度,这里为42字节。请求头之后又一个空行,后面紧接请求体。

 

看起来似乎GET和POST请求的区别在于所能发送参数数据的长度。真是这样吗?

当使用GET请求时,参数数据显示在浏览器地址栏,紧接真实URL之后,用问号分割。显然,如果参数数据含有敏感信息,任何人都不希望这样直接显示在地址栏上。因此,安全性也是要考虑的因素。

如果希望客户能够收藏网页,那么,GET请求能够收藏,但POST请求则不能。

除了长度、安全和收藏,GET和POST请求还有一个关键的区别,那就是它们具体设计来干什么。GET请求意味着获取信息,简单的、周期性的检索。当然,可以使用参数来帮助说明希望服务器送回哪些信息,但最关键的是:GET请求没有改变服务器上的东西。POST请求则不然,本身意味着发送需要处理的数据。因此,见到POST请求,就要想到“更新”,即,使用POST体的数据去改变服务器上的一些东西。

 

 

 

 

©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页