当请求方法不是POST或PUT时,web服务器应该忽略请求体吗?
我在用tornado搭建一个简单的API服务器,所有请求都需要一个叫access_token的参数。我在用curl测试的时候,发现DELETE和GET请求不会从请求体中提取这个值——它们只允许通过查询字符串来传递这个参数。
也就是说,当我执行
curl -i -X DELETE -d access_token=1234 http://localhost:8888/
在我的网页处理器的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)
我查看了tornado的源代码,发现请求体只会被POST和PUT请求解析:https://github.com/facebook/tornado/blob/4b346bdde80c1e677ca0e235e04654f8d64b365c/tornado/httpserver.py#L258
那么,对于GET、HEAD和DELETE请求忽略请求体,这种做法是正确的吗?还是说这是tornado作者的选择?
2 个回答
0
如果请求不是POST或PUT类型,最好不要接受带有数据的请求。这主要是出于安全考虑。有些服务器,比如lighttpd,在这种情况下会返回服务器错误。
2
这段话是根据HTTP/1.1协议的规定来说的。
DELETE和GET请求是不接受请求中包含的数据的。
根据定义,GET请求是从请求的URI(统一资源标识符)中获取数据的。
HEAD请求和GET请求是一样的,只不过服务器在响应时不返回消息体。
所以,tornado的作者在处理GET、HEAD和DELETE请求时忽略“post”数据是正确的。
你可以查看HTTP/1.1方法定义了解更多信息。