zoukankan      html  css  js  c++  java
  • HTTP请求与响应

    HTTP请求与响应

    最权威的文档

    https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

    然而阅读起来难度有点大呢
    所以可以看看HTTP权威指南 以及图解HTTP(很好的入门书)

    header & body

    一个HTTP请求 是由请求头和请求体组成的 不过呢GET请求是没有请求体的 POST才有

    一个请求/响应的大致结构:
    header(包括请求行 请求首部字段 通用首部字段 实体首部字段)
    空行(CR+LF)
    body
    enter image description here

    一个GET请求

    GET /books/?name=Professional%20Ajax HTTP/1.1
    Host: www.wrox.com
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
    Gecko/20050225 Firefox/1.0.1
    Connection: Keep-Alive

    一个纯文本的POST请求

    POST / HTTP/1.1
    Host: www.wrox.com
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
    Gecko/20050225 Firefox/1.0.1
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 40
    Connection: Keep-Alive
    (此处空一行)
    name=Professional%20Ajax&publisher=Wiley

    发送图片等二进制数组的POST请求

    POST / HTTP/1.1
    Host: www.wrox.com
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
    Gecko/20050225 Firefox/1.0.1
    Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryPh3G5pOw90P9pzQW
    Content-Length: 35827
    Connection: Keep-Alive

    ------WebKitFormBoundaryPh3G5pOw90P9pzQW
    Content-Disposition: form-data; name="file"; filename="2015-11-20 235622.jpg"
    Content-Type: image/jpeg

    ------WebKitFormBoundaryPh3G5pOw90P9pzQW--

    一个响应

    HTTP/1.1 200 OK
    Date: Sat, 31 Dec 2005 23:59:59 GMT
    Content-Type: text/html;charset=ISO-8859-1
    Content-Length: 122
    (此处空一行)
    <html>
    ....

    HTTP Action

    • OPTIONS
      这个方法可使服务器传回该资源所支持的所有HTTP请求方法。比如服务器会返回这么一个Allow字段
    Allow: GET, POST, PUT, OPTIONS
    
    • GET/POST
    • HEAD
      与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的实体部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(对象是否存在 对象的类型 对象是否被修改)。
    • PUT
      POST用于向服务器发送数据 PUT用于向服务器上的文件中存储数据
    • DELETE
      请求服务器删除Request-URI所标识的资源。
    • TRACE
      回显服务器收到的请求,主要用于测试或诊断。因为客户端发出的请求会经过防火墙 代理 网关等 期间请求可能被修改 有了TRACE就可以看到请求是如何被修改的
    • CONNECT
      CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

    PS 这些Action并不是全部 还有一些扩展的方法

    响应状态码

    200 请求成功 响应有响应体
    204 请求成功处理 但是返回的报文不包括body
    206 Partical Content 响应的报文中包含了Content-Range指定的范围实体内容
    301 永久移动 表示资源已经被重新分配了URI
    302 临时移动 临时移动并不是说资源暂时移至别处后会回到原来的位置 实际意思是虽然资源分配了新的URI 但是这个URI还是会改变的额
    303 和302一样 但是303表示客户端应当使用GET
    304 当客户端发送了附带条件的请求的时候 服务端运算后发现条件不成立 返回304 (条件不成立表示服务器的资源没有更新 可以使用缓存) 返回304的时候不包括响应体
    条件请求 If-Match If-Modifiled-Since If-None-Match If-Range If-Unmodified-Since
    307 临时重定向 和302类似 但是302规定禁止从POST变成GET
    400 Bad Request 报文存在语法错误
    401 未授权 此时浏览器会弹出一个框要求输入用户名和密码
    403 禁止访问这个资源(从未授权的IP地址发出的访问)
    404
    500
    503 服务器超负载状态 或者处于停机维护

    PS URL是URI(统一资源标识符)的子集
    比如下面也都是URI

    mailto:xxx@xx.com
    temlnet://xx.xx.xx.xx:80/
    

    MIME类型

    Web服务器可以用文件的扩展名来说明MIME的类型

    请求和响应中的字段

    通用首部

    请求和响应都有的字段 (HTTP权威指南71页)

    首部字段名 说明
    Cache-Control 控制缓存行为
    Connection 允许客户端和服务器指定与请求响应连接有关选项
    Date HTTP报文创建时间
    Pragma Cache-Control的HTTP1.0兼容
    Trailer ..
    Transfer-Encoding 报文编码方式
    Upgrade ..
    Via 报文经过的中间节点

    请求首部

    首部字段名 说明
    Accept 用户代理可处理的媒体类型
    Accept-Charset 优先的字符集
    Accept-Encoding 优先的内容编码
    Accept-Language 用户语言
    Authorization Web认证信息
    Except 期待服务器的特定行为
    HOST 给出了接收请求的服务器的主机名和端口号
    If-Match 比较实体标记Etag
    If-Modified-Since 比较资源更新时间
    If-Unmodified-Since If-Modified-Since相反
    If-None-Match 和If-Match相反
    Max-Forwards 最大传输跳数
    Proxy-Authorization 代理服务器认证信息
    Range 实体范围请求
    If-Range 资源未更新时 发送实体范围请求 单位是Byte
    Referer URI来源
    TE 传输编码优先级
    User-Agent HTTP客户端信息

    响应首部

    首部字段名 说明
    Accept-Ranges 是否接受字节范围的请求
    Age 原服务器创建响应后到现在经过的时间 单位为秒
    Etag 资源的信息
    Location 重定向URI
    Proxy-Authenticate 代理服务器与客户端的认证信息
    Retry-After 如果资源不可用的话,在此日期或时间重试
    Server 服务器应用程序软件的名称和版本
    WWW-Authenticate 服务器和客户端的认证信息

    实体首部

    首部字段名 说明
    Allow 该资源可以支持的HTTP方法或其他 比如是否允许跨域
    Content-Type 实体媒体类型
    Content-Location
    Content-Length
    Content-Language
    Content-MD5
    Expires 过期时间
    Last-Modified 最后修改时间

    缓存

    在规定时间内 都认为内容是新鲜的 缓存可以任意使用这些副本 无需和服务器联系

    Expires: Sat, 29 June 2002, 14:30:00 GMT
    OR
    Cache-Control: max-age=43220

    max-age表示从服务器响应的时候开始 此资源处于新鲜状态的时间长度

    PS
    Cache-Control是HTTP1.1中才有的 Expires是HTTP1.0就有

    304

    仅仅是资源超过了规定时间但是并不意味着服务器上的资源更新了
    HTTP向原始服务器发送一个条件GET 服务器自行判断 在缓存资源和服务器中的资源不同的时候才返回对象 (这个时候才有响应体)
    这也就是常说的条件GET 只有条件成立 服务器才返回对象 不成立 则返回304

    最常用的是 If-Modified-Since 和 If-None-Match
    在GET请求资源的时候降入这个首部
    请求

    If-Modified-Since: Sat, 29 June 2002, 14:30:00 GMT
    If-None-Match: <tags>
    

    响应

    HTTP/1.0  304 Not Modified
    Date: Wed, 03 Jul 2002, 19:22:00 GMT
    Expires: Fri, 05 Jul 2002, 19:22:00 GMT
    

    那么If-Modified-Since发送的时间究竟是什么时候呢
    通常是和 Last-Modefied 这个响应的首部 配合
    一个资源第一次请求 服务器的响应包含了Last-Modefied的话
    下一次再次发送请求就会有If-Modified-Since 字段 , 值就是Last-Modefied的值

    If-None-Match也是同样道理 配合服务器响应的Etag首部
    Etag是文件的标识, 标识规则是服务器来确定, 所以要发送的If-None-Match的值也就是
    该资源第一次请求服务器响应的Etag值

    PS 如果响应中既有Last-Modefied 和 Etag 只有两者都满足的时候才返回304

  • 相关阅读:
    zabbix4.4安装和简要设置
    SAMBA服务
    NFS服务
    Rsync+inotify数据同步
    Linux上FTP部署:基于mariadb管理虚拟用户
    rsyslog日志服务部署
    Typora自动生成标题编号
    编译安装LAMP
    303. 区域和检索
    [leetcode]53. 最大子序和*
  • 原文地址:https://www.cnblogs.com/cart55free99/p/5252259.html
Copyright © 2011-2022 走看看