You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 11调用ChatGPT API遇SSL协议错误,求解决方案

Delphi 11对接ChatGPT API时SSL协议错误的解决建议

问题概述

使用Delphi 11结合Indy 10组件开发对接ChatGPT API的应用,调用httpClient.Post时出现SSL协议错误,错误信息:

error:1409442E:SSL routines:SSL3_READ_BYTES:tlsv1 alert protocol version

相关代码如下:

function SendDataToChatGPT(data: TJSONObject): string;
var
  httpClient: TIdHTTP;
  requestURL: string;
  requestBody: TStringStream;
  IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL ;
begin
  httpClient := TIdHTTP.Create(nil);
  try
    IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.create(httpClient) ;
    httpClient.IOHandler := IdSSLIOHandlerSocketOpenSSL;
    IdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions :=[sslvTLSv1_2];

    requestURL := 'https://api.openai.com/v1/chat/completions';
    httpClient.Request.ContentType := 'application/json';
    httpClient.Request.CustomHeaders.Add('Authorization: Bearer myAPI_KEY'); //MyAPI_KEY is my personal token

    requestBody := TStringStream.Create(data.ToString, TEncoding.UTF8);
    try
      Result := httpClient.Post(requestURL, requestBody);
    finally
      requestBody.Free;
    end;
  finally
    httpClient.Free;
  end;
end;


procedure TForm10.Button5Click(Sender: TObject);
var
  data: TJSONObject;
  dataArray: TJSONArray;
  dataItem: TJSONObject;
  response: string;
begin
  // Prepare your data as a JSON object
  data := TJSONObject.Create;
  try
    data.AddPair('prompt', 'comment data and trend during interval date');
    data.AddPair('max_tokens', '50');

    // Create a JSON array to hold the data items
    dataArray := TJSONArray.Create;

    // Create a JSON object for each data item and add it to the array
    dataItem := TJSONObject.Create;
    dataItem.AddPair('Acid', 'Acetico');
    dataItem.AddPair('value', '10');
    dataItem.AddPair('data', '10/02/2003');
    dataArray.AddElement(dataItem);

    dataItem := TJSONObject.Create;
    dataItem.AddPair('Acid', 'Acetico');
    dataItem.AddPair('value', '11');
    dataItem.AddPair('data', '12/02/2003');
    dataArray.AddElement(dataItem);

    dataItem := TJSONObject.Create;
    dataItem.AddPair('Acid', 'Acetico');
    dataItem.AddPair('value', '8.5');
    dataItem.AddPair('data', '15/02/2003');
    dataArray.AddElement(dataItem);

    dataItem := TJSONObject.Create;
    dataItem.AddPair('Acid', 'Acetico');
    dataItem.AddPair('value', '10.7');
    dataItem.AddPair('data', '22/02/2003');
    dataArray.AddElement(dataItem);

    // Add the data array to the main data object
    data.AddPair('data', dataArray);

    // Send data to ChatGPT
    response := SendDataToChatGPT(data);

    // Process the response as needed
    Memo1.Lines.Text := response;
  finally
    data.Free;
  end;
end;

解决建议

1. 升级OpenSSL动态库

Indy 10依赖OpenSSL库实现SSL通信,旧版本OpenSSL可能不支持ChatGPT API要求的TLS版本(至少TLS 1.2,部分场景需TLS 1.3):

  • 确保应用目录下包含对应架构的最新OpenSSL动态库:32位程序用32位库,64位用64位库,推荐使用OpenSSL 1.1.x或3.x版本(文件如libssl-3.dll、libcrypto-3.dll或libssl11.dll、libcrypto11.dll)。
  • 淘汰1.0.x及更早版本的OpenSSL,这类版本已不再被主流服务支持。

2. 调整SSL版本配置

代码中已指定sslvTLSv1_2,可尝试扩展支持范围(若OpenSSL版本支持TLS 1.3):

IdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_3];

若OpenSSL不支持TLS 1.3,保留sslvTLSv1_2即可,但需确保OpenSSL版本支持该协议。

3. 更新Indy组件版本

确保使用最新版Indy 10组件,旧版本Indy可能存在SSL协议兼容问题,可通过Embarcadero GetIt组件管理器更新到最新稳定版。

4. 修正ChatGPT API请求格式

当前请求JSON不符合v1/chat/completions接口规范,需调整:

  • 接口无需prompt字段,改用messages数组,每个元素包含role(如user)和content字段。
  • max_tokens需为数值类型,而非字符串。
  • 自定义数据需嵌入到content中作为用户消息内容。

修正后的请求构建代码示例:

procedure TForm10.Button5Click(Sender: TObject);
var
  data: TJSONObject;
  messagesArray: TJSONArray;
  userMsg: TJSONObject;
  dataArray: TJSONArray;
  dataItem: TJSONObject;
  response: string;
begin
  data := TJSONObject.Create;
  try
    // 构建符合接口要求的messages数组
    messagesArray := TJSONArray.Create;
    userMsg := TJSONObject.Create;
    userMsg.AddPair('role', 'user');

    // 构建数据数组
    dataArray := TJSONArray.Create;
    dataItem := TJSONObject.Create;
    dataItem.AddPair('Acid', 'Acetico');
    dataItem.AddPair('value', '10');
    dataItem.AddPair('data', '10/02/2003');
    dataArray.AddElement(dataItem);

    dataItem := TJSONObject.Create;
    dataItem.AddPair('Acid', 'Acetico');
    dataItem.AddPair('value', '11');
    dataItem.AddPair('data', '12/02/2003');
    dataArray.AddElement(dataItem);

    dataItem := TJSONObject.Create;
    dataItem.AddPair('Acid', 'Acetico');
    dataItem.AddPair('value', '8.5');
    dataItem.AddPair('data', '15/02/2003');
    dataArray.AddElement(dataItem);

    dataItem := TJSONObject.Create;
    dataItem.AddPair('Acid', 'Acetico');
    dataItem.AddPair('value', '10.7');
    dataItem.AddPair('data', '22/02/2003');
    dataArray.AddElement(dataItem);

    // 组合提示语与数据作为消息内容
    userMsg.AddPair('content', Format('comment data and trend during interval date: %s', [dataArray.ToString]));
    messagesArray.AddElement(userMsg);

    data.AddPair('model', 'gpt-3.5-turbo'); // 必须指定模型
    data.AddPair('messages', messagesArray);
    data.AddPair('max_tokens', TJSONNumber.Create(50)); // 改为数值类型

    response := SendDataToChatGPT(data);
    Memo1.Lines.Text := response;
  finally
    data.Free;
  end;
end;

5. 验证请求头与编码

  • 确保ContentType设置完整:httpClient.Request.ContentType := 'application/json; charset=utf-8';
  • 代码中TStringStream已指定TEncoding.UTF8,这部分无需修改。

总结

优先解决OpenSSL库版本问题,这是SSL协议错误的最常见诱因;其次修正ChatGPT API的请求格式,避免因格式错误导致的额外异常。

内容的提问来源于stack exchange,提问作者Gianluca Colombo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:05:37