[Android] 使用HttpGet加上基本驗證時,得到回應400 Bad Request

  • 5385
  • 0

在Android的開發上,搭配Restful Service去取得資料時,通常會使用HttpClient加上HttpGet去向Server抓取資料來源,例如說下面這樣

在Android的開發上,搭配Restful Service去取得資料時,通常會使用HttpClient加上HttpGet去向Server抓取資料來源,例如說下面這樣

 try
        {
            HttpResponse response = client.execute(get);
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                HttpEntity entity = response.getEntity();
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                entity.writeTo(out);
                out.close();
                result = out.toString();
            }
        }
        catch (IOException ex){
            result = null;
        }

而在Restful Service的安全性上面,驗證方式通常會採用基本驗證(在header中加入驗證資訊)加上https來做(這篇不會提到https的部分);而加入驗證資訊的部分會像是這樣的方式

 String encoding = Base64.encodeToString((userName+":"+userPwd).getBytes(),Base64.NO_WRAP);
 
        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet(requestUrl);
        get.addHeader("Authorization","Basic "+encoding);

這篇筆記的重點就是在Base64編碼的部分,注意到上面編碼的部分,參數是下Base64.No_WRAP,也就是整行資料輸出,不要做任何處理,而一般情況下我們可能會用很直覺的方式下了Base64_Default的參數進去,而當你用default的方式去處理時,會多了一些換行的東西,像是下圖用WireShark抓出來的header







因此產生了Bad Request的結果,這邊筆記一下也給大家參考看看了