Http1.1--Request

1. Request

在这里插入图片描述

  • |隔开的元素代表选择
  • ()括起来的元素会被当作同一个元素
  • *语法的完整形式是<n>*<m>element,其语义是最少n个,最多m个,如果省略m\n,则表示任意个,包含0
  • CRLF
    • Carriage-Return: 回车'\x0d',光标移动到一行前面;
    • Line-Feed: 换行'\x0a',光标移动到下一行
    • 在windows下实现换行需要\r\n,而在UNIX,Linux下只要\n即可;
  • [ element ]相当于*1( element),也就是至多一个

所以一个完整的请求报文是

  1. 请求行
  2. 请求头+CRLF(可选)
  3. CRLF
  4. 请求体(至多一个)

2. Request-Line

在这里插入图片描述
语义明确,方法+空格+URI+空格+版本+CRLF

2.1 Method

在这里插入图片描述

  • 当服务器对请求的方法可识别但不支持的时候,需要返回405(method not allowed)
  • 而服务器对请求方法无法识别的时候,需要返回501(Not Implemented)
  • 所有一般用途(general-purpose)的服务器必须支持GET和HEAD,其余的方法则是可选择的
  • 支持了方法,就要支持其语义

2.1.1 OPTIONS


2.1.2 GET

  1. 语义是获取URI所指定的资源
  2. 如果URI指向一个数据处理过程,则应将该处理过程的结果作为实体返回,而非将过程文本作为实体,除非其处理结果即为其本身文本
  3. 当header中包含If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, If-Range时,语义为满足条件则获取。该行为目的时减少不必要的网络传输
  4. 当header中包含Range时,语义为部分传输,该行为目的亦为减少不必要的网络传输
  5. 当且仅当有HTTP缓存需求的时候,GET的响应才是可以被缓存的(todo)
  6. 当使用form的时候需要考虑的安全问题(todo)

2.1.3 HEAD

  1. 除了不包含响应体,其余内容应该与GET请求得到的响应相同
  2. 该方法常用作测试连接的正确性、可达性以及验证最近的调整
  3. HEAD的响应可能会被缓存,当相应被用来更新缓存实体的时候(Content-Length, Content-MD5, ETagor Last-Modified 可以判断缓存是否过期

2.1.4 POST

  • POST的本意是设计一个通用的方法,其功能涵盖:对资源的注解、给邮件列表/公告栏等发送消息、提供数据块(如form表单)以及给数据库追加数据,但实际上的功能还是要看服务器,更准确的说是URI指向的资源的行为来确定
  • 对于POST来说,状态码200(OK) 204(No Content)都是合适的相应状态,这取决于响应是否包含响应实体
  • 如果服务器创建了一个资源,应该返回201(Created),且需要包含一个响应实体来描述响应状态以及新建资源的指向,并且有一个Locationheader
  • POST的响应式不能不缓存的,除非响应响应中包含了Cache-Control 或者Expires header。(缓存行是客户端的行为)
  • POST请求必需遵循的信息传输要求(todo)

2.1.5 PUT

  • 如果资源不存在,则创建资源来对应URI,若已经存在,应该当作一个更新版本(覆盖)
  • 如果新资源创建,必需返回201(Created)
  • 如果资源更新,应该返回200(Ok)204(Not Content)
  • 如果创建或更新失败,则应返回一个合适的错误响应来指明这个问题
  • 如果header中有任何形如Content-*的,不能识别或应用的,服务器应返回```501(Not Implemented)
  • 如果这个request途径缓存,而请求中的URI指定的资源在缓存中,那这些资源应该被标记为过期(stale)
  • PUT请求中的实体头应该被应用于新建的资源,除非特别指定了实体头
  • PUT请求必需遵循的信息传输要求(todo)

PUT与POST的取别主要体现在URI的意义上:

  • POST认为URI是一个数据处理程序,会有响应的逻辑处理POST过去的数据
  • PUT认为URI是指向一个数据,而且,服务器不能处理的时候,也不能交由别的URI去处理,而是应该返回一个301(Moved Permanently),由客户端决定是否重新访问重定向地址

2.1.6 DELETE

  • 这个行为可能会被服务器覆盖,即便是返回的状态码表示已经删除成功,所以,这个行为是得不到保障的,另一方面,服务器也应该在成功删除的时候再返回成功的状态码
  • 如果途径缓存,则URI中的资源应被标记为过期
  • 响应不可被缓存
  • 返回的状态码:
    • 如果成功且包含响应实体:200(Ok)
    • 如果成功但无响应实体:204(Not Content)
    • 如果尚未执行:202(Accepted)

2.1.7 TRACE

  • 调用一个远程应用层消息回路(请求并获得响应)
  • 请求不能包含请求实体
  • 最终的接收者要么是服务器,要么是第一个接收到Max-Forwards0的代理或网关
  • Via头域可以作为请求链的跟踪信息。Max-Forwards设置请求链的长度,这在测试消息传递是否存在无限循环时十分有用

2.1.8 CONNECT

保留,为了以后和可以动态转变成隧道的代理一起使用


2.2 URI

3. request-header

名称 作用
Accept 客户端接受的数据格式
Accept-Charset 客户端接受的字符集
Accept-Encoding 可接受的编码方式
Accept-Language 可接受的自然语言,q=0.7代表偏好值,默认1
Authorization 客户端非要亮明身份,虽然没必要
Expect 指定服务器的行为,如果服务器不识别,要返回417(Exception Failed)
From 如果有,是一个用户邮箱
Host
If-Match 根据实体标签判断是否匹配
If-Modified-Since 如果在此之后有更新
If-None-Match
If-Range if the entityis unchanged, send me the part(s) that I am missing; otherwise, send me the entire new entity
If-Unmodified-Since 如果在此之后没有更新
Max-Forwards TRACE中的最远距离
Proxy-Authorization 有的代理会要求验证,这个字段就是客户端提供验证信息的
Range 因为所有响应实体都是二进制序列,所以这个字段对任意实体都有效
Referer
TE
User-Agent
发布了140 篇原创文章 · 获赞 2 · 访问量 1873

猜你喜欢

转载自blog.csdn.net/weixin_40602200/article/details/103977899