以下将简要介绍HTTP产生及作用,Session示意,请求与响应详解
最后会利用浏览器的Network选项具体看下实际HTTP是如何工作的。
参考自RFC2616及RFC7231文档。
1. HTTP简介:
HTTP,全称为Hypertext Transfer Protocol,是一种应用层协议,适用于协作分布式和超媒体信息系统,也即今天的万维网。
HTTP主要功能是指导万维网上的客户端与服务器如何进行数据的交互。其与URL, HTML等一起构成WWW的基石。
该协议最初是由英国Tim Berners Lee于欧洲原子核研究中心工作时研发出的,其看到不同电脑,不同软件之间信息交互的困难,没有一个统一的标准,故Lee制定了万维网(WWW)的规范,同时还写了世界上第一个服务器,浏览器,网页,目前还可以从info.cern.ch进行访问。
HTTP协议标准可参考<RFC2616 (HTTP/1.1)>
HTTP语义及文档可参考 <RFC7231(HTTP/1.1: Semantics and Content)>
2. HTTP Session介绍:
HTTP通常作为Request-Response的协议,其通常建立在传输层TCP的基础上。
HTTP描述了客户端如何发起不同方式的请求,以及服务端如何对不同的请求进行回应, 一对Request, Response称为一个Session。
客户端通常是浏览器或网络爬虫,手机应用等,而服务端通常是远程的Web服务器。客户端通过用URLs向服务器发起请求来获取相关的HTML页面,服务器通常则在80端口监听请求并负责返回响应内容,客户端浏览器则下载内容并将其渲染到显示器上。
*URLs: Uniform Resource Locators,用于定位HTTP资源在网络中的位置,其通常由http/https协议、域名、端口、路径、查询参数、锚点等组成。
3-1. 请求
Request请求包括首行信息Request-Line(由method,资源鉴别符合,协议版本组成)以及可选的header字段,message-body(视不同method而定)
具体的格式如下:
Request = Request-Line
*(( general-header
| request-header
| entity-header ) CRLF)
CRLF
[ message-body ]
其中Request-Line = Method SP Request-URI SP HTTP-Version CRLF
(上述SP,CRLF分别表示空格以及换行),CRLF用于分开不同的内容,如header与message
Request-Line中的Method有以下几种:
Method = "OPTIONS"
| "GET"
| "HEAD"
| "POST"
| "PUT"
| "DELETE"
| "TRACE"
| "CONNECT"
| extension-method extension-method = token
以下是例子:
GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1
或
GET /pub/WWW/TheProject.html HTTP/1.1 Host: www.w3.org
利用GET method从www.w3.org主机获取相应查询参数的页面,协议是HTTP/1.1
注意这里查询参数的后缀不一定是文件,具体的资源信息是由Headers里的content-type指定的。
这里简要介绍下GET及POST及其区别.
首先介绍一个概念,Idempotence--幂等性,简单来说若S*S=S 或 f(f(x)) = f(x),则称S或f(x)是幂等的,在计算机中则是若任意多次操作产生的结果与一次操作的结果均相同,则成该操作是幂等的,幂等操作通常比非幂等操作有更高的安全性。
GET:
GET是指通过Request-URI及查询参数检索任意的信息,例如GET请求一个数据处理程序,则该数据处理程序的结果数据将会被作为Response的实体返回给GET。GET也可以通过条件request-header字段(conditional header field)来指定要检索的信息,结合已有的缓存实体刷新,以便节省网络使用和多次重复检索。
POST:
POST是被用于希望服务器将Request包含的需要提交的数据实体作为Request-URI所定义资源下的下级数据(subordinate)。
POST通常用于以下的场景:
- Annotation of existing resources;
- Posting a message to a bulletin board, newsgroup, mailing list,
or similar group of articles;- Providing a block of data, such as the result of submitting a
form, to a data-handling process;- Extending a database through an append operation.
即在已有的各种分组里添加新的信息,如邮件列表中添加新的邮件地址,新闻列表里添加新的新闻信息等;作为表单的提交,提供块数据给数据处理进程;在已有的数据库中新增新的记录。
所采取哪种POST是由server和Request-URI决定的。由于POST的结果可能并不能通过被某个URI指定的资源来作为Response,故通常server会返回200(OK)或者204(No content)作为状态码,若POST要求建立的实体是已经存在的话,则会返回201(created)要提交的数据是已经被建立的。
另外,对POST请求的Response是不可被缓存的,除非响应包含合适的缓存控制,但303(see others)响应可定向客户端去相应的cacheable resource中检索。
GET与POST区别:
-
GET用来从服务器检索相应URL的信息,报文传输的是检索所需的参数
响应返回的是所需的信息。POST用来向服务器提交数据,报文传输的是所要提交的数据。
响应返回的是操作的结果。 GET 将不改变服务器资源的状态,而POST通常会改变服务器资源的状态。
GET是幂等的,POST是非幂等的,即GET多次请求,结果返回都是一致的。
GET可缓存,POST一般不可缓存
最后简要提下HEAD请求,其要求服务端返回与GET请求返回一致的信息,但不需要返回资源即Response中无需包含Body部分,通常用于仅获取响应headers中的(meta-information)。
3-2. 响应
当服务器收到一个请求信息后,它将返回一个Response信息。
具体格式如下:
Response = Status-Line
*(( general-header
| response-header
| entity-header ) CRLF)
CRLF
message-body
可见Response信息格式与Request很像,不同的是Request-Line被替换为Status-Line了,以下对Status-Line和Status code进行详细介绍:
Status-Line = HTTP-Version SP Status Code SP Reason-Phrase CRLF
Status-Code可分为以下几类:
-1xx: Informational - 请求收到,继续处理
-2xx: Success - 动作成功收到,并被理解即接受
-3xx: Redirection - 需进一步的动作来完成请求
-4xx: Client Error - 请求错误,其包含错误语法或者不完全的信息
-5xx: Server Error - 服务器错误,对请求响应失败
具体如下:
100: Continue
101: Switching Protocols
200: OK
201: Created
202: Accepted
203: Non-Authoritative Information
204: No Content
205: Reset Content
206: Partial Content
300: Multiple Choices
301: Moved Permanently
302: Found
303: See other
304: Not Modified
305: Use Proxy
307: Temporary Redirect
400: Bad Request
401: Unauthorized
402: Payment Required
403: Forbidden
404: Not Found
405: Method Not Allowed
406: Not Acceptable
407: Proxy Authentication Required
408: Request Time-out
409: Conflict
410: Gone
411: Length Required
412: Precondition Failed
413: Request Entity Too Large
414: Request-URI Too Large
415: Unsupported Media Type
416: Requested Range not satisfiable
417: Expectation Failed
500: Internal Server Failed
501: Not Implemented
502: Bad Gateway
503: Service Unavailable
504: Gateway Time-out
505: HTTP Version not supported
4. 浏览器Network功能
通常IE或Chrome内核等的浏览器可以通过F12来显示Network选项,能对HTTP请求及相应有一个直观的理解:
F12后选择Network选项,将显示请求的详细信息,可多次刷新,发现结果不变。(若你的没有Method,Status, Protocol字段,可以点击Name,选择相应的字段)。
接下来,让我们来看下GET请求的详细信息,直接点击rfc2616则可看到右侧显示了该请求的Header信息(General Header, Response Headers及Request Header)以及Response返回的HTML页面信息。若要查看Header信息源码可点击view source(*Chrome)
Request包含
- 首行Request-Line - 其描述了请求方法是GET,从/html/rfc2616资源位置获取信息, 协议是HTTP/1.1, 主机位置是tools.ietf.org;
- Request Header 信息,描述UA(user-agent)是谷歌浏览器,以及相应的条件header,这些信息都是以Key:Value的形式显示;
- 一个换行符,用于分割Header与Message Body。
- Message Body, 由于此处是GET方法,没有Message,若是POST方法,则Message body将携带相应的信息,如账户名和密码等, 在浏览器中可以从FormData或Payload里查看, 若是使用的是HTTP,则所有数据在网络上的传输是明文的,即使是密码,而使用HTTPS,POST的数据将会被加密。
Response包含:
- 首行Status-Line - 其描述协议版本,状态码以及其意义。
- Response-Header及Entity-Header信息,也是Key:Vaule 键值对,包括对内容的描述信息,如Content-Type,表示返回的是text/html
-
Message body,相应的html网页,可从message选项看
浏览器收到Response的HTML内容后则将其渲染到显示器上。
除了使用浏览器查看,还可以用curl -v URLs
来查看相应的HTTP请求与响应的过程,关于curl的用法,可以参考这里。
小结
以上则是对HTTP的简要介绍,Request-Response 的格式介绍,Method中的GET与POST的详细介绍及区别,Status code的含义。
最后通过Chrome实际看了Request(GET)及相应的Response内容