2016-10-04 155 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一起工作。

編輯 - 此代碼的工作 - 我得到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

看來,這個問題是由不請求啓用SSL,並指定443端口HTTPS URL引起的。 Vert.x httpclient默認支持HTTP請求來訪問Web主機的端口80。您需要通過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(); 

作爲參考,請查看官方文檔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