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

Delphi首次处理HTTP:POST请求返回400 BAD REQUEST错误排查求助

Delphi POST请求400 BAD REQUEST错误排查

以下是你代码中存在的几个关键问题,以及对应的修正方案:

1. 表单字段名错误

你在添加completion_window字段时,字段名多了一个冒号:

FormData.AddFormField('completion_window:','"24h"');

API期望的字段名是completion_window,多余的冒号会导致字段不匹配,直接引发400错误。

2. 字段值的引号处理错误

你手动给24h添加了转义双引号"24h",但AddFormField会自动处理表单数据的编码,直接传入'24h'即可,手动添加的引号会被API识别为值的一部分,不符合参数要求。

3. 手动覆盖ContentType导致格式错误

TIdMultipartFormDataStream在发送请求时,会自动生成包含边界标识的ContentType(例如multipart/form-data; boundary=----Indy10MultipartBoundaryxxxx),你手动设置的idHTTP.Request.ContentType := 'multipart/form-data';会覆盖这个正确的头部,导致服务器无法正确解析表单数据,必须删除这行代码。

修正后的完整代码

FormData := TIdMultipartFormDataStream.Create;
try
  // 添加JSON文件到表单
  FormData.AddFile('file', FilePath, 'application/json');

  // 修正字段名和值的格式
  FormData.AddFormField('input_file_id', File_ID);
  FormData.AddFormField('completion_window', '24h');

  // 设置授权头
  APIKey := 'Bearer ' + MY_API_Key;
  idHTTP.Request.CustomHeaders.AddValue('Authorization', APIKey);

  // 发送POST请求,无需手动设置ContentType
  Response := IdHTTP.Post(FinalURL, FormData);

  // 解析响应JSON
  JsonResponse := TJSONObject.ParseJSONValue(Response);
  try
    if JsonResponse <> nil then
    begin
      // 直接获取Integer类型,避免字符串转整数的冗余操作
      File_Upload_Response_Object.id := JsonResponse.GetValue<Integer>('id');
      // 解析其他参数...
    end
    else
    begin
      File_Upload_Response_Object.ErrorCode := 1;
    end;
  finally
    JsonResponse.Free;
  end;    
finally   
  FormData.Free;
  SSLHandler.Free;
  idHTTP.Free;
end;   

调试建议

如果问题依旧,可以开启Indy的请求日志功能,查看实际发送的请求内容,方便进一步定位问题:

// 在创建idHTTP后添加日志拦截器
idHTTP.Intercept := TIdLogFile.Create(nil);
TIdLogFile(idHTTP.Intercept).Filename := 'http_request_log.txt';
TIdLogFile(idHTTP.Intercept).Active := True;

内容的提问来源于stack exchange,提问作者Sergio Bonfiglio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 19:51:21