Запрос POST в Rust
Обращение с телом передает данные вместе с адресом. Для учебных примеров удобно положить структуру или значение в формат JSON: крейт сам сериализует его и выставляет тип содержимого.
Цепочка начинается с метода отправки на клиенте, затем идет команда упаковки JSON и шаг отправки с точкой ожидания. Ответ читают так же, как после запроса без тела.
Отправим объект с именем на учебный хост:
#[tokio::main]
async fn main() {
let client = reqwest::Client::new();
let url = "https://example.com/users";
let payload = serde_json::json!({"name": "ann"});
match client.post(url).json(&payload).send().await {
Ok(resp) => {
println!("{}", resp.status().as_u16());
if let Err(e) = resp.text().await {
println!("{}", e);
}
}
Err(e) => println!("{}", e),
}
}
Хост может ответить любым кодом или не принять тело; сеть по-прежнему дает отдельную ветку ошибки. Число на экране показывает лишь код из ответа, если отправка прошла.
Тот же прием через макрос JSON без отдельной структуры:
async fn send_note(client: &reqwest::Client, url: &str) -> Result<u16, reqwest::Error> {
let payload = serde_json::json!({"title": "note"});
let resp = client.post(url).json(&payload).send().await?;
Ok(resp.status().as_u16())
}
#[tokio::main]
async fn main() {
let client = reqwest::Client::new();
let url = "https://example.com/notes";
match send_note(&client, url).await {
Ok(code) => println!("{}", code),
Err(e) => println!("{}", e),
}
}
Дан адрес:
https://example.com/log
Сформируйте JSON с полем ok
и значением true, отправьте
тело, выведите числовой код ответа
или текст ошибки сети.
Скажите, зачем к запросу с JSON подключают
флаг json при добавлении крейта
в Cargo.
Дан адрес:
https://example.com/items
Запишите функцию с исходом сбоя библиотеки,
которая отправляет JSON с полем count
равным 3, и выведите длину
текста ответа из главной функции.