Rust 使用 reqwest 发送 POST 请求并解析 JSON 响应
use serde::{Deserialize, Serialize};
use serde_json::Value;
use reqwest::header::{HeaderMap, HeaderValue};
use std::collections::HashMap;
#[derive(Serialize, Deserialize)]
struct Response {
completion: String,
}
async fn send_post() -> Result<String, reqwest::Error> {
let client = reqwest::Client::new();
//post 请求头
let mut header = HeaderMap::new();
header.insert("User-Agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/110.0.0.0 Safari/537.36".parse().expect("unsolve the userAgent header value."),
);
header.insert("referer", "https://www.covery.com".parse().expect("unsolve the referer value."));
header.insert("sec-ch-ua", "sec-ch-ua".parse().expect("ms"));
// post 请求体
let mut data = HashMap::new();
data.insert("prompt", "hello");
let response_text = client.post("https://free-api.cveoy.com/v3/completions")
.headers(header)
.json(&data)
.send()
.await?
.text()
.await?;
let mut response_str = String::new();
for c in response_text.chars() {
if c == '}' {
response_str.push_str(&c.to_string());
response_str.push_str("\n");
} else {
response_str.push(c);
}
}
let mut completions = Vec::new();
for json_str in response_str.split("\n") {
if json_str.trim().is_empty() {
continue;
}
let response: Response = serde_json::from_str(json_str)?;
completions.push(response.completion);
}
let result = completions.join("");
Ok(result)
}
这个函数将返回一个字符串,其中包含所有的 completion 值。
代码说明:
- 使用
reqwest库发送 POST 请求,设置请求头和请求体。 - 使用
serde_json库解析返回的 JSON 响应数据。 - 由于返回的 JSON 数据是多个 JSON 对象拼接在一起,所以需要循环遍历每个 JSON 对象并解析
completion字段。 - 将所有
completion字段的值拼接成一个字符串,并返回。
注意:
- 请确保已经安装了
reqwest和serde_json库。 https://free-api.cveoy.com/v3/completions是一个示例 API 地址,请根据实际情况修改。- 由于 API 返回的数据格式可能会有所不同,需要根据实际情况调整代码。
希望以上内容能够帮到您。
以下是代码的进一步解释:
use serde::{Deserialize, Serialize};
use serde_json::Value;
- 导入
serde库的Deserialize和Serialize特性,用于将 JSON 数据反序列化为 Rust 结构体,以及将 Rust 结构体序列化为 JSON 数据。 - 导入
serde_json库的Value类型,用于表示 JSON 数据。
#[derive(Serialize, Deserialize)]
struct Response {
completion: String,
}
- 定义一个名为
Response的结构体,用于表示一个 JSON 对象。 - 该结构体包含一个
completion字段,类型为String。 - 使用
#[derive(Serialize, Deserialize)]特性,使该结构体可以被序列化和反序列化。
async fn send_post() -> Result<String, reqwest::Error> {
// your request code here
let response_text = client.post("https://free-api.cveoy.com/v3/completions")
.headers(header)
.json(&data)
.send()
.await?
.text()
.await?;
let mut response_str = String::new();
for c in response_text.chars() {
if c == '}' {
response_str.push_str(&c.to_string());
response_str.push_str("\n");
} else {
response_str.push(c);
}
}
let mut completions = Vec::new();
for json_str in response_str.split("\n") {
if json_str.trim().is_empty() {
continue;
}
let response: Response = serde_json::from_str(json_str)?;
completions.push(response.completion);
}
let result = completions.join("");
Ok(result)
}
- 使用
reqwest库发送 POST 请求,并获取响应文本。 - 将响应文本拆分成多个 JSON 字符串,并循环遍历每个 JSON 字符串。
- 使用
serde_json::from_str函数将 JSON 字符串解析为Response结构体。 - 将
Response结构体中的completion字段的值添加到completions数组中。 - 最后,将
completions数组中的所有字符串拼接成一个字符串,并返回。
使用示例:
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
let result = send_post().await?;
println!("completions: {}", result);
Ok(())
}
运行结果:
completions: completion1completion2completion3...
注意:
- 该代码示例使用的是
tokio运行时,请确保已经安装了tokio库。 - 由于 API 返回的数据格式可能会有所不同,需要根据实际情况调整代码。
- 为了防止代码出现错误,请仔细阅读 API 文档。
希望以上内容能够帮到您!
原文地址: https://www.cveoy.top/t/topic/lBQb 著作权归作者所有。请勿转载和采集!