2011-07-06 146 views
2

與rpc服務通信好吧即時通信阻止下面的代碼給了我一個HTTP 400錯誤,告訴我有提交的數據有問題,但我無法弄清楚什麼!:(使用indy HTTP客戶端和superobject DELPHI http 400錯誤代碼

客戶端設置爲編碼URL(IVE嘗試都真/假);

procedure TForm2.Button1Click(Sender: TObject); 

    var 
    O:Isuperobject; 
    T:Tstringlist; 
    begin 
     T := Tstringlist.Create; 
     O := SO('{"jsonrpc": "1.0", "method": getinfo, "params": "[]" }'); 
     t.Add(o.AsString) ; 
     idhttp1.Request.ContentType := '"application/json"'; 
     memo1.lines.Add( idhttp1.post('http://127.0.0.1:8332/', T)) 


     end; 

    end. 

也許我給累誰知道,但是這是推動了牆上:\上的RPC

文檔客戶端 https://en.bitcoin.it/wiki/API_reference_%28JSON-RPC%29

用途:

超對象鏈接:http://www.progdigy.com/?page_id=6

回答

0

文檔說與它通信時

基本接入認證必須 使用,並且, 安全性,默認情況下,服務器 只接受來自同一機器上其他 進程的連接。

因此,您的代碼需要設置Indy請求對象的用戶名,密碼和BasicAuthentication屬性。

(A缺失認證通常會導致,而不是400。HTTP 401(未授權))

+0

我忘了加我設置的屬性編輯器已經USR /通! – Strspeed

1

400的意思是 「錯誤的請求」。您正在發送服務器無法處理的數據。嘗試使用TIdHTTP.Post(TStream)而不是TIdHTTP.Post(TStrings)發送您的JSON數據。 TStrings版本以一種可能會改變JSON數據的方式對字符串數據進行編碼,因此它不再是有效的JSON。 Post()的這個版本是用於'application/x-www-form-urlencoded'請求的。

試試這個:

procedure TForm2.Button1Click(Sender: TObject); 
var 
    O: Isuperobject; 
    Strm: TStringStream; 
begin 
    O := SO('{"jsonrpc": "1.0", "method": getinfo, "params": "[]" }'); 
    Strm := TStringStream.Create(O.AsString); 
    try 
    IdHTTP1.Request.ContentType := 'application/json'; 
    Memo1.Lines.Add(IdHTTP1.Post('http://127.0.0.1:8332/', Strm)); 
    finally 
    Strm.Free; 
    end; 
end; 
+0

仍然得到400錯誤,但你開悟了我,我應該知道這一點。即時即將在Tstream中嘗試它作爲Json對象。 – Strspeed