Python 当请求方法不是POST或PUT时,Web服务器是否应该忽略请求主体?
我使用tornado开发了一个简单的API服务器,所有请求都需要参数access\u令牌。我在玩curl,惊讶地发现DELETE和GET请求不会从请求体中提取这个值——它们只允许通过查询字符串传递这个参数 当我这样做的时候Python 当请求方法不是POST或PUT时,Web服务器是否应该忽略请求主体?,python,http,curl,tornado,Python,Http,Curl,Tornado,我使用tornado开发了一个简单的API服务器,所有请求都需要参数access\u令牌。我在玩curl,惊讶地发现DELETE和GET请求不会从请求体中提取这个值——它们只允许通过查询字符串传递这个参数 当我这样做的时候 curl -i -X DELETE -d access_token=1234 http://localhost:8888/ curl -i -X DELETE http://localhost:8888/?access_token=1234 在我的web处理程序的de
curl -i -X DELETE -d access_token=1234 http://localhost:8888/
curl -i -X DELETE http://localhost:8888/?access_token=1234
在我的web处理程序的delete方法中,这将返回None:
self.get_argument('access_token', None)
然而,当我
curl -i -X DELETE -d access_token=1234 http://localhost:8888/
curl -i -X DELETE http://localhost:8888/?access_token=1234
这将产生预期的“1234”:
self.get_argument('access_token', None)
我检查了tornado源,发现只有POST和PUT请求才会解析主体:
忽略GET、HEAD和DELETE请求的请求体是正确的,还是由tornado的作者做出的选择?根据HTTP/1.1协议规范,这是正确的 删除和获取请求不接受请求中包含的实体数据
根据定义,get请求从请求URI检索其实体数据 HEAD请求定义为与GET请求相同,只是服务器不应在响应中返回消息体 因此,tornado的作者忽略GET、HEAD和DELETE的“post”数据是正确的
请参见如果请求不是POST或PUT,最好不要接受带有有效负载的请求。只是因为安全原因。某些服务器(如lighttpd)在这种情况下返回服务器错误。请参阅和RFC-2616第4.3节“服务器应在任何请求中读取和转发消息正文;如果请求方法未包含实体正文的定义语义,则在处理请求时应忽略消息正文。”根据定义,get请求从请求URI检索其实体数据。“-我认为说明书上没有这么说。如果你有指针,请纠正我。所有HTTP请求都可以有一个请求体,其中包括HEAD、GET和DELETE。只是规范没有定义它的含义,而且使用它们并不常见,所以我们只讨论约定,而不是规范要求。