2016-10-04 2 views
0

Я не знаю почему, но сообщение, которое я делаю с Vertx, просто не работает. Все время ошибка 404.
То же самое звено и тело, которое я использовал с чистой Java, и получил ответ от сервера. Что я делаю неправильно?Vertx POST не работает -> ошибка 404

HttpClient client = vertx.createHttpClient(); 

HttpClientRequest request = 
client.post("https://login.windows.net/common/oauth2/token").handler(res->{ 
       System.out.println(res.statusCode()); 
      }).putHeader(HttpHeaders.CONTENT_LENGTH,String.valueOf(buffer.length())) 
.putHeader(HttpHeaders.CONTENT_TYPE,"application/x-www-form-urlencoded").write(buffer); 
      request.end(); 

В основном я выполняю аутентификацию с помощью Azure, и для ответа я должен получить JSON с токеном и другой информацией. С чистой Java работает, но нам нужно заставить его работать с Vertx.

EDIT - этот код работает - я получаю JSON обратно, но не VertX

String url = "https://login.microsoftonline.com/common/oauth2/token"; 
URL obj = null; 
obj = new URL(url); 
HttpsURLConnection con = null; 
con = (HttpsURLConnection) obj.openConnection(); 

//add reuqest header 
con.setRequestMethod("POST"); 
con.setRequestProperty("User-Agent", USER_AGENT); 
con.setRequestProperty("Host", "login.microsoftonline.com"); 
con.setRequestProperty("Cache-Control", "no-cache"); 
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

// Send post request 
con.setDoOutput(true); 
DataOutputStream wr = null; 

wr = new DataOutputStream(con.getOutputStream()); 
wr.writeBytes(urlParameters); 
wr.flush(); 
wr.close(); 

int responseCode = 0; 
responseCode = con.getResponseCode(); 

System.out.println("\nSending 'POST' request to URL : " + url); 
System.out.println("Post parameters : " + urlParameters); 
System.out.println("Response Code : " + responseCode); 

BufferedReader in = null; 
in = new BufferedReader(
        new InputStreamReader(con.getInputStream())); 

String inputLine; 
StringBuffer response = new StringBuffer(); 

while ((inputLine = in.readLine()) != null) { 
    response.append(inputLine); 
} 

in.close(); 

//print result 
System.out.println(response.toString()); 
+0

Можете ли вы изменить свой вопрос, чтобы показать свой код с помощью JDK HttpClient, чтобы мы могли сравнивать? – tsegismont

+0

И где именно вы получаете 404? Получаете ли вы это из 'login.windows.net'? –

+0

System.out.println (res.statusCode()); дайте мне 404, но я не уверен, что запрос даже пришел в login.windows.net .... Я не уверен, что он даже отправлялся за пределы моей сети. – user155293

ответ

1

кажется, что проблема была вызвана просьбой HTTPS URL без включения SSL и указать порт 443. Vert.x HTTPclient default поддерживает HTTP-запрос для доступа к порту 80 веб-хоста. Вам необходимо включить поддержку SSL для httpclient через HttpClientOptions.

Попробуйте использовать приведенный ниже код вместо вашего.

HttpClient client = vertx.createHttpClient(new HttpClientOptions().setSsl(true).setTrustAll(true)); 
HttpClientRequest request = client.post(443, "login.windows.net", "/common/oauth2/token").handler(res->{ 
       System.out.println(res.statusCode()); 
    }).putHeader(HttpHeaders.CONTENT_LENGTH,String.valueOf(buffer.length())) 
.putHeader(HttpHeaders.CONTENT_TYPE,"application/x-www-form-urlencoded").write(buffer); 
request.end(); 

Как ссылки, пожалуйста, смотрите OFFICAL документ http://vertx.io/docs/vertx-core/java/#_using_https_with_vert_x и образец кода в GitHub https://github.com/vert-x3/vertx-examples/blob/master/core-examples/src/main/java/io/vertx/example/core/http/https/Client.java.

+0

отлично, это работает! – user155293

+0

Хорошо, хорошо поймать. Кажется, что вам нужно использовать 'client.postAbs (« https://login.windows.net/common/oauth2/token »)', если вы укажете абсолютный URL-адрес. В противном случае Vert.x HttpClient рассматривает строковый параметр как относительный URI и подключается к хосту и порту HttpClient по умолчанию. – tsegismont

Смежные вопросы