如何将OpenAI API POST请求返回的URL存入字符串变量跨文件使用
解决OpenAI图片生成API返回URL的存储与复用问题
核心修改点
- 调整
post方法的返回值类型,让它返回生成的图片URL字符串 - 正确解析API响应中的URL字段
- 修复异步函数的执行问题(原代码直接调用异步函数无法正常运行)
修改后的完整代码
use exitfailure::ExitFailure; use reqwest::{ header::{ACCEPT, AUTHORIZATION, CONTENT_TYPE}, Url, }; use serde_derive::{Deserialize, Serialize}; use std::collections::HashMap; // 引入tokio运行时,异步函数需要依赖它执行 use tokio; #[derive(Serialize, Deserialize, Debug)] struct GenerationImage {} #[derive(Serialize, Deserialize, Debug)] struct Data { url: String, } #[derive(Serialize, Deserialize, Debug)] struct Response { data: [Data; 1], } impl GenerationImage { // 修改返回类型为Result<String, ExitFailure>,用于返回图片URL async fn post(api_key: &str) -> Result<String, ExitFailure> { let key = format!("Bearer {}", api_key); let prompt = "a cat behind a tree".to_string(); let url = "https://api.openai.com/v1/images/generations"; let mut map = HashMap::new(); map.insert("prompt", prompt); let endpoint = Url::parse(url)?; let client = reqwest::Client::new(); // 解析API响应,取出Response结构体 let res = client .post(endpoint) .header(AUTHORIZATION, key) .header(CONTENT_TYPE, "application/json") .header(ACCEPT, "application/json") .json(&map) .send() .await? .json::<Response>() .await?; // 这里用?处理错误,直接返回失败结果 // 取出data数组第一个元素的url字段,作为返回值 let image_url = res.data[0].url.clone(); // 可选:打印URL验证结果 println!("生成的图片URL: {}", image_url); Ok(image_url) } } // 用tokio::main标注main函数,提供异步运行时 #[tokio::main] async fn main() -> Result<(), ExitFailure> { let api_key = "你的API密钥"; // 调用post方法获取URL,存入变量 let image_url = GenerationImage::post(&api_key).await?; // 这里可以直接使用image_url变量,或者传递给其他函数/模块 // 示例:传递给其他文件的函数 // other_module::use_image_url(&image_url); Ok(()) }
在其他文件中复用URL的方法
- 把
GenerationImage相关代码放到一个单独的模块文件(比如openai_image.rs) - 在其他文件中通过
use crate::openai_image::GenerationImage;引入模块 - 调用
GenerationImage::post(api_key).await?获取URL,存入变量后使用
注意事项
- 需要在
Cargo.toml中添加tokio依赖:tokio = { version = "1.0", features = ["full"] } - 替换代码中的
你的API密钥为真实的OpenAI API密钥
内容的提问来源于stack exchange,提问作者koda777
相关产品推荐
相关产品推荐

