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(&params).send();

    if let Ok(mut result) = res {
        println!("{:?}", result);
        println!("Body {:?}", result.text());
    }
}

Это должно отвечать как ожидаемый результат

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