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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:55:55