2013-04-10 35 views
0

我試圖使用IdHTTP在Delphi XE2以等價該捲曲操作(稱爲工作):通過印地捲曲在Delphi XE2

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; 

回答

0

他們不是URL參數,它是隻是URL編碼POST身體的一部分。

您需要編碼JSON字符串,並將其寫入流,也許TMemoryStream然後調用:

TIdHTTP.Post(url,stream); 
1

--data-urlencode參數不是URL的一部分,它只是告訴捲曲如何將數據編碼被張貼了,所以你根本沒有把那部分傳遞給TIdHTTP

單引號之間的部分curl命令是要發佈的實際數據。 --data-urlencode告訴curl使用HTTP POST方法發送數據,使用application/x-www-form-urlencoded內容類型以及對數據進行網址編碼。

版本的TIdHTTP.Post()完成所有這些。通常,application/x-www-form-urlencoded與「name = value」字符串對一起使用,但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; 

否則,如果捲曲發送指定的數據,是通過本身,那麼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()