[android]-如何在向服务器发送request时附加已保存的cookie数据

应用场景:
在开发android基于手机端+服务器端的应用时,登陆->获取用户信息->获取授权用户相关业务数据(如用户工作任务安排)
,此时就涉及到在登陆后必须把保存有用户已登陆的cookie数据(和服务器端使用cookie或session来判断用户是否登陆没关系,因为这两种方式,在客户端来说,都是通过保存cookie数据来实现的)一同发送到服务器端,不然,服务器端会认为你没有登陆,而不给提供用户工作任务安排的数据

我在工作中就遇到过这问题

一开始我是这样书写代码的

01 importjava.io.IOException;
02 importjava.net.SocketTimeoutException;
03 importjava.util.ArrayList;
04 importjava.util.List;
05 importorg.apache.http.HttpResponse;
06 importorg.apache.http.NameValuePair;
07 importorg.apache.http.client.methods.HttpPost;
08 importorg.apache.http.impl.client.AbstractHttpClient;
09 importorg.apache.http.impl.client.DefaultHttpClient;
10
11
12 String result ="";
13 /* HTTP Post */
14 HttpPost httpRequest =newHttpPost(url);
15
16 List<NameValuePair> params =newArrayList<NameValuePair>();
17 params.add(newBasicNameValuePair(para, data));// jsonParameter
18
19 try{
20 // HTTP request
21 httpRequest.setEntity(newUrlEncodedFormEntity(params, HTTP.UTF_8));
22 // HTTP response
23
24 DefaultHttpClient defaultHttpClient =newDefaultHttpClient();
25 // 请求超时
26 defaultHttpClient.getParams().setParameter(
27 CoreConnectionPNames.CONNECTION_TIMEOUT,10000);
28 // 读取超时
29 defaultHttpClient.getParams().setParameter(
30 CoreConnectionPNames.SO_TIMEOUT,10000);
31
32
33 // 发送请求
34 HttpResponse httpResponse = defaultHttpClient.execute(httpRequest);
35
36 // 得到应答的字符串
37 // 200 ok
38 if(httpResponse.getStatusLine().getStatusCode() ==200) {
39 result = EntityUtils.toString(httpResponse.getEntity());
40
41 }
42 }catch(ClientProtocolException e) {
43 System.out.println("ClientProtocolException:"+ e.toString());
44 e.printStackTrace();
45 returnnull;
46 }catch(UnsupportedEncodingException e) {
47 System.out.println("UnsupportedEncodingException:"+ e.toString());
48 e.printStackTrace();
49 }catch(SocketTimeoutException e) {
50 System.out.println("SocketTimeoutException:"+ e.toString());
51 e.printStackTrace();
52 }catch(IOException e) {
53 System.out.println("IOException:"+ e.toString());
54 e.printStackTrace();
55 }

调用发现登陆成功后在获取工作任务时服务器提示未登陆,看来是没把cookie发送到服务器,由是找资料

修改后如下,有两个类
WebHelperResponse.java

1 packagecom.demo.utils;
2
3 publicclassWebHelperResponse {
4 publicString ResponseText ="";
5 publicbooleanIsOk =false;
6 publicbooleanIsError =false;
7 publicString ErrMsg ="";
8 }

WebHelper.java

