Rust 使用 reqwest 库发送 POST 请求并解析 JSON 数据
use std::{io, collections::HashMap};
use reqwest::header::HeaderMap;
use serde::{Deserialize, Deserializer};
#[tokio::main]
async fn main() {
match send_post().await {
Ok(res) => {
// 解析返回的 JSON 数据
let data: Vec<Completion> = serde_json::Deserializer::from_str(&res)
.into_iter()
.map(|v| Completion::deserialize(v).unwrap())
.collect();
// 获取 completion 字段的值
let completions: Vec<String> = data.iter().map(|c| c.completion.clone()).collect();
println!('{:#?}', completions);
}
Err(e) => {
eprintln!('{:?}', e)
}
}
}
// 表示一个 completion 对象
#[derive(Debug, Deserialize)]
struct Completion {
#[serde(rename = 'completion')]
completion: String,
}
async fn send_post() -> Result<String, reqwest::Error> {
let client = reqwest::Client::new();
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'));
let mut data = HashMap::new();
data.insert('prompt', 'hello');
Ok(client.post('https://free-api.cveoy.com/v3/completions')
.headers(header)
.json(&data)
.send()
.await?
.text()
.await?)
}
这段代码使用 serde_json 库中的 Deserializer 来解析返回的 JSON 数据,并提取每个 completion 字段的值。具体步骤如下:
- 将返回的 JSON 数据字符串转换为
serde_json::Deserializer对象。 - 使用
into_iter()方法将Deserializer转换为迭代器。 - 使用
map()方法将每个 JSON 对象解析为Completion结构体。 - 使用
collect()方法将解析后的Completion结构体集合转换为Vec<Completion>。 - 使用
iter()方法遍历Vec<Completion>,并使用map()方法提取每个Completion结构体的completion字段的值。 - 使用
collect()方法将提取的completion值转换为Vec<String>。
通过以上步骤,就可以成功地获取每个 completion 对象中的 completion 字段的值,并将其存储在 Vec<String> 中。
注意:
serde_json库需要提前在项目中添加依赖。Completion结构体需要使用#[derive(Deserialize)]特性来实现Deserializetrait,以便可以从 JSON 数据中解析。completion字段使用#[serde(rename = 'completion')]特性来指定从 JSON 数据中获取的字段名称。
希望这个修改后的代码示例能够帮助你解决问题。如果你还有其他问题,请随时提出。
原文地址: https://www.cveoy.top/t/topic/lBNh 著作权归作者所有。请勿转载和采集!