那些年被忽略的——HTTP的请求(Request)和响应(Response)

194 阅读3分钟

请求(Request

  • 请求消息是从客户端到服务器端。

请求行

  • 请求行是以一个方法标记开始,后面跟随Request-URI和协议版本号

请求方法

  • 方法指明了URI指定的资源上执行的方法。
Method = "OPTIONS"|"GET"|"HEAD"|"POST"|"PUT"|"DELETE"|"TRACE"|"CONNECT"|extension-method
  • 响应的返回码通知客户端某个方法对当前资源是否被允许,
    • 如果方法不允许,服务器会返回405状态码(方法不允许)
    • 如果源服务器不能识别或没有实现某个方法,那么服务器会返回501状态码(没有实现)

请求URLRequest-URI

  • 通用资源标识,用于指定请求的请求资源
  • 大多数请求是用于指定一个源服务器或网关上的资源。这种情况下,URI的绝对路径作为Request-URI被传输。
// 例如是一个这样的请求行
GET http://www.w3.org/pub/www/TheProject.html HTTP/1.1
  • 这种情况下,可能会建立一个TCP链接
GET /pub/www/TheProject.html HTTP/1.1
Host: www.w3.org

请求资源

  • 请求资源的精确定位是由请求里的Request-URIhost的值决定的
  • 对于HTTP/1.1的请求,遵循一下规则去请求资源:
    • 如果Request-URI是绝对地址,那么host(主机)是Request-URI的一部分。任何出现在请求里的Host的值都应当被忽略。
    • 如果Request-URI不是绝对地址,而且请求里的Host有值,那么host(主机)由Host的值决定。
    • 如果根据以上规则定义的主机对于服务器来说是一个无效的主机,那么服务器会返回400(坏请求)状态码。

请求头部

  • 请求头部允许客户端自己附加信息,也允许在传递请求时附加信息发送给服务器。
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

  • 接收和解析一个请求消息后,服务器发出一个HTTP响应消息。

状态行

  • 响应消息的第一行是状态行,由协议版本以及数字状态码和相关的文本短语组成。

状态码与原因短语

  • Status-Code是一个试图理解和满足请求的三位数整数码。
  • 状态码的第一位数字定义相应类别。后两位数字没有任何分类角色。第一位数字有五种值:
    • 1xx:报告(请求被接受到,继续处理)
    • 2xx:成功(被成功地接受/理解/接受)
    • 3xx:重发(为了完成请求必须采取进一步动作)
    • 4xx:客户端出错(请求错的语法或不能被满足)
    • 5xx:服务器出错(服务器无法完成原本可行的请求)
  • HTTP状态码是可扩展的。HTTP应用程序不需要理解所有已注册状态码的含义。但是应用程序必须了解由第一位数字指定的状态码的类别。

响应头部

  • 允许服务器在传送响应信息的时候附加信息。这些信息不能放在状态行里。
response-header = Accept-Ranges|Age|Etag|Localtion|Proxy-Autenticate|Retry-After|Server|Vary|WWW-Authenticate
  • 响应头部也是随着协议版本而扩展,不被识别的值会被看作实体头部。

总结

  • 看到请求头和响应头,联想到了什么?
  • 欢迎点赞、评论