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_ip
、remote_port
、remote_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)的主要内容,如果未能解决你的问题,请参考以下文章