gpt4 book ai didi

Rust 使用 Reqwest 处理错误响应体

转载 作者:行者123 更新时间:2023-12-03 11:24:16 25 4
gpt4 key购买 nike

我正在使用 reqwest (版本 0.10.4)用于 Rust 应用程序中的 HTTP 调用,但找不到任何示例说明如何处理可能返回多个可能响应主体的 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 的文档中的某些内容?或者这是一个常见问题?

最佳答案

内部,res.json()使用 serde_json crate 将 JSON 反序列化为 Rust 对象。
在 Rust 中,当您想要一个具有多个不同变体的类型时,您可以使用枚举。 serde为您实现此行为,这允许您根据反序列化的格式反序列化为枚举。例如,您可以按如下方式定义您的响应枚举:

#[derive(Serialize, Deserialize)]
#[serde(untagged)]
enum ResponseType {
Ok(/* fields */),
Err(/* fields */),
}
那里有很多事情要做,但这里是重点: #[serde(untagged)]告诉 serde 枚举应该只通过 Ok 和 Err 中的字段来区分。在您的 Rust 代码中,您可以通过变体、使用全范围的模式匹配等进行区分。
对于您的特定用例,它看起来像标准 Result<V, E>枚举应该足够好。

关于Rust 使用 Reqwest 处理错误响应体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61428829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com