2012-11-23 48 views
3

我做了一個執行httpGet的應用程序。HTTP/1.1 400使用基本身份驗證的httpGet的錯誤請求

我的應用程序使用我自己的證書,因此服務器需要用戶登錄。 對於我使用的證書this教程。

對於HTTPGET我做了這個實現:

HttpClient client = new CustClient(getApplicationContext()); // HttpClient that uses my certificates 



       // Example send http request 
       final String url = "https://ip:port/";// <--in my implementation i've a right url 
       HttpResponse response = null; 

       HttpGet httpGet = new HttpGet(url); 

       //login 
       httpGet.addHeader("Authorization", "Basic "+Base64.encodeToString("root:root".getBytes(),Base64.DEFAULT)); 

       StringBuilder testo = null; 
       try { 
       response = client.execute(httpGet); 
       InputStream contenuto = response.getEntity().getContent(); 
       BufferedReader rd = new BufferedReader(new InputStreamReader(contenuto)); 

       String line; 
       // Read response until the end 
       while ((line = rd.readLine()) != null) { 

        testo.append(line); 
       } 
      } catch (Exception e) { 

      } 

Whyen我做client.execute(HTTPGET)響應HTTP/1.1 400錯誤的請求。爲什麼? 在我的代碼中進行身份驗證是否正確?

+3

它看起來很好:)我的第一個問題是爲什麼不使用:http://hc.apache.org/httpclient-3.x/authentication.html?至於你的問題,我會首先嚐試通過普通的http,並嘗試用wireshark或其他東西截獲請求,並查看服務器錯誤日誌中的線索。 – fatfredyy

+0

爲您的評論!但是我沒有使用client.getParams(),因爲在Android HttpClient中沒有這個方法(也沒有類似的方法)。提琴手幫我解決這個問題! – Marco

回答

12

問題在於授權標題。

我們必須使用:

httpGet.addHeader("Authorization", "Basic "+Base64.encodeToString("root:root".getBytes(),Base64.NO_WRAP)); 

相反的:

httpGet.addHeader("Authorization", "Basic "+Base64.encodeToString("root:root".getBytes(),Base64.DEFAULT)); 

,因爲默認參數在字符串的末尾添加「CR」行終止,它的uncorrect如果你會用它該標題。

+3

你剛剛救了我的一天:') – LuTHieR

+3

還有我的。謝謝! – metter

+1

所以我的!謝謝! – Nico

相關問題