我正在尝试对两种类型的下载使用相同的过程。两者都在发挥作用。
我想在两者上使用TDownloadURL或HTTP.Post,但无法确定如何。哪种方法以及如何做到这一点?谢谢。
第一次操作 -
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;
第二次操作 -
procedure TfrmMain.get2Click(Sender: TObject);
var
dl: TDownloadURL;
url:string;
begin
url:='http://api.census.gov/data/2010/sf1?key=KEY&get=P0010001,NAME&for=state:*';
dl := TDownloadURL.Create(self);
try
dl.URL := url;
dl.FileName := execpath+'api1.txt'; dl.ExecuteTarget(nil); dl.Free;
except
dl.Free;
end;
end;
答案 0 :(得分:3)
TDownloadURL
使用GET HTTP方法。 TIdHTTP.Post
显然使用POST方法。一般来说,两者都不适合代替另一方使用。这就是为什么两种方法都存在的原因。
POST请求可以包含GET请求所做的所有信息,还有更多信息,这使得似乎就像它应该能够做 GET可以做的所有事情,加上更多。但是,服务器不需要(也不应该被要求)以与GET相同的方式处理POST请求。
作为编写HTTP 客户端的人,您实际上无法控制这种情况。 服务器指示它将遵循哪些方法。客户需要做他们期望的事情或被拒绝访问。
Indy组件支持这两种方法,因此如果您只想使POST代码和GET代码看起来类似,那么您可以将TDownloadURL
替换为TIdHTTP.Get
。