Связь со службой rpc с использованием indy HTTP-клиента и кода ошибки Superobject DELPHI http 400
Хорошо, я озадачен следующий код дает мне ошибку 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.
Может быть, я в Tired, кто знает, но это отвлекает от стены:\
Документация по RPC-клиенту https://en.bitcoin.it/wiki/API_reference_%28JSON-RPC%29
ОБЛАСТЬ ПРИМЕНЕНИЯ:
Ссылка на суперобъект: http://www.progdigy.com/?page_id=6
2 ответа
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;
В документации сказано
При взаимодействии с ним должна использоваться базовая аутентификация доступа, и для безопасности по умолчанию сервер принимает соединения только от других процессов на том же компьютере.
Таким образом, ваш код должен установить свойства Имя пользователя, Пароль и BasicAuthentication объекта запроса Indy.
(Отсутствующая аутентификация обычно вызывает HTTP 401 (неавторизованный) вместо 400.)