Гипер POST-запрос всегда дает 400

Я пытаюсь отправить запрос POST на сайт с использованием Hyper 0.9. Запрос работает с curl:

curl https://api.particle.io/v1/devices/secret/set_light -d args=0 -d access_token=secret

и Python:

import requests
r = requests.post("https://api.particle.io/v1/devices/secret/set_light",
    data={"access_token": "secret", "args": "0"})

но моя реализация Rust, похоже, не проходит, всегда получая 400.

use hyper::client::Client;

let addr = "https://api.particle.io/v1/devices/secret/set_light";
let body = "access_token=secret&args=0";
let mut res = client.post(addr)
                .body(body)
                .send()
                .unwrap();

1 ответ

Решение

Очень полезно знать о различных инструментах для устранения проблем HTTP, подобных этой. В этом случае я использовал nc запустить тупой сервер, чтобы я мог видеть заголовки, которые отправляет HTTP-клиент (nc -l 5000). Я изменил примеры cURL и Rust, чтобы они указывали на 127.0.0.1:5000 и это был выход:

Скручивание

POST /v1/devices/secret/set_light HTTP/1.1
Host: 127.0.0.1:5000
User-Agent: curl/7.43.0
Accept: */*
Content-Length: 26
Content-Type: application/x-www-form-urlencoded

args=0&access_token=secret

Hyper:

POST /v1/devices/secret/set_light HTTP/1.1
Host: 127.0.0.1:5000
Content-Length: 26

access_token=secret&args=0

У меня нет аккаунта на сайте частиц.ио для тестирования, но я думаю, вам это нужно Content-Type заголовок. Настройка User-Agent будет хороший этикет, а Accept заголовок действительно больше для вашей выгоды, так что вы можете также установить их.

Другие вопросы по тегам