HTTP之请求

作者: 幻城之雪 | 来源:发表于2023-05-08 21:13 被阅读0次

    http请求由请求行,消息报头,请求正文三部分构成。
    请求行由请求Method, URL 字段和HTTP Version三部分构成, 总的来说请求行就是定义了本次请求的请求方式, 请求的地址, 以及所遵循的HTTP协议版本例如:

    GET /example.html HTTP/1.1 (CRLF)
    
    

    HTTP协议的方法有:

    • GET: 请求获取Request-URI所标识的资源
    • POST: 在Request-URI所标识的资源后增加新的数据
    • HEAD: 请求获取由Request-URI所标识的资源的响应消息报头
    • PUT: 请求服务器存储或修改一个资源,并用Request-URI作为其标识
    • DELETE: 请求服务器删除Request-URI所标识的资源
    • TRACE: 请求服务器回送收到的请求信息,主要用于测试或诊断
    • CONNECT: 保留将来使用
    • OPTIONS: 请求查询服务器的性能,或者查询与资源相关的选项和需求

    HTTP请求头

    消息报头由一系列的键值对组成,允许客户端向服务器端发送一些附加信息或者客户端自身的信息,主要包括:

    Header 解释 示例
    Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html
    Accept-Charset 浏览器可以接受的字符编码集 Accept-Charset: iso-8859-5,utf-8
    Accept-Encoding 指定浏览器可以支持的web服务器返回内容压缩编码类型 Accept-Encoding: compress, gzip
    Accept-Language 浏览器可接受的语言 Accept-Language: en,zh
    Accept-Ranges 可以请求网页实体的一个或者多个子范围字段 Accept-Ranges: bytes
    Authorization HTTP授权的授权证书类型 Authorization:Basic
    QWxhZGRpbjpvcGVuIHNlc2FtZQ==
    Cache-Control 指定请求和响应遵循的缓存机制 Cache-Control: no-cache
    Connection 表示是否需要持久连接(HTTP 1.1默认进行持久连接) Connection: close
    Cookie HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器 Cookie: $Version=1; Skin=new;
    Content-Length 请求的内容长度 Content-Length: 348
    Content-Type 请求的与实体对应的MIME信息 Content-Type: application/x-www-form-urlencoded
    Date 请求发送的日期和时间 Date: Tue, 15 Nov 2010 08:12:31 GMT
    Expect 请求的特定的服务器行为 Expect: 100-continue
    From 发出请求的用户的Email From: user@email.com
    Host 指定请求的服务器的域名和端口号 Host: www.zcmhi.com
    If-Match 只有请求内容与实体相匹配才有效 If-Match:
    “737060cd8c284d8af7ad3082f209582d”
    If-Modified-Since 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
    If-None-Match 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 If-None-Match:
    “737060cd8c284d8af7ad3082f209582d”
    If-Range 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag If-Range:
    “737060cd8c284d8af7ad3082f209582d”
    If-Unmodified-Since 只在实体在指定时间之后未被修改才请求成功 If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
    Max-Forwards 限制信息通过代理和网关传送的时间 Max-Forwards: 10
    Pragma 用来包含实现特定的指令 Pragma: no-cache
    Proxy-Authorization 连接到代理的授权证书 Proxy
    Authorization:Basic
    QWxhZGRpbjpvcGVuIHNlc2FtZQ==
    Range 只请求实体的一部分,指定范围 Range: bytes=500-999
    Referer 先前网页的地址,当前请求网页紧随其后, 即来路 Referer:www.zcmhi.com/archives/71
    TE 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 TE:trailers,deflate;q=0.5
    Upgrade 向服务器指定某种传输协议以便服务器进行转换(如果支持) Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
    User-Agent User-Agent的内容包含发出请求的用户信息 User-Agent: Mozilla/5.0 (Linux; X11)
    Via 通知中间网关或代理服务器地址,通信协议 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
    Warning 关于消息实体的警告信息 Warn: 199 Miscellaneous warning

    HTTP请求正文

    只有在发送POST请求时才会有请求正文,GET方法并没有请求正文

    HTTP响应

    与HTTP请求类似,先上一张图:
    HTTP响应也由三部分组成,包括状态行,消息报头,响应正文。

    HTTP响应状态行

    状态行也由三部分组成,包括HTTP协议的版本,状态码,以及对状态码的文本描述。例如:

    HTTP/1.1 200 OK (CRLF)
    
    HTTP响应状态码

    状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

    • 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 - 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常

    HTTP响应状态码说明

    StatusCode StatusCode语义 中文描述
    100 Continue 继续。客户端应继续其请求
    101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
    200 OK 请求成功。一般用于GET与POST请求
    201 Created 已创建。成功请求并创建了新的资源
    202 Accepted 已接受。已经接受请求,但未处理完成
    203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
    204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
    205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
    206 Partial Content 部分内容。服务器成功处理了部分GET请求
    300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
    301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
    302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
    303 See Other 查看其它地址。与301类似。使用GET和POST请求查看
    304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
    305 Use Proxy 使用代理。所请求的资源必须通过代理访问
    306 Unused 已经被废弃的HTTP状态码
    307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向
    400 Bad Request 客户端请求的语法错误,服务器无法理解
    401 Unauthorized 请求要求用户的身份认证
    402 Payment Required 保留,将来使用
    403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
    404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
    405 Method Not Allowed 客户端请求中的方法被禁止
    406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求
    407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
    408 Request Time-out 服务器等待客户端发送的请求时间过长,超时
    409 Conflict 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
    410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
    411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息
    412 Precondition Failed 客户端请求信息的先决条件错误
    413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
    414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理
    415 Unsupported Media Type 服务器无法处理请求附带的媒体格式
    416 Requested range not satisfiable 客户端请求的范围无效
    417 Expectation Failed 服务器无法满足Expect的请求头信息
    500 Internal Server Error 服务器内部错误,无法完成请求
    501 Not Implemented 服务器不支持请求的功能,无法完成请求
    502 Bad Gateway 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
    503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
    504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
    505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理

    强缓存和弱缓存

    Last-Modified

    在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:

    Last-Modified: Fri, 12 May 2006 18:53:33 GMT
    
    

    客户端第二次请求此URL时,会在头部加入一个属性,询问该时间之后文件是否有被修改过:

    If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
    
    
    ETag

    和Last-Modified类似,由于RFC2616(也就是HTTP/1.1)中没有说明ETag该是什么格式的,只要确保用双引号括起来就行了,所以你可以用文件的hash,甚至是直接用Last-Modified,以下是服务器端返回的格式

    ETag: “50b1c1d4f775c61:df3”
    

    客户端的查询更新格式是这样的:

    If-None-Match: W/“50b1c1d4f775c61:df3”
    
    
    Expires

    这个属性就如我们在ASP中使用HttpResponse.ExpiresAbsolute一样直接,声明某某时刻过期之后浏览器就应该重新请求该URL,使用格式为:

    Expires: Sun, 10 Feb 2002 16:00:00 GMT
    
    

    注意HttpResponse.ExpiresAbsolute在ASP.NET中是不建议使用的,现在我们应该使用的是HttpResponse.Cache.SetExpires。

    Pragma

    通常我们用到的值就是no-cache,这和在Cache-Control中使用no-cache值是一样的,Cache-Control在下面讲。Pragma的使用格式如下:

    Pragma: no-cache
    
    
    Cache-Control

    这是一个集合型属性,它里面能够包含很多子属性,并且允许用户扩展新的子属性。常见的子属性包括:

    • max-age - 以秒为单位的超时,覆盖Expires属性。
    • public - 允许保存在共享缓存中。
    • private - 只允许保存在私有缓存中。
    • no-cache - 不允许缓存。
    • no-store - 不允许缓存在持久介质中。
    • no-transform - 不允许转换存储系统。

    相关文章

      网友评论

        本文标题:HTTP之请求

        本文链接:https://www.haomeiwen.com/subject/dnblsdtx.html