【问题标题】:using curl via Indy in Delphi XE2在 Delphi XE2 中通过 Indy 使用 curl
【发布时间】:2013-04-10 14:39:11
【问题描述】:

我正在尝试在 Delphi XE2 中使用 IdHTTP 来等效此 curl 操作(已知有效):

 curl http://hub.Healthdata.gov/api/action/datastore_search --data-urlencode '
 {
  "resource_id": "391792b5-9c0a-48a1-918f-2ee63caa1c54",
  "filters": {
    "provider_id": 393303
   }
   }'

我尝试了以下代码,但它不起作用......有人可以建议正确的程序吗? 它回复了错误的请求。谢谢。

procedure TfrmMain.get1Click(Sender: TObject);
var
  lHTTP: TIdHTTP;
  lParamList: TStringList;
  result:string;

begin
  lParamList := TStringList.Create;
  lParamList.Add('"resource_id": "391792b5-9c0a-48a1-918f-2ee63caa1c54"');
  lParamList.Add('"filters": {"provider_id": 393303}');

  lHTTP := TIdHTTP.Create(nil);
  try
    Result := lHTTP.Post('http://hub.Healthdata.gov/api/action/datastore_search --data-urlencode ',
     lParamList);
  finally
    FreeAndNil(lHTTP);
    FreeAndNil(lParamList);
  end;
end;

【问题讨论】:

    标签: delphi curl delphi-xe2 indy


    【解决方案1】:

    --data-urlencode 参数不是 URL 的一部分,它只是告诉 curl 如何对要发布的数据进行编码,因此您根本不需要将该部分传递给 TIdHTTP

    curl 命令中单引号之间的部分是要发布的实际数据。 --data-urlencode 告诉 curl 使用 HTTP POST 方法发送数据,使用 application/x-www-form-urlencoded 内容类型,并对数据进行 url 编码。

    TIdHTTP.Post()TStrings 版本完成了所有这些工作。通常,application/x-www-form-urlencoded 与“name=value”字符串对一起使用,但是 curl 命令中没有指定名称,只有一个值。如果 curl 提供默认名称,那么 Delphi 代码将如下所示:

    procedure TfrmMain.get1Click(Sender: TObject);
    var
      json: string;
      lHTTP: TIdHTTP;
      lParamList: TStringList;
      result:string;
    begin
      json := CRLF +
              '{' + CRLF +
              ' "resource_id": "391792b5-9c0a-48a1-918f-2ee63caa1c54",' + CRLF +
              ' "filters": {' + CRLF +
              '   "provider_id": 393303' + CRLF +
              ' }' + CRLF +
              '}';
      lParamList := TStringList.Create;
      try
        lParamList.Add('somename='+json);
        lHTTP := TIdHTTP.Create(nil);
        try
          Result := lHTTP.Post('http://hub.Healthdata.gov/api/action/datastore_search', lParamList);
        finally
          lHTTP.Free;
        end;
      finally
        lParamList.Free;
      end;
    end;
    

    否则,如果 curl 本身按原样发送指定的数据,则 Delphi 代码将如下所示:

    procedure TfrmMain.get1Click(Sender: TObject);
    var
      json: string;
      lHTTP: TIdHTTP;
      lParamList: TStringList;
      result:string;
    begin
      json := CRLF +
              '{' + CRLF +
              ' "resource_id": "391792b5-9c0a-48a1-918f-2ee63caa1c54",' + CRLF +
              ' "filters": {' + CRLF +
              '   "provider_id": 393303' + CRLF +
              ' }' + CRLF +
              '}';
      lParamList := TStringList.Create;
      try
        lParamList.Add(json);
        lHTTP := TIdHTTP.Create(nil);
        try
          Result := lHTTP.Post('http://hub.Healthdata.gov/api/action/datastore_search', lParamList);
        finally
          lHTTP.Free;
        end;
      finally
        lParamList.Free;
      end;
    end;
    

    唯一的区别是传递给TStringList.Add()的参数值。

    【讨论】:

      【解决方案2】:

      它们不是 URL 参数,它是 POST 正文的一部分,只是 URL 编码的。

      您需要对 JSON 字符串进行编码并将其写入流,可能是 TMemoryStream,然后调用:

      TIdHTTP.Post(url,stream);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-19
        • 1970-01-01
        • 1970-01-01
        • 2014-05-29
        • 2014-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多