2016-10-04 2 views
0

왜 그런지 모르지만 Vertx로 수행하는 게시물은 단순히 작동하지 않습니다. 항상 오류는 404입니다.
순수한 자바에서 사용한 것과 동일한 링크 및 본문을 사용했으며 서버에서 응답을 받았습니다. 내가 뭘 잘못 했니?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을 받아야합니다. 순수한 자바에서는 작동하지만 Vertx와 함께 작동시켜야합니다.

편집 - 내가 다시 JSON을 얻을 수 있지만, 문제가 SSL을 활성화하고 443 포트를 지정하지 않고 HTTPS URL을 요청하여 발생 된 것으로 보인다 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

아니다 -이 코드는 작동합니다. Vert.x httpclient default는 웹 호스트의 포트 80에 액세스하기위한 HTTP 요청을 지원합니다. HttpClientOptions을 통해 httpclient에 대한 SSL 지원을 활성화해야합니다.

아래 코드를 직접 사용해보십시오.

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

좋아, 잘 잡는다. 절대 URL을 지정한다면'client.postAbs ("https://login.windows.net/common/oauth2/token")'를 사용해야 할 것 같습니다. 그렇지 않으면 Vert.x HttpClient는 문자열 매개 변수를 상대 URI로 처리하고 기본 HttpClient 호스트 및 포트에 연결합니다. – tsegismont

관련 문제