有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

来自客户端的java do json远程过程调用(RPC)

我正在开发一个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方法吗

如果可能的话,我想不使用任何第三方库

任何帮助都将不胜感激


共 (2) 个答案

  1. # 1 楼答案

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

    curl -v 'http://stackoverflow.com/questions/40171522/java-do-json-remote-procedure-callrpc-from-client'
    *   Trying 151.101.193.69...
    * Connected to stackoverflow.com (151.101.193.69) port 80 (#0)
    > GET /questions/40171522/java-do-json-remote-procedure-callrpc-from-client HTTP/1.1
    > Host: stackoverflow.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=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly
    < 
    <!DOCTYPE html>
    <html itemscope itemtype="http://schema.org/QAPage">
    ......
    
  2. # 2 楼答案

    首先,尽管您说希望使用原始tcp套接字,但很明显,您正在尝试发出HTTP rest请求。使用http客户端将更容易、更合适。如果不想使用第三方库,请使用内置的HttpUrlConnectionexample usage

    另一个优点是,使用http客户机会给您一条清晰的(er)错误消息

    第二,你确定这种内容类型吗?如果您试图提交json,通常要设置的头是Content-Type: application/json

    第三,如果你的404找不到,我敢打赌你发布的url是不正确的。与提供此API规范的人一起仔细检查域和baseurl。现在你的URL基本上是http://remote_ip:remote_port/remote_method_name,这不太可能是正确的