0

我正在尝试使用 IdHTTP 在 Delphi XE2 中等效此 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;
4

2 回答 2

2

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

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

TStrings版本TIdHTTP.Post()完成了所有这些。通常,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()

于 2013-04-10T19:19:06.360 回答
1

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

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

TIdHTTP.Post(url,stream);
于 2013-04-10T18:55:23.177 回答