.NET Core API调用OpenAI Completions接口返回404问题排查
问题排查与修复方案
以下是代码中存在的几个明显问题及对应的修复方式:
1. URL大小写不匹配
OpenAI的API路由严格区分大小写,你代码中使用的https://api.openai.com/V1/completions里的V1为大写,而Postman中是小写的v1,这是导致404的核心原因。
修复:将URL改为小写路径:
var targetUrl = $"https://api.openai.com/v1/completions";
2. 请求体字段拼写错误
代码中reqBody.temprature拼写错误,正确的字段名应为temperature(少了字母e)。虽然这不会直接引发404,但会导致API无法识别温度参数,后续可能返回参数校验错误。
修复:修正字段名拼写,同时确保OpenAIRequest类的属性名与JSON字段一致:
// 修正代码中的赋值 reqBody.temperature = pSettings.Temperature; // 确保OpenAIRequest类的属性定义正确 public class OpenAIRequest { public string model { get; set; } public string prompt { get; set; } public int max_tokens { get; set; } public int temperature { get; set; } // 正确的属性名 }
3. 异步方法的同步调用风险
代码中使用.Result同步调用SendAsync和ReadAsStringAsync,在ASP.NET Core环境中极易导致死锁,违反异步编程规范。
修复:改用await关键字调用异步方法:
var response = await client.SendAsync(request); var json = await response.Content.ReadAsStringAsync();
4. HttpClient实例化不当
在方法内频繁创建HttpClient实例会导致Socket资源耗尽,不符合.NET Core的最佳实践。
修复:通过依赖注入复用HttpClient实例:
- 在
Program.cs中注册HttpClient服务:
builder.Services.AddHttpClient();
- 在业务类/控制器中注入HttpClient:
private readonly HttpClient _httpClient; public YourService(HttpClient httpClient) { _httpClient = httpClient; }
- 改造后的调用方法:
async Task<string> getOpenAIData(OpenAISettings pSettings, string promptValue) { var targetUrl = $"https://api.openai.com/v1/completions"; OpenAIRequest reqBody = new OpenAIRequest(); reqBody.model = pSettings.Model; reqBody.prompt = promptValue; reqBody.temperature = pSettings.Temperature; reqBody.max_tokens = pSettings.MaxTokens; using(var request = new HttpRequestMessage(HttpMethod.Post, targetUrl)) { request.Headers.Add("Authorization", "Bearer my-secret-code"); request.Content = JsonContent.Create(reqBody); // JsonContent默认已设置application/json头,无需重复指定 var response = await _httpClient.SendAsync(request); response.EnsureSuccessStatusCode(); // 主动抛出HTTP错误,便于调试 var json = await response.Content.ReadAsStringAsync(); return json; } }
5. 冗余的Content-Type设置
代码中先通过JsonContent.Create指定了Content-Type,又手动重复设置,属于冗余操作,可直接移除。
内容的提问来源于stack exchange,提问作者pachyderm94
相关产品推荐
相关产品推荐

