Rust 使用 reqwest 发送 POST 请求并解析 JSON 响应
use std::{io, collections::HashMap};
use std::fmt::format;
use std::io::BufRead;
use reqwest::header::HeaderMap;
use serde::{Deserialize};
use serde_derive::Deserialize;
use std::error::Error;
#[tokio::main]
async fn main() {
// let input_buf=get_user_input();
// println!('{}',input_buf);
match send_post().await {
Ok(res)=>{
println!('{:#?}',res);
let data:Result<Vec<Completion>, Box<dyn Error>>=serde_json::from_str(&res)
.map_err(|e| format!('Deserialization error {}', e));
let completions:Vec<String>=data?.iter().map(|c| c.completion.clone()).collect();
println!('{:#?}',completions);
}
Err(e)=>{eprintln!('{:?}',e)}
}
}
#[derive(Debug, Deserialize)]
struct Completion{
#[serde(rename='completion')]
completion:String,
}
//获取用户键盘输入
fn _get_user_input() -> String {
let mut input_buf = String::new();
let _input = io::stdin().read_line(&mut input_buf).expect('fail to get user input.');
input_buf
}
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');
Ok(client.post('https://free-api.cveoy.com/v3/completions')
.headers(header)
.json(&data)
.send()
.await?
.text()
.await?
)
}
代码解析:
-
导入必要的库:
std库用于标准输入输出、集合和格式化操作reqwest库用于发送 HTTP 请求serde库用于序列化和反序列化 JSON 数据serde_derive库用于自动生成序列化和反序列化代码tokio库用于异步编程
-
定义
Completion结构体:- 使用
#[derive(Debug, Deserialize)]宏,使结构体实现Debug和Deserialize特性,方便打印和反序列化。 - 使用
#[serde(rename = 'completion')]宏,指定 JSON 字段completion映射到结构体字段completion。
- 使用
-
定义
_get_user_input函数:- 用于获取用户输入,但示例代码中未实际使用。
-
定义
send_post函数:- 使用
reqwest::Client::new()创建一个 HTTP 客户端。 - 设置请求头,包括
User-Agent、referer和sec-ch-ua。 - 创建一个
HashMap存储请求体数据。 - 使用
client.post()方法发送 POST 请求,并设置请求头和请求体。 - 使用
await?获取响应结果,并使用text()方法将响应体转换为字符串。 - 返回解析后的字符串。
- 使用
-
主函数
main:- 使用
tokio::main宏,将函数标记为异步函数。 - 调用
send_post函数发送 POST 请求,并使用match语句处理响应结果。 - 使用
serde_json::from_str方法将 JSON 字符串反序列化为Vec<Completion>。 - 从
Completion结构体中提取completion字段,并将其存储到completions数组中。 - 打印解析后的数据。
- 使用
注意:
-
示例代码中使用了一个名为
https://free-api.cveoy.com/v3/completions的 API,请确保该 API 可用并替换为您的实际 API 地址。 -
您需要根据实际的 API 响应结构,修改
Completion结构体和解析代码。 -
代码中使用了一些
expect方法,建议在实际项目中使用unwrap_or或其他更安全的错误处理方法。', 'code': '```rust use std::{io, collections::HashMap}; use std::fmt::format; use std::io::BufRead; use reqwest::header::HeaderMap; use serde::{Deserialize}; use serde_derive::Deserialize; use std::error::Error; #[tokio::main] async fn main() { // let input_buf=get_user_input();// println!('{}',input_buf); match send_post().await { Ok(res)=>{ println!('{:#?}',res); let data:Result<Vec
, Box >=serde_json::from_str(&res) .map_err(|e| format!('Deserialization error {}', e)); let completions:Vec<String>=data?.iter().map(|c| c.completion.clone()).collect(); println!('{:#?}',completions); } Err(e)=>{eprintln!('{:?}',e)}}
}
#[derive(Debug, Deserialize)] struct Completion{ #[serde(rename='completion')] completion:String, }
//获取用户键盘输入 fn _get_user_input() -> String { let mut input_buf = String::new(); let _input = io::stdin().read_line(&mut input_buf).expect('fail to get user input.'); input_buf }
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');
Ok(client.post('https://free-api.cveoy.com/v3/completions')
.headers(header)
.json(&data)
.send()
.await?
.text()
.await?
)
}
原文地址: https://www.cveoy.top/t/topic/lBPb 著作权归作者所有。请勿转载和采集!