Delphi 10.2转换cURL API请求遇400错误,求解决方法
解决Delphi 10.2中REST请求匹配API要求的问题
问题背景
我正在使用Delphi 10.2,API提供商生成的cURL语句可正常运行并返回结果:
curl --request POST \ --url https://api.netradyne.com/driveri/v1/tenants/N251887947004171/driver/assignment \ --header 'Accept: application/json' \ --header 'Accept-Language: en-US' \ --header 'Authorization: Bearer <access token replaced>' \ --header 'Content-Type: application/json' \ --data '{"driverID": "48625329","vehicleID": "1393","action": "login","startTimestamp": 1720439154012,"endTimestamp": 1720439208018}'
但使用REST Debugger复现时仅得到400:Bad Request - 0 bytes of data returned...响应,当前REST Debugger配置文件如下:
{ "method": "POST", "url": "https://api.netradyne.com/driveri/v1/tenants/N251887947004171/driver/assignment", "resource": "", "contenttype": "application/json", "auth": { "method": "OAUTH2", "username": "", "passwordkey": "", "password": "", "clientid": "", "clientsecret": "", "authcode": "", "accesstoken": "Bearer <access token replaced>", "accesstokensecret": "", "requesttoken": "", "requesttokensecret": "", "refreshtoken": "", "signaturemethod": "", "responsetype": "code", "endpointauth": "", "endpointaccesstoken": "", "endpointrequesttoken": "", "endpointredirect": "", "authscope": "" }, "parameters": [ { "name": "Authorization", "value": "Bearer <access token replaced>", "kind": "HEADER", "encode": false }, { "name": "Accept", "value": "application/json", "kind": "HEADER", "encode": false }, { "name": "Content-Type", "value": "application/json", "kind": "HEADER", "encode": false }, { "name": "data", "value": "{\"driverID\": \"48625329\",\"vehicleID\": \"1393\",\"action\": \"login\",\"startTimestamp\": 1720439154012,\"endTimestamp\": 1720439208018}", "kind": "BODY", "encode": false } ], "body": "" }
请问如何让Delphi生成符合该API要求的请求?
问题分析与解决步骤
1. 修正请求体传递方式
当前配置把JSON数据包装在名为data的BODY参数中,和cURL直接发送纯JSON请求体的逻辑不符,这是导致400错误的核心原因:
- 删除
parameters列表中kind: BODY的data参数 - 将JSON字符串直接填入配置的
body字段,不要添加任何额外包装:"body": "{\"driverID\": \"48625329\",\"vehicleID\": \"1393\",\"action\": \"login\",\"startTimestamp\": 1720439154012,\"endTimestamp\": 1720439208018}"
2. 补充缺失的请求头
cURL中包含Accept-Language: en-US头,但当前配置未添加,需在parameters中新增HEADER参数:
{ "name": "Accept-Language", "value": "en-US", "kind": "HEADER", "encode": false }
3. 清理重复的Authorization配置
配置同时在auth模块和parameters中设置了Authorization头,可能导致冲突,二选一即可:
- 方案一:删除
parameters中的Authorization HEADER,将auth模块的accesstoken改为仅填<access token replaced>(去掉Bearer前缀,OAuth2认证会自动添加) - 方案二:保留
parameters中的Authorization HEADER,将auth模块的method改为NONE,避免重复添加头
4. 验证最终配置
调整后的REST Debugger配置示例:
{ "method": "POST", "url": "https://api.netradyne.com/driveri/v1/tenants/N251887947004171/driver/assignment", "resource": "", "contenttype": "application/json", "auth": { "method": "NONE", "username": "", "passwordkey": "", "password": "", "clientid": "", "clientsecret": "", "authcode": "", "accesstoken": "", "accesstokensecret": "", "requesttoken": "", "requesttokensecret": "", "refreshtoken": "", "signaturemethod": "", "responsetype": "code", "endpointauth": "", "endpointaccesstoken": "", "endpointrequesttoken": "", "endpointredirect": "", "authscope": "" }, "parameters": [ { "name": "Authorization", "value": "Bearer <access token replaced>", "kind": "HEADER", "encode": false }, { "name": "Accept", "value": "application/json", "kind": "HEADER", "encode": false }, { "name": "Accept-Language", "value": "en-US", "kind": "HEADER", "encode": false }, { "name": "Content-Type", "value": "application/json", "kind": "HEADER", "encode": false } ], "body": "{\"driverID\": \"48625329\",\"vehicleID\": \"1393\",\"action\": \"login\",\"startTimestamp\": 1720439154012,\"endTimestamp\": 1720439208018}" }
5. Delphi代码实现参考
使用TRESTClient系列组件实现的代码示例:
var RESTClient: TRESTClient; RESTRequest: TRESTRequest; RESTResponse: TRESTResponse; begin RESTClient := TRESTClient.Create(nil); RESTRequest := TRESTRequest.Create(nil); RESTResponse := TRESTResponse.Create(nil); try RESTClient.BaseURL := 'https://api.netradyne.com/driveri/v1/tenants/N251887947004171/driver/assignment'; RESTRequest.Client := RESTClient; RESTRequest.Response := RESTResponse; RESTRequest.Method := rmPOST; // 添加请求头 RESTRequest.Params.AddHeader('Authorization', 'Bearer <access token replaced>'); RESTRequest.Params.AddHeader('Accept', 'application/json'); RESTRequest.Params.AddHeader('Accept-Language', 'en-US'); RESTRequest.Params.AddHeader('Content-Type', 'application/json'); // 设置请求体 RESTRequest.AddBody('{"driverID": "48625329","vehicleID": "1393","action": "login","startTimestamp": 1720439154012,"endTimestamp": 1720439208018}', ctJSON); // 执行请求 RESTRequest.Execute; // 处理响应 ShowMessage(RESTResponse.Content); finally RESTResponse.Free; RESTRequest.Free; RESTClient.Free; end; end;
内容的提问来源于stack exchange,提问作者WeststarEric
相关产品推荐
相关产品推荐

