java - 从客户端执行 json 远程过程调用(RPC)

Posted

技术标签:

【中文标题】java - 从客户端执行 json 远程过程调用(RPC)【英文标题】:java - do json remote procedure call(RPC) from client 【发布时间】:2016-10-21 08:12:43 【问题描述】:

我正在开发一个 java 应用程序。我需要调用一个远程 api 方法。假设我有这些信息:remote_ipremote_portremote_method_name 和一些 key-value 数据要发布。我需要通过 TCP 协议将我的数据发布到远程服务器。我以这种方式测试了Sockets,但没有工作:

Socket socket = new Socket(remote_ip, remote_port);
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
String params = URLEncoder.encode("key1", "UTF-8")
      + "=" + URLEncoder.encode(value1, "UTF-8");

params += "&" + URLEncoder.encode("key2", "UTF-8")
+ "=" + URLEncoder.encode(value2, "UTF-8");
wr.write("POST " + remote_method_name + " HTTP/1.0\r\n");
wr.write("Content-Length: " + params.length() + "\r\n");
wr.write("Content-Type: application/x-www-form-urlencoded\r\n");
wr.write("\r\n");

wr.write(params);
wr.flush();

谁能告诉我如何正确调用api方法?

如果可能的话,我想在没有任何第三方库的情况下这样做。

任何帮助将不胜感激。

【问题讨论】:

任何特定的堆栈跟踪?什么不工作? 不抛出任何异常。只需返回404 not found。我想知道调用远程api方法的正确方法。 【参考方案1】:

首先,即使您说要使用原始 tcp 套接字,但您显然是在尝试发出 HTTP 休息请求。为此使用 http 客户端会方式更容易和更合适。我不想使用第三方库,使用内置的HttpUrlConnection(example usage)。

另一个优点是使用 http 客户端会给你一个明确的错误消息。

其次,您确定该内容类型吗?如果您尝试提交 json,通常要设置的标头是 Content-Type: application/json

第三,如果您收到 404 not found,我敢打赌您发帖的网址不正确。与为您提供此 API 规范的人仔细检查域和 baseurl。现在您的 URL 基本上是 http://remote_ip:remote_port/remote_method_name,这不太可能是正确的。

【讨论】:

【参考方案2】:

我认为原因是您提供的“remote_method_name”是错误的。 由于您正在进行 http 调用,因此这里有一个简短的示例供您参考。 对于您现在正在阅读的页面,请求应该是:

curl -v 'http://***.com/questions/40171522/java-do-json-remote-procedure-callrpc-from-client'
*   Trying 151.101.193.69...
* Connected to ***.com (151.101.193.69) port 80 (#0)
> GET /questions/40171522/java-do-json-remote-procedure-callrpc-from-client HTTP/1.1
> Host: ***.com
> User-Agent: curl/7.43.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Cache-Control: private
< Content-Type: text/html; charset=utf-8
< Last-Modified: Fri, 21 Oct 2016 09:01:29 GMT
< X-Frame-Options: SAMEORIGIN
< X-Request-Guid: 405a2900-543b-4a97-8c62-8fa9019ab934
< Content-Length: 77809
< Accept-Ranges: bytes
< Date: Fri, 21 Oct 2016 09:18:59 GMT
< Via: 1.1 varnish
< Age: 0
< Connection: keep-alive
< X-Served-By: cache-ams4437-AMS
< X-Cache: MISS
< X-Cache-Hits: 0
< X-Timer: S1477041539.483029,VS0,VE95
< X-DNS-Prefetch-Control: off
< Set-Cookie: prov=aef7ece4-db49-60e0-3209-a2a2830d8749;         domain=.***.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly
< 
<!DOCTYPE html>
<html itemscope itemtype="http://schema.org/QAPage">
......

【讨论】:

以上是关于java - 从客户端执行 json 远程过程调用(RPC)的主要内容,如果未能解决你的问题,请参考以下文章

JSON-RPC轻量级远程调用协议介绍及使用

使用golang 实现JSON-RPC2.0

获取 异步执行调用的结果

RPC远程过程调用协议

.net下的面向工控领域的远程方法调用(RMI)中间件,客户端协议栈应答端实现

java基础十一[远程部署的RMI](阅读Head First Java记录)