[英]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.