Я использую ящик reqwest
(версия 0.10.4
) для HTTP-вызовов в моем приложении Rust, но не могу найти примеров того, как обрабатывать вызовы API, которые могли бы возвращать более одного возможного тела ответа, главным образом для обработки ошибок.
Например, вызов API может отвечать успешной структурой JSON или структурой ошибок в формате:
{
"errors": ["..."]
}
В настоящее время у меня есть этот код для функции , но не могу понять, как определить, struct
, что мне нужно для десериализации буфера ответов, в зависимости от того, был ли успешным HTTP-запрос.
use super::responses::{Error, Response};
use crate::clients::HttpClient;
use crate::errors::HttpError;
use reqwest::header;
pub fn call() -> Result<Response, HttpError> {
let url = format!("{}/auth/userpass/login/{}", addr, user);
let response = HttpClient::new()
.post(&url)
.header(header::ACCEPT, "application/json")
.header(header::CONTENT_TYPE, "application/json")
.json(&serde_json::json!({ "password": pass }))
.send();
match response {
Ok(res) => {
let payload = res.json(); // could be `Error` or `Response` but only parses to `Response`
match payload {
Ok(j) => Ok(j),
Err(e) => Err(HttpError::JsonParse(e)),
}
}
Err(e) => Err(HttpError::RequestFailed(e)),
}
}
Я что-то пропустил в документация для reqwest
или это распространенная проблема?