您的位置:首页 > 理论基础 > 计算机网络

前端开发所应该知道的HTTP

2012-12-20 18:00 281 查看

HTTP Message

一共只有两种HTTPmessages:

HTTP-message = Request | Response ; HTTP/1.1 messages

Message的格式如下:

generic-message = start-line

                  *(message-header CRLF)

                  CRLF

                  [
message-body ]

start-line     = Request-Line | Status-Line

Request-Line是给请求用的,Status-Line是给响应用的。服务器应该忽略start-line前任何的空格或多余的CRLF,但HTTP/1.0没有,在HTTP/1.1已经解决了。

Message-header

message-header = field-name ":" [ field-value ]

field-name     = token

field-value    = *(field-content | LWS )

field-content  = <theOCTETs making up the field-value  andconsisting 

                 of either*TEXT or combinations of token, separators,

                 andquoted-string>

LWSlinear white space

根据message的内容和传送方向,又分为general-header,request-header, response-header, entity-header,但它们的格式都是一样的。

Message-body

Message-body在通常情况下和entity-body是一样的,但如果message有Transfer-Encoding属性,entity-body会被使用Transfer-Encoding编码:

message-body = entity-body | <entity-bodyencoded as per transfer- encoding>

注意:Transfer-Encoding是message的属性,不是entity的。

Message Length

Transfer-length是message-body的长度,但它的长度按下面的条件计算:

1.      Response message没有message-body(1xx, 204,304等),这个message会被终止;忽略entity-length。

2.      如果有Transfer-Encoding,而且值不是”identity”,则transfer-length是经过Transfer-Encoding后的长度。

3.      如果有Content-Length,它同时表示的是entity-length和transfer-length(也就是说这两个的值是一样的)。如果entity-length和transfer-length不同,是不可以发送Content-Length的。如果Content-Length和Transfer-Encoding这两个header-field都有,则忽略Content-Length。

4.      如果message使用了”multipart/byteranges”,transfer-length由media的大小决定。

为了兼容HTTP/1.0,HTTP/1.1请求一定包含了一个合法的Content-Length头字段,除非已知服务器是HTTP/1.1兼容的。如果一个请求包含了message-body而且Content-Length没有给,但服务器没法判断message的长度则返回400(bad request);如果服务器坚持要一个合法的Content-Length,则返回411。

General Header Fields

general-header = Cache-Control         

                 | Connection             

                 | Date                   

                 |Pragma               

                 |Trailer               

                 |Transfer-Encoding      

                 |Upgrade         

                 | Via                

                 |Warning  

请求

Request       =Request-Line             

                *((general-header      

                |request-header       

                |entity-header ) CRLF)

                CRLF

                [message-body ]    

Request-Line

Request-Line  = Method SP
Request-URI SP HTTP-Version CRLF

Method

       Method         = "OPTIONS"              

                      |"GET"                  

                      | "HEAD"              

                      |"POST"               

                      | "PUT"                 

                      |"DELETE"              

                      | "TRACE"             

                      |"CONNECT"            

                      |extension-method

       extension-method =token

OPTIONS:: Response to are notcacheable。

GET :Responseis cacheable if and only if it meets the requirements for HTTP caching.

HEAD:服务器不需要在响应中有message-body。

POST:响应一般不是cacheable,除非响应包含适当的Cache-Control或Expires头字段。但303响应是用来指示用户代理去获取一个可以缓存的资源。

DELETE:一般用来删除源服务器上的某个资源,这个method的响应不能cacheable。

PUT:用来保存entity在指定的Request-URI。

TRACE

这个请求不能有entity,而且和Max-Forwards这个请求头字段有关。使用这个method,可以在客户端看到在请求链的其它端点收到了什么。尤其是”Via”这个头字段,可以跟踪请求的路径。”Max-Forwards”可以限制请求链的长度。

Connect

这个是保留给代理用的,用来动态控制使其成为一个tunnel(如SSLtuneling)。

Request-URI

    Request-URI    = "*" | absoluteURI | abs_path |authority

“*”号表示请求指向服务器本身,典型例子是:

    OPTIONS * HTTP/1.1

Request Header Fields

