某些HTTP方法(例如POST,需要在标题和double之后发送正文)CRLF.
其他人,例如GET,没有身体,对他们而言,双重CRLF标志着请求的结束.
但对于其他人:PUT,DELETE...怎么知道哪一个需要的身体吗?
通用HTTP客户端应如何对未知的HTTP方法做出反应?拒绝吗?默认情况下需要正文,或者默认情况下不需要正文?
可以理解指向相关规范的指针.
编辑:正如评论中所述,我将详细介绍我的问题.
我正在设计一个通用的HTTP 客户端,程序员可以使用它来向任何服务器发送任意HTTP请求.
客户端可以像这样使用(伪代码):
HttpClient.request(method, url [, data]);
Run Code Online (Sandbox Code Playgroud)
数据是可选的,可以是原始数据(字符串),也可以是键/值对的关联数组.
如果数据是数组,则库将对数据进行url编码,然后将数据附加到GET请求的URL ,或者将其发送到消息正文中以获取POST请求.
因此,考虑到开发人员选择的HTTP方法,我正在尝试确定此HttpClient是否必须/应该/必须/不应该在请求中包含消息体.
Jor*_*dan 14
编辑:编译清单:
Content-LengthTransfer-Encoding对于回复,这已经定义:
这个(RFC 2616)或者这个版本(来自IETF&More In-Depth)就是你想要的.根据RFC:
用于PUT:
PUT方法请求将所包含的实体存储在提供的Request-URI下.如果Request-URI引用已经存在的资源,则封闭的实体应该被视为驻留在源服务器上的实体的修改版本.如果Request-URI未指向现有资源,并且该URI能够被请求用户代理定义为新资源,则源服务器可以使用该URI创建资源.如果创建了新资源,则源服务器必须通过201(已创建)响应通知用户代理.如果修改了现有资源,则应该发送200(OK)或204(No Content)响应代码以指示请求成功完成.如果无法使用Request-URI创建或修改资源,则应该给出适当的错误响应,以反映问题的性质.实体的接收者绝不能忽略它不理解或实现的任何Content-*(例如Content-Range)头,并且在这种情况下必须返回501(未实现)响应.
并为DELETE:
DELETE方法请求源服务器删除Request-URI标识的资源.可以通过源服务器上的人为干预(或其他方式)覆盖此方法.即使从源服务器返回的状态代码表明操作已成功完成,也无法保证客户端已执行该操作.但是,服务器不应该指示成功,除非在给出响应时,它打算删除资源或将其移动到不可访问的位置.
如果响应包括描述状态的实体,则成功响应应为200(OK),如果操作尚未执行,则应为202(已接受);如果操作已颁布但响应不包括,则应为204(无内容)一个实体.
如果请求通过缓存并且Request-URI标识了一个或多个当前缓存的实体,那么这些条目应该被视为陈旧.对此方法的响应不可缓存.
我要回答这个问题:
请求不需要包含主体,尽管缺少主体可能会被解释为空主体或长度为零的主体。
RFC2616 4.3 规定:
4.3 消息正文 对于请求和响应,消息中何时允许出现消息正文的规则有所不同。
...
如果请求方法的规范(第 5.1.1 节)不允许在请求中发送实体主体,则消息主体不得包含在请求中。
浏览 5.1.1 中的方法(不包括任何扩展方法)你会发现:
9.8 跟踪
...
TRACE 请求不得包含实体。
因此从技术上讲,任何其他请求方法:
OPTIONS
GET
HEAD
POST
PUT
DELETE
CONNECT
Run Code Online (Sandbox Code Playgroud)
...可以包括身体。回到4.3:
如果请求方法不包含实体主体的定义语义,则在处理请求时应该忽略消息主体。
因此,在响应特定方法或资源的意外实体主体时,可以安全地忽略它并进行响应(包括响应代码),就好像主体未发送一样。
参考:RFC2616 超文本传输协议 -- HTTP/1.1
编辑: RFC2616 确实已经过时了,请参阅RFC7230了解最新规范。
| 归档时间: |
|
| 查看次数: |
12854 次 |
| 最近记录: |