使用 Apache Http Client 4 对比特币钱包的简单 JSON-RPC 调用给出“响应失败”

Posted

技术标签:

【中文标题】使用 Apache Http Client 4 对比特币钱包的简单 JSON-RPC 调用给出“响应失败”【英文标题】:Simple JSON-RPC call to Bitcoin wallet with Apache Http Client 4 gives "failed to respond" 【发布时间】:2014-05-25 12:18:48 【问题描述】:

我正在尝试使用 Apache Http-components HttpClient 对“getinfo”方法进行简单的 JSON-RPC 调用,但我得到的只是:

org.apache.http.NoHttpResponseException: 127.0.0.1:33002 failed to respond

我的 JSON RPC 请求是:

"method": "getinfo", "params": [], "id": 1

代码是:

CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
    new AuthScope( "localhost" , 33002 ) ,
    new UsernamePasswordCredentials( "loginxxx" , "passxxx" ) );

CloseableHttpClient client = HttpClients.custom()
    .setDefaultCredentialsProvider( credsProvider )
    .build();

HttpPost request = new HttpPost( "http://127.0.0.1:33002/jsonrpc" );

request.setEntity( new StringEntity( "\"method\":\"getinfo\",\"params\":[],\"id\":1" ) );

HttpResponse response = client.execute( request );

为什么服务器没有响应?如何改进我的 JSON-RPC 请求?

来自 apache 的完整跟踪日志:http://pastebin.com/K2HTZ4nR

编辑:将两个主机名更改为 127.0.0.1 或将两者都更改为 localhost 没有帮助。将 id 放入 \"1\" 也无济于事。 EntityUtils.consume 也无济于事。也从URL 中删除/jsonrpc

【问题讨论】:

【参考方案1】:
DEBUG org.apac6.http.wire - http-outgoing-0 >> "POST / HTTP/1.1[\r][\n]"
DEBUG org.apac6.http.wire - http-outgoing-0 >> "Content-Length: 41[\r][\n]"
DEBUG org.apac6.http.wire - http-outgoing-0 >> "Content-Type: text/plain; charset=ISO-8859-1[\r][\n]"
DEBUG org.apac6.http.wire - http-outgoing-0 >> "Host: localhost:33002[\r][\n]"
DEBUG org.apac6.http.wire - http-outgoing-0 >> "Connection: Keep-Alive[\r][\n]"
DEBUG org.apac6.http.wire - http-outgoing-0 >> "User-Agent: Apache-HttpClient/4.3.3 (java 1.5)[\r][\n]"
DEBUG org.apac6.http.wire - http-outgoing-0 >> "Accept-Encoding: gzip,deflate[\r][\n]"
DEBUG org.apac6.http.wire - http-outgoing-0 >> "[\r][\n]"
DEBUG org.apac6.http.wire - http-outgoing-0 >> ""method":"getinfo","params":[],"id":"3""
DEBUG org.apac6.http.wire - http-outgoing-0 << "end of stream"

HTTP 请求消息中的某些内容使服务器端请求处理程序阻塞并断开连接而不返回状态代码。

很难说这到底是什么,但Content-Type: text/plain; charset=ISO-8859-1 对我来说似乎很可疑。内容 mime 类型可能是 application/json

【讨论】:

将内容类型更改为 json 没有帮助。参考比特币文档,text/plain 可以:en.bitcoin.it/wiki/API_reference_%28JSON-RPC%29【参考方案2】:

调用代码正常。当您在比特币中配置port设置而不是rpcport时会出现此问题。

所以我正在连接比特币钱包中的一些其他服务(可能只是比特币网络服务 p2p 服务器)。

【讨论】:

以上是关于使用 Apache Http Client 4 对比特币钱包的简单 JSON-RPC 调用给出“响应失败”的主要内容,如果未能解决你的问题,请参考以下文章

Java 中使用 HttpClient 4.3.6 进行文件上传

使用 Apache Http Client 4.5.3 从 jdk1.6.0_45 到 API Gateway 的简单 POST 请求

HTTP发送RAW请求注意的问题

ThreadSafeClientConnManager用来支持多线程的使用http client

Apache/2.4.9启动错误:AH01630: client denied by server configuration

Android 项目使用 httpclient --> http.client (apache), post/get 方法