簡體   English   中英

在Delphi XE2中通過Indy使用curl

[英]using curl via Indy in Delphi XE2

我正在嘗試使用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;

--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與“名稱=值”字符串對一起使用,但是在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()

它們不是URL參數,它只是URL編碼的POST正文的一部分。

您需要對JSON字符串進行編碼並將其寫入流(也許是TMemoryStream ,然后調用:

TIdHTTP.Post(url,stream);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM