作者:IamA-知乎
概要:本文讲的是HTTP的部分知识,是本人的学习心得,可能会有讲解错误,敬请指正。
正文: HTTP(Hyper Text Transfer Protocol),意为:超文本传输协议,是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。HTTP协议用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。(转自百度百科)
这篇主要讲解HTTP请求/响应。
HTTP请求:(如图)
HTTP协议的请求主要分为三部分组成:请求行、请求报头和请求体(后两项可以选,必须要有请求头)。
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:
Method Request-URI HTTP-Version CRLF
Method:请求方法。
Request-URI:一个统一资源标识符。
HTTP-Version:请求的HTTP协议版本。
CRLF:回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。
请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET 请求获取Request-URI所标识的资源。
POST 在Request-URI所标识的资源后附加新的数据。
HEAD 请求获取由Request-URI所标识的资源的响应消息报头。
PUT 请求服务器存储一个资源,并用Request-URI作为其标识。
DELETE 请求服务器删除Request-URI所标识的资源。
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断。
CONNECT 保留将来使用。
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求。
常用的请求报头:
Accept:用于指定客户端接受哪些类型的信息。
Accept-Charset:用于指定客户端接受的字符集。
Accept-Encoding:类似于Accept,但是它是用于指定可接受的内容编码。
Accept-Language:类似于Accept,但是它是用于指定一种自然语言。
Authorization:主要用于证明客户端有权查看某个资源。
Host:主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。(发送请求时,该报头域是必需的)。
User-Agent:允许客户端将它的操作系统、浏览器和其它属性告诉服务器。
上述不是全部,有兴趣可以去查一下。
HTTP响应:
HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文,状态行格式如下:
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 //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
这些状态代码我们大多数情况是一点都不希望见到的。唯一想见到的200则大多数直接跳转至网页。
常用的响应报头
Location:用于重定向接受者到一个新的位置。
Server:其包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。
WWW-Authenticate:其必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
这些说明有点难懂,而且一般是不会详细看到这些内容的,因为我们是使用浏览器打开网页,不会是手动发送请求来访问一个网页,那样效率十分低下。但是我们可以通过Telnet来详细了解过程。
我们以www.baidu.com为例子:
- 打开”运行”->cmd进入命令行。
- 输入”telnet”,回车,输入set(空格) localecho打开本地回显功能。
3. 然后连接网站,先输入:
open www.baidu.com 80
再输入请求:
GET / HTTP/1.1
连按两下回车(第一下是请求的格式需要,第二下是执行。)
如果成功收到响应的话,会是以下情况:
如果失败,则会显示:HTTP/1.1 400 Bad Request(当然,这是一个状态行)。
可能出现的问题:
- 无法使用telnet,显示这是一个无效的命令。
解决方案:这是没有开启telnet客户端,在控制面板中的程序中,打开“启用或关闭Windows功能”,拉到下面有“Telnet客户端”,点上。
2.手打进去后敲一下回车就出现400。
解决方案:直接复制上面的请求粘贴(请使用快捷键)进去,再敲两下回车。
原文链接:https://zhuanlan.zhihu.com/p/43087625