当请求方法不是POST或PUT时,Web服务器是否应该忽略请求主体?

时间:2011-12-06 01:55:07

标签: python http curl tornado

我正在使用龙卷风开发一个简单的API服务器,所有请求都需要参数 access_token 。我正在玩curl,并且惊讶地发现DELETE和GET请求不会从请求体中提取此值 - 它们只允许通过查询字符串传递此参数。

即我做的时候

 curl -i -X DELETE -d access_token=1234 http://localhost:8888/

在我的Web处理程序的 delete 方法中,返回None:

 self.get_argument('access_token', None)

但是,当我这样做时

 curl -i -X DELETE http://localhost:8888/?access_token=1234

按预期产生“1234”:

 self.get_argument('access_token', None)

我检查了龙卷风来源,发现只为POST和PUT请求解析了正文:https://github.com/facebook/tornado/blob/4b346bdde80c1e677ca0e235e04654f8d64b365c/tornado/httpserver.py#L258

忽略GET,HEAD和DELETE请求的请求体是否正确,或者这是龙卷风作者的选择吗?

2 个答案:

答案 0 :(得分:2)

根据HTTP / 1.1协议规范,这是正确的。

DELETE和GET请求不接受请求中包含的实体数据。

根据定义,get请求从请求URI中检索其实体数据。

HEAD请求被定义为与GET请求相同,但服务器不应在响应中返回消息正文。

因此,龙卷风的作者是正确的,可以忽略" post" GET,HEAD和DELETE的数据。

请参阅HTTP/1.1 Method Definitions

答案 1 :(得分:0)

如果不是POST或PUT,最好不接受带有效负载的请求。只是出于安全原因。一些服务器,例如lighttpd,在这种情况下返回服务器错误。