Должен ли веб-сервер игнорировать тело запроса, если метод запроса не POST или PUT? - PullRequest
1 голос
/ 06 декабря 2011

Я работал на простом сервере 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)

Я изучил источник торнадо и обнаружил, что тело анализируется только для запросов POST и PUT: https://github.com/facebook/tornado/blob/4b346bdde80c1e677ca0e235e04654f8d64b365c/tornado/httpserver.py#L258

Правильно ли игнорировать тело запроса для запросов GET, HEAD и DELETE, или это выбор сделан авторами торнадо?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

Это верно в соответствии со спецификацией протокола HTTP / 1.1.

В запросах DELETE и GET не принимаются данные сущностей, включенные в запрос.

Согласно определению, запросы на получение извлекают данные своих сущностей из URI запроса.

Запросы HEAD определяются как идентичные запросам GET, за исключением того, что сервер не должен возвращать тело ответа в ответе.

Поэтому авторы торнадо были правы, игнорируя данные "post" для GET, HEAD и DELETE.

См. Определения методов HTTP / 1.1

0 голосов
/ 06 декабря 2011

Рекомендуется не принимать запросы с полезной нагрузкой, если они не POST или PUT. Просто из соображений безопасности. Некоторые серверы, например lighttpd, возвращает ошибку сервера в этом случае.

...