把请求的其它相关信息,以及客户端自身的信息传送到服务器。

       request-header =Accept     

                      |Accept-Charset

                      |Accept-Encoding 

                      |Accept-Language    

                      |Authorization      

                      |Expect             

                      |From            

                      |Host               

                      |If-Match            

                      |If-Modified-Since 

                      | If-None-Match    

                      |If-Range                

                      |If-Unmodified-Since

                      |Max-Forwards    

                      |Proxy-Authorization

                      |Range                

                      |Referer         

                      |TE             

                      |User-Agent       

Response

       Response      = Status-Line              

                       *((general-header       

                        |response-header        

                        |entity-header ) CRLF) 

                       CRLF

                       [ message-body ]         

Status-Line

       Status-Line =HTTP-Version SP
Status-Code SP Reason-Phrase CRLF

Status-Code

      - 1xx: Informational - Request received,continuing process

      - 2xx: Success - The action wassuccessfully received,  understood, andaccepted

      - 3xx: Redirection - Further action mustbe taken in order to  complete therequest

      - 4xx: Client Error - The requestcontains bad syntax or cannot  befulfilled

      - 5xx: Server Error - The server failedto fulfill an apparently  valid request

Response Header Fields

       response-header =Accept-Ranges        

                       |Age                  

                       |ETag                 

                       |Location               

                       |Proxy-Authenticate 

                       |Retry-After        

                       |Server            

                       |Vary              

                       | WWW-Authenticate 

Entity

       entity-header  = Allow                  

                      |Content-Encoding      

                      |Content-Language      

                      |Content-Length      

                      |Content-Location       

                      |Content-MD5          

                      |Content-Range    

                      |Content-Type         

                      |Expires               

                      |Last-Modified      

                      |extension-header

 

       extension-header= message-header

Entity Body

   entity-body    = *OCTET

有message-body才可能有entity-body。Entity-body是从message-body中解码了Transfer-Encoding后得到的。因此,如果没有Transfer-Encoding,则entity-body就是message-body。

    entity-body :=Content-Encoding( Content-Type( data ) )

实体中的数据类型,由entity header field中的Content-Type和Content-Encoding决定。

Entity Length

Entity-length是message-body被应用Transfer-coding之前的长度。

Status Code Definitions

100 Continue

这个中间响应是通知客户端,请求的初始部分已经被服务器接收了,客户端应该继续发送请求的剩余部分。

200 OK

·        GET   对应请求的entity已经在响应中被返回了。

·        HEAD 对应请求的entity-header字段已经在响应中了,但没有message-body。

·        POST  返回的entity描述了这个action的结果。

·        TRACE  返回的entity包含了被服务器接收的请求信息。

201 Created

表明请求已经完成,并且在服务器产生了一个新的资源。这个新资源可以通过响应中返回URI引用。

202 Accepted

请求已经被接受了,但还在处理中。

204 No Content

请求已经完成,但没有返回。这个时候页面不应该有刷新。

205 Reset Content

请求已经完成,用户代理应该重新刷新document视图。

300 Multiple Choices

请求的资源有多个表现,用户选择其中一个偏爱的表现,用户代理可能自动跳转。

301 Moved Permanently

请求的资源已经赋予了一个新的URI。如果是GET或HEAD之外的请求收到了301状态码,用户代理不能自动跳到新的请求地址。

305 Use Proxy

请求的资源必须通过Location头字段指定的代理访问。

400 Bad Request

请求无法被服务器识别。

401 Unauthorized

请求需要验证,响应必须包含WWW-Authenticate头字段。

403 Forbidden

服务器已经懂了这个请求,但拒绝完成。

404 Not Found

服务器没有找到处理Request-URI的方法。

405 Method Not Allowed

发送请求的method不劫持,可能是拼写错误。

407 Proxy Authentication Required

与401相似,但这个是要求首先客户端过了代理的验证。

411 Length Required

服务器拒绝接受请求,因为没有定义Content-Length。

500 Internal Server Error

服务器遇到了意外,拒绝完成请求。

501 Not Implemented

服务器不支持要求的功能来完成这个请求。

503 Service Unavailable

服务器超负荷或服务器在维护中,当前无法完成该请求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: