связь со службой rpc с использованием indy HTTP-клиента и кода ошибки Superobject DELPHI http 400 - PullRequest
2 голосов
/ 06 июля 2011

Хорошо, я озадачен, следующий код дает мне ошибку http 400, которая говорит мне, что что-то не так с отправленными данными, но я не могу понять, что!: (

клиент настроен на кодирование URL (я пробовал оба значения true / false);

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

Ответы [ 2 ]

1 голос
/ 06 июля 2011

400 означает «Плохой запрос». Вы отправляете данные, которые сервер не может обработать. Попробуйте отправить данные JSON, используя TIdHTTP.Post(TStream) вместо 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;
0 голосов
/ 06 июля 2011

В документации написано

Базовая аутентификация доступа должна быть используется при общении с ним, и, для безопасности, по умолчанию, сервер принимает только соединения от других процессы на одной машине.

Таким образом, ваш код должен установить свойства «Имя пользователя», «Пароль» и «Базовая аутентификация» объекта запроса Indy.

(Отсутствующая аутентификация обычно вызывает HTTP 401 (неавторизованный) вместо 400.)

...