Reqwest's Client.post() возвращает 400 неверных запросов для API-интерфейса File.io
Я изучаю Rust и подумал, что было бы удобно создать CLI для обмена файлами с API File.io.
Для этого я пытаюсь использовать reqwest для отправки запроса, как описано в документации File.io:
# from file.io doc -> works fine
$ curl --data "text=this is a secret pw" https://file.io
> {"success":true,"key":"zX0Vko","link":"https://file.io/zX0Vko","expiry":"14 days"}
Когда я запускаю приведенный ниже код, я получаю ответ 400. Возможно, есть проблема с заголовками? Я попытался просмотреть документы по керлу, чтобы выяснить, чего мне не хватает, но я в тупике.
Любая помощь будет оценена.
Мой код:
extern crate reqwest;
fn main() {
let client = reqwest::Client::new();
let res = client.post("https://file.io/")
.body("text=this is a practice run")
.send();
println!("{:?}", res);
}
Ожидаемый ответ:
{"success":true,"key":"SOME_KEY","link":"SOME_LINK","expiry":"14 days"}
Фактический ответ:
Ok(Response { url: "https://file.io/", status: 400, headers: {"date": "Wed, 06 Feb 2019 03:40:35 GMT", "content-type": "application/json; charset=utf-8", "content-length": "64", "connection": "keep-alive", "x-powered-by": "Express", "x-ratelimit-limit": "5", "x-ratelimit-remaining": "4", "access-control-allow-origin": "*", "access-control-allow-headers": "Cache-Control,X-reqed-With,x-requested-with", "etag": "W/\"40-SEaBd3tIA9c06hg3p17dhWTvFz0\""} })
2 ответа
Ваши запросы не эквивалентны. curl --data
означает, что вы пытаетесь отправить HTML-форму с типом контента "x-www-form-urlencoded" или аналогичным, тогда как эта строка в вашем коде
.body("text=this is a practice run")
означает "просто текст". Вы должны использовать ReqwestBuilder::form
как описано здесь
Основная причина, по которой вы получаете код ошибки 400, заключается в том, что вы делаете неверный запрос.
Этот код ошибки подсказывает вам, что синтаксис запроса не принят сервером.
Так как вы отправляете свое тело как x-www-form-urlencoded
вам нужно изменить свой почтовый запрос следующим образом:
fn main() {
let client = reqwest::Client::new();
let mut params = HashMap::new();
params.insert("text", "This is a practice run");
let res = client.post("https://file.io/").form(¶ms).send();
if let Ok(mut result) = res {
println!("{:?}", result);
println!("Body {:?}", result.text());
}
}
Это должно отвечать как ожидаемый результат