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
相关产品推荐
相关产品推荐

