android http协议添加Authorization认证方式
今天,簡單講講android里如何使用http請求時在頭部添加Authorization認證方式。
其實也很簡單,之前需要做一個功能,在android去使用http訪問設備,但是每次的訪問需要用戶名和密碼作為Authorization請求。自己不知道怎么做,于是在網上搜素資料,最近是解決了問題。
如果通過抓包工具(Charles)可對比觀察Authentication請求效果
其中Authorization就是驗證的用戶名和密碼進行base64的字符串。下面分別介紹如何添加Authorization:
一.在OkHttp中使用Authorization認證是很簡單的,如下:
//第一個參數為用戶名,第二個參數為密碼 final String basic = Credentials.basic("zhangsan", "123456"); OkHttpClient client = new OkHttpClient.Builder().authenticator(new Authenticator() {@Overridepublic Request authenticate(Route route, Response response) throws IOException {return response.request().newBuilder().header("Authorization", basic).build();}}).build(); Request request = new Request.Builder().url("http://192.168.45.2:8080/ha").build(); client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.d("--------", "onFailure: "+e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {Log.d("---------", "onResponse: "+response.body().string());}} });二.HttpClient添加Authorization認證方式
1.Http put形式的
public static void invoke() {try {String url = "http://xxxxxx";HttpGet httpReq = new HttpGet(url);httpReq.addHeader(BasicScheme.authenticate(new UsernamePasswordCredentials("Hello", "123456"),"UTF-8", false));DefaultHttpClient httpClient = new DefaultHttpClient();HttpResponse httpResponse = httpClient.execute(httpReq);StringBuilder builder = new StringBuilder();BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));for (String s = reader.readLine(); s != null; s = reader.readLine()) {builder.append(s);}String result = builder.toString();} catch (Exception e) {e.printStackTrace();}}HttpGet 在安卓API中已經過時,可以使用HttpUrlConnectionhttpGet還可以這樣添加Authorization
public void HttpGetData() {try {HttpClient httpclient = new DefaultHttpClient();String uri = "http://www.yourweb.com"; HttpGet get = new HttpGet(uri);//添加http頭信息 get.addHeader("Authorization", "your token ");get.addHeader("Content-Type", "application/json");get.addHeader("User-Agent","your agent");HttpResponse response;response = httpclient.execute(get);int code = response.getStatusLine().getStatusCode();//檢驗狀態碼,如果成功接收數據 if (code == 200) {//返回json格式: {"id": "27JpL~j4vsL0LX00E00005","version": "abc"} String rev = EntityUtils.toString(response.getEntity()); obj = new JSONObject(rev); String id = obj.getString("id"); String version = obj.getString("version"); }} catch (Exception e) { } }2.HttpPost添加Authorization
public static void getUserData() {//1.創建 HttpClient 的實例try {//使用base64進行加密//把認證信息發到header中final String tokenStr = Base64.encode(("testclient" + ":testpass").getBytes());HashMap<String, String> hashMap = new HashMap<String, String>();String paramsStr = Utility.getHttpParamsStr(hashMap);StringEntity stringEntity = new StringEntity(paramsStr);stringEntity.setContentType("application/x-www-form-urlencoded");HttpPost post = new HttpPost(API.loginCode);post.setHeader("Content-Type", "application/json");post.setHeader("Authorization", tokenStr);HttpClient client = new DefaultHttpClient();HttpResponse httpResponse = client.execute(post);String result = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClientProtocolException e) {// TODO Auto-generated catch blockLogger.i("--------invoke--", "ClientProtocolException " + e.getMessage());e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blockLogger.i("--------invoke--", "IOException " + e.getMessage());e.printStackTrace();}}HttpPost也屬于已過時API三.httpURLConnection添加Authorization認證方式
public class HttpUtils {/** Function : 發送Post請求到服務器* Param : params請求體內容,encode編碼格式*/public static String submitPostData(String strUrlPath, Map<String, String> params, String encode) {byte[] data = getRequestData(params, encode).toString().getBytes();//獲得請求體try {URL url = new URL(strUrlPath);Logger.i("-------getUserId---", "url " + url);HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();httpURLConnection.setConnectTimeout(3000); //設置連接超時時間httpURLConnection.setDoInput(true); //打開輸入流,以便從服務器獲取數據httpURLConnection.setDoOutput(true); //打開輸出流,以便向服務器提交數據httpURLConnection.setRequestMethod("POST"); //設置以Post方式提交數據httpURLConnection.setUseCaches(false); //使用Post方式不能使用緩存//設置請求體的類型是文本類型httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");//設置請求體的長度httpURLConnection.setRequestProperty("Content-Length", String.valueOf(data.length));//獲得輸出流,向服務器寫入數據OutputStream outputStream = httpURLConnection.getOutputStream();outputStream.write(data); // data 實際就是 map中的key=value 拼接的字符串<span style="color: rgb(255, 0, 0);"> final String tokenStr = "Basic " + Base64.encode(("Hello" + ":123456").getBytes());httpURLConnection.addRequestProperty("Authorization", tokenStr); </span>int response = httpURLConnection.getResponseCode(); //獲得服務器的響應碼if(response == HttpURLConnection.HTTP_OK) {InputStream inptStream = httpURLConnection.getInputStream();return dealResponseResult(inptStream); //處理服務器的響應結果}} catch (IOException e) {//e.printStackTrace();return "err: " + e.getMessage().toString();}return "-1";}public static StringBuffer getRequestData(Map<String, String> params, String encode) {StringBuffer stringBuffer = new StringBuffer(); //存儲封裝好的請求體信息try {for(Map.Entry<String, String> entry : params.entrySet()) {stringBuffer.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), encode)).append("&");}stringBuffer.deleteCharAt(stringBuffer.length() - 1); //刪除最后的一個"&"} catch (Exception e) {e.printStackTrace();}return stringBuffer;}/** Function : 處理服務器的響應結果(將輸入流轉化成字符串)* Param : inputStream服務器的響應輸入流*/public static String dealResponseResult(InputStream inputStream) {String resultData = null; //存儲處理結果ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();byte[] data = new byte[1024];int len = 0;try {while((len = inputStream.read(data)) != -1) {byteArrayOutputStream.write(data, 0, len);}} catch (IOException e) {e.printStackTrace();}resultData = new String(byteArrayOutputStream.toByteArray());Logger.i("-------getUserId---", "dealResponseResult " + resultData);return resultData;}}final String tokenStr = "Basic " + Base64.encode(("Hello" + ":123456").getBytes());
?httpURLConnection.addRequestProperty("Authorization", tokenStr); ??
? 就是設置 ?Authentication 的關鍵,是Base64把用戶名,密碼以 name:key 方式加密,然后再加到
?"Basic " 后面 ,二服務端會根據 Oauth框架進行解析,
簡單講講,http請求添加Authorization認證方式 其實就是在http頭部添加一個字段Authorization(HTTP授權的授權證書),它的值為Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==(用戶名:密碼的base64編碼)。具體怎么添加,例子里寫的很清楚。下面聚一下HTTP Request Header請求頭信息對照表和HTTP Responses Header 響應頭信息對照表。
HTTP Request Header請求頭信息對照表:
| Accept | 指定客戶端能夠接收的內容類型 | Accept: text/plain, text/html |
| Accept-Charset | 瀏覽器可以接受的字符編碼集。 | Accept-Charset: iso-8859-5 |
| Accept-Encoding | 指定瀏覽器可以支持的web服務器返回內容壓縮編碼類型。 | Accept-Encoding: compress, gzip |
| Accept-Language | 瀏覽器可接受的語言 | Accept-Language: en,zh |
| Accept-Ranges | 可以請求網頁實體的一個或者多個子范圍字段 | Accept-Ranges: bytes |
| Authorization | HTTP授權的授權證書 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
| Cache-Control | 指定請求和響應遵循的緩存機制 | Cache-Control: no-cache |
| Connection | 表示是否需要持久連接。(HTTP 1.1默認進行持久連接) | Connection: close |
| Cookie | HTTP請求發送時,會把保存在該請求域名下的所有cookie值一起發送給web服務器。 | Cookie: $Version=1; Skin=new; |
| Content-Length | 請求的內容長度 | Content-Length: 348 |
| Content-Type | 請求的與實體對應的MIME信息 | Content-Type: application/x-www-form-urlencoded |
| Date | 請求發送的日期和時間 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
| Expect | 請求的特定的服務器行為 | Expect: 100-continue |
| From | 發出請求的用戶的Email | From: user@email.com |
| Host | 指定請求的服務器的域名和端口號 | Host: www.zcmhi.com |
| If-Match | 只有請求內容與實體相匹配才有效 | If-Match: "737060cd8c284d8af7ad3082f209582d" |
| If-Modified-Since | 如果請求的部分在指定時間之后被修改則請求成功,未被修改則返回304代碼 | If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
| If-None-Match | 如果內容未改變返回304代碼,參數為服務器先前發送的Etag,與服務器回應的Etag比較判斷是否改變 | If-None-Match: "737060cd8c284d8af7ad3082f209582d" |
| If-Range | 如果實體未改變,服務器發送客戶端丟失的部分,否則發送整個實體。參數也為Etag | If-Range: "737060cd8c284d8af7ad3082f209582d" |
| If-Unmodified-Since | 只在實體在指定時間之后未被修改才請求成功 | If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
| Max-Forwards | 限制信息通過代理和網關傳送的時間 | Max-Forwards: 10 |
| Pragma | 用來包含實現特定的指令 | Pragma: no-cache |
| Proxy-Authorization | 連接到代理的授權證書 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
| Range | 只請求實體的一部分,指定范圍 | Range: bytes=500-999 |
| Referer | 先前網頁的地址,當前請求網頁緊隨其后,即來路 | Referer: http://blog.csdn.net/coder_pig |
| TE | 客戶端愿意接受的傳輸編碼,并通知服務器接受接受尾加頭信息 | TE: trailers,deflate;q=0.5 |
| Upgrade | 向服務器指定某種傳輸協議以便服務器進行轉換(如果支持) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
| User-Agent | User-Agent的內容包含發出請求的用戶信息 | User-Agent: Mozilla/5.0 (Linux; X11) |
| Via | 通知中間網關或代理服務器地址,通信協議 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
| Warning | 關于消息實體的警告信息 | Warn: 199 Miscellaneous warning |
HTTP Responses Header 響應頭信息對照表:
Accept-Ranges | 表明服務器是否支持指定范圍請求及哪種類型的分段請求 | Accept-Ranges: bytes |
| Age | 從原始服務器到代理緩存形成的估算時間(以秒計,非負) | Age: 12 |
| Allow | 對某網絡資源的有效的請求行為,不允許則返回405 | Allow: GET, HEAD |
| Cache-Control | 告訴所有的緩存機制是否可以緩存及哪種類型 | Cache-Control: no-cache |
| Content-Encoding | web服務器支持的返回內容壓縮編碼類型 | Content-Encoding: gzip |
| Content-Language | 響應體的語言 | Content-Language: en,zh |
| Content-Length | 響應體的長度 | Content-Length: 348 |
| Content-Location | 請求資源可替代的備用的另一地址 | Content-Location: /index.htm |
| Content-MD5 | 返回資源的MD5校驗值 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== |
| Content-Range | 在整個返回體中本部分的字節位置 | Content-Range: bytes 21010-47021/47022 |
| Content-Type | 返回內容的MIME類型 | Content-Type: text/html; charset=utf-8 |
| Date | 原始服務器消息發出的時間 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
| ETag | 請求變量的實體標簽的當前值 | ETag: "737060cd8c284d8af7ad3082f209582d" |
| Expires | 響應過期的日期和時間 | Expires: Thu, 01 Dec 2010 16:00:00 GMT |
| Last-Modified | 請求資源的最后修改時間 | Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT |
| Location | 用來重定向接收方到非請求URL的位置來完成請求或標識新的資源 | Location: http://blog.csdn.net/coder_pig |
| Pragma | 包括實現特定的指令,它可應用到響應鏈上的任何接收方 | Pragma: no-cache |
| Proxy-Authenticate | 它指出認證方案和可應用到代理的該URL上的參數 | Proxy-Authenticate: Basic |
android http協議添加Authorization認證方式 就講完了
就這么簡單。
總結
以上是生活随笔為你收集整理的android http协议添加Authorization认证方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 如何使用SAX解析XML
- 下一篇: android http通过post请求