view source print ?
001 packagecom.nt.android.app.slorders.utils;
002
003 importjava.io.IOException;
004 importjava.net.SocketTimeoutException;
005 importjava.util.ArrayList;
006 importjava.util.List;
007 importorg.apache.http.HttpResponse;
008 importorg.apache.http.NameValuePair;
009 importorg.apache.http.client.CookieStore;
010 importorg.apache.http.client.entity.UrlEncodedFormEntity;
011 importorg.apache.http.client.methods.HttpPost;
012 importorg.apache.http.impl.client.AbstractHttpClient;
013 importorg.apache.http.impl.client.DefaultHttpClient;
014 importorg.apache.http.message.BasicNameValuePair;
015 importorg.apache.http.params.CoreConnectionPNames;
016 importorg.apache.http.protocol.HTTP;
017 importorg.apache.http.util.EntityUtils;
018
019 publicclassWebHelper {
020
021 privatestaticCookieStore cookieStore;
022
023 publicstaticWebHelperResponse postJson(String url, String data) {
024 returnpostData(url, data,"jsondata");
025 }
026
027 publicstaticWebHelperResponse postXml(String url, String data) {
028 returnpostData(url, data,"xmldata");
029 }
030
031 // url参数中不允许有空格,否则将在new HttpPost(url)引发java.lang.IllegalArgumentException错误
032 publicstaticWebHelperResponse postData(String url, String data,
033 String para) {
034 WebHelperResponse m_response =newWebHelperResponse();
035 m_response.IsOk =false;
036 m_response.IsError =false;
037
038 String result ="";
039 /* HTTP Post */
040 HttpPost httpRequest =newHttpPost(url);
041 // param NameValuePair[]
042 // request.getParameter("name")
043 List<NameValuePair> params =newArrayList<NameValuePair>();
044 params.add(newBasicNameValuePair(para, data));// jsonParameter
045
046 try{
047 // HTTP request
048 httpRequest.setEntity(newUrlEncodedFormEntity(params, HTTP.UTF_8));
049 // HTTP response
050
051 DefaultHttpClient defaultHttpClient =newDefaultHttpClient();
052 // 请求超时
053 defaultHttpClient.getParams().setParameter(
054 CoreConnectionPNames.CONNECTION_TIMEOUT,10000);
055 // 读取超时
056 defaultHttpClient.getParams().setParameter(
057 CoreConnectionPNames.SO_TIMEOUT,10000);
058 // 添加Cookie
059 if(cookieStore !=null) {
060 defaultHttpClient.setCookieStore(cookieStore);
061 }
062
063 // 发送请求
064 HttpResponse httpResponse = defaultHttpClient.execute(httpRequest);
065 intresponseStatusCode = httpResponse.getStatusLine()
066 .getStatusCode();
067 System.out.println("response statuscode:"+ responseStatusCode);
068 // 得到应答的字符串
069 // 200 ok
070 if(responseStatusCode ==200) {
071 result = EntityUtils.toString(httpResponse.getEntity());
072 // 保存Cookie
073 cookieStore = ((AbstractHttpClient) defaultHttpClient)
074 .getCookieStore();
075
076 m_response.IsError =false;
077 m_response.IsOk =true;
078 m_response.ResponseText = result;
079
080 }elseif(responseStatusCode ==404) {
081 // 找不到页面
082 m_response.IsError =true;
083 m_response.IsOk =false;
084 System.out.println("404:page not found.");
085 m_response.ErrMsg ="不存在此服务,请检查服务器地址配置";
086 }else{
087 m_response.IsError =true;
088 m_response.IsOk =false;
089 System.out.println("error,responsestatuscode:"
090 + responseStatusCode);
091 m_response.ErrMsg ="服务出错";
092 }
093 }catch(SocketTimeoutException e) {
094 System.out.println("ClientProtocolException:"+ e.toString());
095 e.printStackTrace();
096
097 m_response.IsError =true;
098 m_response.IsOk =false;
099 m_response.ErrMsg ="连接错误:未能连接到服务器!";
100
101 }catch(IOException e) {
102 System.out.println("ClientProtocolException:"+ e.toString());
103 e.printStackTrace();
104
105 m_response.IsError =true;
106 m_response.IsOk =false;
107 m_response.ErrMsg ="错误:服务器未能提供服务!";
108
109 }
110 returnm_response;
111 }
112
113 }

更多相关文章

  1. 多个Android客户端同步服务器端表中数据架构分析
  2. Android客户端和php+mysql+apache搭建的服务器之间的简单交互
  3. Chrome for Android 也将具备 Opera Mobile 和 Amazon Silk 那种
  4. Android官方的文档中提到了模拟器中设置代理服务器的方法,即在命
  5. android下服务器推送实现 androidpn分析
  6. android上设置ftp服务器
  7. Android - 服务器json数据交互.
  8. Android多服务器同时打包多个apk

随机推荐

  1. Android(安卓)获取标题栏以及状态栏的高
  2. Android(安卓)LiveData 使用指南
  3. Android(安卓)图表框架
  4. Android(安卓)Matrix
  5. 在ubuntu 14.04 编译android 2.3.1 错误
  6. android webview js alert对话框 不能弹
  7. 关于Android中ToolBar返回
  8. Android错误:Conversion to Dalvik format
  9. dither抖动的使用
  10. 朋友圈微信额度测算,请谨慎点击!