我正在研究一个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方法?
如果可能,我想在没有任何第三方库的情况下这样做。
任何帮助将不胜感激。
答案 0 :(得分:1)
首先,即使你说你想使用原始tcp套接字,你也很清楚地试图发出HTTP休息请求。 方式更容易,更适合使用http客户端。我不想使用第三方库,请使用内置的HttpUrlConnection
(example usage)。
另一个优点是使用http客户端会给你一个明确的错误信息。
其次,您确定该内容类型吗?如果您尝试提交json,通常要设置的标头为Content-Type: application/json
。
第三,如果您收到 404未找到,我打赌您发布的网址不正确。仔细检查域和baseurl与谁给你这个API的规格。现在你的网址基本上是http://remote_ip:remote_port/remote_method_name,这不太可能是正确的。
答案 1 :(得分:0)
我认为原因是' remote_method_name'你提供的是错的。 因为您正在进行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">
......