Vertx POST не работает -› ошибка 404

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

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());

person user155293    schedule 04.10.2016    source источник
comment
Можете ли вы отредактировать свой вопрос, чтобы показать свой код с JDK HttpClient, чтобы мы могли сравнить?   -  person tsegismont    schedule 04.10.2016
comment
И где именно вы берете 404? Ты получишь это от login.windows.net?   -  person Dominik Sandjaja    schedule 04.10.2016
comment
System.out.println(res.statusCode()); дайте мне 404, но я не уверен, пришел ли запрос вообще на login.windows.net.... Я не уверен, был ли он вообще отправлен за пределы моей сети.   -  person user155293    schedule 04.10.2016
comment
@tsegismont вопрос отредактирован   -  person user155293    schedule 04.10.2016
comment
Просто для полноты, в ваших примерах вы используете 2 разных URL-адреса, это ожидается?   -  person Paulo Lopes    schedule 04.10.2016
comment
да, извините, я не прокомментировал это. да оба login.windows.net/common/oauth2/token и login.microsoftonline.com/common/oauth2/token работает нормально... проблема не в этом   -  person user155293    schedule 04.10.2016


Ответы (1)


Похоже, проблема была вызвана запросом URL-адреса HTTPS без включения SSL и указания порта 443. Vert.x httpclient по умолчанию поддерживает 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(); 

В качестве справочной информации см. официальный документ 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.

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