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

1 投票
2 回答
1593 浏览
提问于 2025-04-17 07:47

我在用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方法定义了解更多信息。

撰写回答