2016-10-21 3 views
0

Я работаю над Java-приложением. Мне нужно вызвать метод удаленного api. Предположим, у меня есть эта информация: remote_ip, remote_port, remote_method_name и некоторые key-value данные для публикации. Мне нужно отправить свои данные на удаленный сервер через протокол TCP. Я испытал Sockets таким образом, но не работаю:java - do json remote procedure call (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(); 

Может ли один скажи мне, как я могу вызвать метод апите в правильном пути?

Я хочу сделать это без какой-либо сторонней библиотеки, если это возможно.

Любая помощь будет с благодарностью оценена.

+0

Любая конкретная трассировка стека? Что не работает? –

+0

Не выбрасывает исключение. Просто верните '404 not found'. Я хочу знать правильный способ вызова метода удаленного api. – hamed

ответ

1

Прежде всего, хотя вы говорите, что хотите использовать сырые сокеты tcp, вы очень четко пытаетесь выполнить запрос HTTP-запроса. Это будет способ проще и удобнее использовать для этого http-клиент. Я не хочу использовать сторонние библиотеки, используйте встроенный HttpUrlConnection (example usage).

Еще одно преимущество заключается в том, что использование http-клиента даст вам сообщение об ошибке (er).

Во-вторых, вы уверены в этом типе контента? Если вы пытаетесь отправить json, обычно для заголовка будет Content-Type: application/json.

В-третьих, если вы получаете 404 не найдено, я бы сказал, что URL-адрес, который вы отправляете, неверен. Дважды проверьте домен и baseurl с тем, кто дал вам спецификации для этого API. Прямо сейчас ваш 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"> 
......