使用 Rust 发送 POST 请求并解析多个 JSON 响应获取 completion 值

本文将展示如何使用 Rust 的 reqwest 库发送 POST 请求,解析多个 JSON 响应,并提取 completion 字段的值,最终将所有 completion 值合并成一个字符串。

代码示例

use reqwest::header::{HeaderMap, HeaderValue};
use std::collections::HashMap;
use serde_json::{Value, from_str};

async fn send_post() -> Result<String, reqwest::Error> {
    let client = reqwest::Client::new();
    // post 请求头
    let mut header = HeaderMap::new();
    header.insert("User-Agent", HeaderValue::from_str("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36").expect("Unsolve the userAgent header value."));
    header.insert("referer", HeaderValue::from_str("https//www.covery.com").expect("Unsolve the referer value."));
    header.insert("sec-ch-ua", HeaderValue::from_str("sec-ch-ua").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 completions = Vec::new();
    for json_str in response_text.split("}{") {
        let mut json = json_str.to_owned();
        if !json.starts_with('{') {
            json = '{'.to_owned() + &json;
        }
        if !json.ends_with('}') {
            json = json + '}';
        }
        let value: Value = from_str(&json)?;        
        let completion = value['completion'].as_str().unwrap_or("");
        completions.push(completion.to_owned());
    }

    Ok(completions.join(""))
}

代码解析

  1. 发送 POST 请求:

    • 使用 reqwest 库创建 Client 对象,并使用 post 方法发送 POST 请求。
    • 使用 headers 方法设置请求头,包含 User-Agentreferersec-ch-ua
    • 使用 json 方法将请求体数据转换为 JSON 格式。
    • 使用 send 方法发送请求,并使用 await 等待响应。
    • 使用 text 方法获取响应的文本内容。
  2. 解析 JSON 响应:

    • 使用 split 方法将响应文本内容分割成多个 JSON 字符串,每个字符串代表一个 JSON 对象。
    • 使用 serde_json::from_str 方法将每个 JSON 字符串解析成 Value 对象。
    • 使用 Value['completion'].as_str().unwrap_or("") 获取 completion 字段的值,并将其存储在 completions 向量中。
  3. 合并 completion 值:

    • 使用 join 方法将 completions 向量中的所有字符串合并成一个字符串,并返回。

注意事项

  • 由于 JSON 字符串之间没有分隔符,所以需要手动添加分隔符 }{ 来分割字符串。
  • 需要判断每个 JSON 字符串是否以 {} 开头和结尾,因为有可能被截断,缺少这些字符。

总结

本文提供了一个使用 Rust 发送 POST 请求,解析多个 JSON 响应并提取 completion 值的完整示例。通过使用 reqwestserde_json 库,我们可以轻松地实现这一功能。

Rust 使用 reqwest 发送 POST 请求并解析多个 JSON 响应获取 completion 值

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

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