2015-10-07 258 views
1

下面是我試圖複製的curl命令:HttpUrlConnection身份驗證不起作用

下面是curl請求。

curl user:[email protected]:8080/foo/bar -d property_one=value_one -d property_two=value_two -d property_three=value_three 

這裏是HttpURLConnection的

URL thisurl = new URL ("http://localhost:8080/foo"); 
    String encoding = Base64Encoder.base64Encode("user:password"); 

    HttpURLConnection connection = (HttpURLConnection) thisurl.openConnection(); 
    connection.setRequestMethod("GET"); 
    connection.setDoOutput(true); 
    connection.addRequestProperty("property_one", "value_one"); 
    connection.addRequestProperty("property_two", "value_two"); 
    connection.addRequestProperty("property_three", "property_three"); 
    connection.setRequestProperty ("Authorization", "Basic " + encoding); 
    InputStream content = (InputStream)connection.getInputStream(); 

在我得到一個401錯誤connection.getInputStream()行的代碼。我是否認證錯誤?

+0

不知道這是否重要,但你的網址是不同的。 – Henry

+0

你有沒有嘗試'connection.setDoOutput(true);'?獲取請求不允許輸出。 – Henry

+0

1)cURL請求是一個'POST'請求​​。任何使用'-d'的請求都會隱式成爲'POST'。 2)數據應該作爲url編碼的表單參數發送到請求的主體中,而不是在請求屬性中。 3)'Content-Type'頭部隱式設置在'application/x-www-form-urlencoded'的cURL請求中。您應該在Java代碼中執行相同的操作。 –

回答

1
connection.setRequestMethod("GET"); 

在這裏,我們設置方法「GET」,這是因爲你用curl使用的相同。

connection.setDoOutput(true); 

在這裏,你是隱式設置爲「POST」,這是不一樣的,所以你沒有任何理由期待同樣的結果。

不要手工完成所有的認證。使用java.net.Authenticator.這就是它的用途。

1

401 error因爲關閉用戶身份驗證。可能是您的沒有正確編碼身份驗證標頭。使用此代碼,它的工作對me.you可以得到這裏詳細here

URL url = new URL ("http://localhost:8080/foo"); 
String encoding = org.apache.catalina.util.Base64.encode(credentials.getBytes("UTF-8")); 

URLConnection uc = url.openConnection(); 
uc.setRequestProperty("Authorization", String.format("Basic %s", encoding));