0

我正在尝试对两种类型的下载使用相同的过程。两者都在工作。

我想在两者上都使用 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;
4

1 回答 1

3

TDownloadURL使用 GET HTTP 方法。TIdHTTP.Post显然使用POST方法。一般来说,两者都不适合用来代替另一个。这就是为什么这两种方法首先存在的原因。

POST 请求可以包含 GET 请求所做的所有信息,以及更多信息,这使得它看起来应该能够完成 GET 可以的所有事情,以及更多信息。但是,服务器不需要(也不应该期望)以与 GET 相同的方式处理 POST 请求。

作为编写 HTTP客户端的人,您并不能真正控制情况。服务器规定了它将遵循哪些方法。客户要么需要做他们期望的事情,要么被拒绝访问。

Indy 组件支持这两种方法,所以如果你只是想让你的 POST 代码和你的 GET 代码看起来相似,那么你可以TDownloadURLTIdHTTP.Get.

于 2013-04-11T18:13:29.443 回答