2016-10-21 78 views
0

我正在開發一個java應用程序。我需要調用遠程API方法。假設我有這個信息:remote_ip,remote_portremote_method_name和一些key-value要發佈的數據。我需要通過TCP協議將我的數據發佈到遠程服務器。我用這種方式測試Sockets,但不工作:java - 從客戶端執行json遠程過程調用(RPC)

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

任何特定的堆棧跟蹤?什麼不起作用? –

+0

不會引發任何異常。只需返回'404找不到'。我想知道調用遠程API方法的正確方法。 – hamed

回答

1

首先,即使你說你想使用原始的tcp套接字,你很清楚地嘗試做一個HTTP休息請求。這將是方式更容易和更適合使用一個http客戶端。我不想使用第三方庫,請使用內置的HttpUrlConnectionexample usage)。

另一個優點是使用http客戶端會給你一個清晰的錯誤信息。

二,你確定這種內容類型?如果您嘗試提交json,通常要設置的標頭爲Content-Type: application/json

第三,如果你得到404沒有找到,我敢打賭你發佈的網址是不正確的。仔細檢查域名和baseurl誰給了你這個API的規格。現在你的網址本質上是http://remote_ip:remote_port/remote_method_name,這很不可能是正確的。

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"> 
......