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 值。

代码说明:

  1. 使用 reqwest 库发送 POST 请求,设置请求头和请求体。
  2. 使用 serde_json 库解析返回的 JSON 响应数据。
  3. 由于返回的 JSON 数据是多个 JSON 对象拼接在一起,所以需要循环遍历每个 JSON 对象并解析 completion 字段。
  4. 将所有 completion 字段的值拼接成一个字符串,并返回。

注意:

  • 请确保已经安装了 reqwestserde_json 库。
  • https://free-api.cveoy.com/v3/completions 是一个示例 API 地址,请根据实际情况修改。
  • 由于 API 返回的数据格式可能会有所不同,需要根据实际情况调整代码。

希望以上内容能够帮到您。

以下是代码的进一步解释:

use serde::{Deserialize, Serialize};
use serde_json::Value;
  • 导入 serde 库的 DeserializeSerialize 特性,用于将 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 文档。

希望以上内容能够帮到您!

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

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

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