Завиток POST - 411 Требуемая длина

29

У нас есть RestFUL API, который мы строим на PHP. Если мы сделаем запрос:

curl -u api-key:api-passphrase https://api.domain.com/v1/product -X POST

Мы вернемся:

411 - Length Required

Хотя, если мы просто добавим -d ""запрос, он будет работать, а ошибки 411 нет. Есть ли способ не требовать добавления -d к команде curl?

Мы используем веб-сервер lighttpd и считаем, что его lighttpd НЕ php, который возвращает ошибку 411.

Джастин
источник

Ответы:

47

Вы правы - lighttpd не поддерживает запросы POST с пустым телом сообщения без заголовка «Content-Length», установленного в ноль, и CURL отправляет такой запрос. Там и обратно спорят о том, кто прав, но, на мой взгляд, lighttpd не работает. POST без Content-Length и Transfer-Encoding совершенно легален и не имеет тела сообщения.

Добавление -d ""заставляет CURL отправлять Content-Length: 0заголовок, который решает проблему.

Вы можете изменить lighttp. Найдите код, который выдает ошибку 411, и вместо этого установите длину содержимого на ноль.

Дэвид Шварц
источник
Спасибо за отличное объяснение, так что нет никакого флага для перехода к curl помимо -d ""директивы lighttpd для установки? -d ""просто выглядит как взломать.
Джастин
1
Это взломать Если вы хотите решить проблему по-настоящему, вам придется изменить lighttpd. Вместо этого вы можете использовать, -d @/dev/nullесли вы думаете, что выглядит лучше. Вы также можете использовать -H "Content-Length: 0". (Я проверил оба из них, они работают.)
Дэвид Шварц
Хорошо спасибо. -d ""кажется лучшим вариантом.
Джастин