好長一段時間沒有去寫博客了,最近公司有新的需求,與服務器端交互采用與以往不同的交互方式,
開發android的童鞋們都知道,一般用post或者get直接帶參數到服務器,但是還有兩種方式,在某些情況下使用比較頻繁,當時就卡住了解決了很長一段時間,網上的教程說的都不太實用,現把自己的實際摸索出來的一套流程分享給大家。
1.需要在http請求頭中帶參數傳遞給服務器
比如:服務器需要在請求頭中加入 Authorization,並且將用戶的用戶名和密碼拼裝成字符串傳遞過去,這樣做的好處是比一般get請求更加的安全,
具體實現為:
1.1 利用java原生的HttpConnection即可實現,將Authorization和字符串當作配置設置進入即可
netUrl = new URL(path); conn = (HttpURLConnection) netUrl.openConnection(); conn.setRequestProperty("Authorization", str); conn.setRequestMethod("GET");// 大寫 LogUtils.i("服務器返回碼為==" + conn.getResponseCode()); is = conn.getInputStream(); String result = UIUtils.readStream(is); LogUtils.i("服務器返回值==" + result); Gson gson=new Gson(); final LoginEntity entity = gson.fromJson(result, LoginEntity.class); UIUtils.getHandler().post(new Runnable() { @Override public void run() { if (entity.result){ //說明登錄成功 dismissProgressDialog(); start(); SharedPreferencesUtils.saveString("loginInfo",str); }else{ UIUtils.showToastSafe("登錄失敗,請檢查用戶名或密碼是否正確"); dismissProgressDialog(); } } });
主要代碼是其中的 conn.setRequestProperty("Authorization", str);其他的代碼相信大家都耳熟能詳!
2.需要傳遞json字符串到服務器:
最新的需求是,當客戶填寫一個表單數據時,由於表單數據很多,傳統的post帶參數並不適合此類場景,而客戶端轉化為json字符串后,將參數放到json中更為省流量
實現步驟:
這里我們用三種方式,傳統的httpConnection Android的httpclient和開源框架xutils來實現
原理最核心的是,一定要把傳輸類型設置為 application/json
1.httpConnetion實現
URL url = null; try { JSONObject jsonObject = getJsonObject(); .........//將需要的參數封裝進jsonobject中 url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //設置超時時間。 conn.setConnectTimeout(30000); //區別2 : 請求方式 post conn.setRequestMethod("POST");// 大寫 conn.setRequestProperty("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"); //區別3: 必須指定兩個請求的參數。 conn.setRequestProperty("Content-Type", "application/json");//請求的類型 表單數據//區別4: 記得設置把數據寫給服務器。 conn.setDoOutput(true);//設置向服務器寫數據。 conn.setDoInput(true); conn.setUseCaches(false); conn.getOutputStream().write(String.valueOf(jsonObject).getBytes());//把數據以流的方式寫給服務器。 int code = conn.getResponseCode(); LogUtils.i("code==" + code); InputStream is = conn.getInputStream(); String s = UIUtils.readStream(is); LogUtils.i("result==" + s); } catch (Exception e) { e.printStackTrace(); LogUtils.i("請求失敗"); }
注意一定要設置請求類型 conn.setRequestProperty("Content-Type", "application/json"); 另外conn.setDoOutput(true)設置向服務器寫數據也很重要。
2.httpClient實現
//創建瀏覽器 HttpClient client = new DefaultHttpClient(); //輸入地址 HttpPost post = new HttpPost(path);
..........//將需要的參數封裝進jsonObject中 StringEntity se = new StringEntity(String.valueOf(getJsonObject())); se.setContentType("application/json");//表格采用的編碼是utf-8 post.setEntity(se); //敲回車 LogUtils.i("正在請求=="); HttpResponse response = client.execute(post); LogUtils.i("請求"); int code = response.getStatusLine().getStatusCode(); LogUtils.i("請求碼=="+code); if (code == 201) { LogUtils.i("請求成功=="+code); } else { //請求失敗 LogUtils.i("請求失敗=="+code); } } catch (Exception e) { e.printStackTrace(); LogUtils.i("請求失敗==" + e.getMessage()); }
由於對httpClient不是很熟,折騰了很久,主要是設置請求方式與一般不同,主要是這兩句起作用
StringEntity se = new StringEntity(String.valueOf(getJsonObject())); se.setContentType("application/json");
3.最后來一個xutils框架實現的
HttpUtils http = new HttpUtils(); RequestParams params = new RequestParams(); params.setContentType("application/json");
//把需要的參數封裝進jsonObject中
params.setBodyEntity(new StringEntity(String.valueOf(jsonObject))); http.send(HttpRequest.HttpMethod.POST, url, params, new RequestCallBack<String>() { @Override public void onSuccess(ResponseInfo<String> responseInfo) { LogUtils.i("請求成功"); LogUtils.i(responseInfo.result); } @Override public void onFailure(HttpException error, String msg) { LogUtils.i("請求失敗"); LogUtils.i(msg); LogUtils.i("code==" + error.getExceptionCode() + ""); } });