2

好的,我难倒了下面的代码给了我一个 http 400 错误,告诉我提交的数据有问题,但我不知道是什么!:(

客户端设置为对 URL 进行编码(我尝试了真/假);

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

4

2 回答 2

1

400 表示“错误请求”。您正在发送服务器无法处理的数据。尝试使用TIdHTTP.Post(TStream)而不是发送 JSON 数据TIdHTTP.Post(TStrings)。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;
于 2011-07-06T07:16:18.567 回答
0

文件说

与它通信时必须使用基本访问身份验证,并且为了安全起见,默认情况下,服务器只接受来自同一机器上其他进程的连接。

因此,您的代码需要设置 Indy 请求对象的用户名、密码和 BasicAuthentication 属性。

(缺少身份验证通常会导致 HTTP 401(未授权)而不是 400。)

于 2011-07-06T04:50:02.580 回答