Android 保持同一Session網路請求
- 2019 年 11 月 12 日
- 筆記
手機註冊獲取驗證碼的時候,總是說驗證碼過期,明明剛獲取的驗證碼,還是提示驗證碼過期。這種情況就是多次網路請求不在同一個Session,很可能就是用了不同的請求方法造成的(eg:httpUrlConnection和httpCilent的get請求或者post請求,建議這種情況就用同一種請求方法的post請求)
關於多次網路請求不在同一個Session(會話)的原因:每次請求的方法不同(例如:分別使用httpclient和httpUrlConnecttion等不同的網路請求方法)
使用HttpClient發送請求、接收響應很簡單,一般需要如下幾步即可。
- 創建HttpClient對象。
- 創建請求方法的實例,並指定請求URL。如果需要發送GET請求,創建HttpGet對象;如果需要發送POST請求,創建HttpPost對象。
- 如果需要發送請求參數,可調用HttpGet、HttpPost共同的setParams(HetpParams params)方法來添加請求參數;對於HttpPost對象而言,也可調用setEntity(HttpEntity entity)方法來設置請求參數。
- 調用HttpClient對象的execute(HttpUriRequest request)發送請求,該方法返回一個HttpResponse。
- 調用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取伺服器的響應頭;調用HttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包裝了伺服器的響應內容。程式可通過該對象獲取伺服器的響應內容。
- 釋放連接。無論執行方法是否成功,都必須釋放連接
簡單封裝post請求
public static String httpPost(final String url, final List<NameValuePair> list_params) { try { // 得到HttpPost對象 HttpPost httpPost = new HttpPost(url); httpPost.setEntity(new UrlEncodedFormEntity(list_params, HTTP.UTF_8)); // 客戶端使用POST方式執行請求,獲得伺服器端的回應response HttpResponse respone = httpClient.execute(httpPost); // 判斷是否請求成功 if (respone.getStatusLine().getStatusCode() == 200) { // 獲取輸入流 InputStream inStream = respone.getEntity().getContent(); int len; byte b[] = new byte[1024]; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while ((len = inStream.read(b)) != -1) { bos.write(b, 0, len); } str = bos.toString(); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return str; }
調用
List<NameValuePair> list_params = new ArrayList<NameValuePair>(); list_params.add(new BasicNameValuePair("uname", "xiaomeng")); list_params.add(new BasicNameValuePair("loginPassword", "123456")); String response = HttpUtils.httpPost(url, list_params);