2016-10-21 2 views
0

Java 응용 프로그램에서 작업하고 있습니다. 원격 API 메서드를 호출해야합니다. 이 정보가 있다고 가정하면 remote_ip, remote_port, remote_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 메서드를 호출 할 수 있습니다 말해 주시겠습니까?

가능한 경우 제 3 자 라이브러리없이 수행하고 싶습니다.

도움이 되었으면 감사하겠습니다.

+0

어떤 특정 스택 추적? 작동하지 않는 것은 무엇입니까? –

+0

예외를 throw하지 않습니다. '404 not found' 만 반환하면됩니다. 원격 API 메서드를 호출하는 올바른 방법을 알고 싶습니다. – hamed

답변

1

우선, 원시 TCP 소켓을 사용하려는 경우에도 HTTP 정지 요청을 확실히 시도하고 있습니다. way 더 쉽고 http 클라이언트를 사용하는 것이 더 적절할 것입니다. 타사 라이브러리를 사용하고 싶지 않으므로 내장 된 HttpUrlConnection (example usage)을 사용하십시오.

또 다른 이점은 http 클라이언트를 사용하면 명확한 오류 메시지가 나타납니다.

둘째, 해당 콘텐츠 유형에 대해 확실합니까? json을 제출하려는 경우 일반적으로 설정할 헤더는 Content-Type: application/json입니다.

셋째, 404를 찾지 못하면, 내가 게시 한 URL이 잘못되었을 것입니다. 이 API에 대한 스펙을 제공 한 사람과 도메인 및 baseurl을 다시 확인하십시오. 현재 귀하의 URL은 본질적으로 정확할 가능성이 희박한 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"> 
......