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?
    )



}

代码解析:

  1. 导入必要的库:

    • std 库用于标准输入输出、集合和格式化操作
    • reqwest 库用于发送 HTTP 请求
    • serde 库用于序列化和反序列化 JSON 数据
    • serde_derive 库用于自动生成序列化和反序列化代码
    • tokio 库用于异步编程
  2. 定义 Completion 结构体:

    • 使用 #[derive(Debug, Deserialize)] 宏,使结构体实现 DebugDeserialize 特性,方便打印和反序列化。
    • 使用 #[serde(rename = 'completion')] 宏,指定 JSON 字段 completion 映射到结构体字段 completion
  3. 定义 _get_user_input 函数:

    • 用于获取用户输入,但示例代码中未实际使用。
  4. 定义 send_post 函数:

    • 使用 reqwest::Client::new() 创建一个 HTTP 客户端。
    • 设置请求头,包括 User-Agentreferersec-ch-ua
    • 创建一个 HashMap 存储请求体数据。
    • 使用 client.post() 方法发送 POST 请求,并设置请求头和请求体。
    • 使用 await? 获取响应结果,并使用 text() 方法将响应体转换为字符串。
    • 返回解析后的字符串。
  5. 主函数 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?
)

}

Rust 使用 reqwest 发送 POST 请求并解析 JSON 响应

原文地址: https://www.cveoy.top/t/topic/lBPb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录