[android]-如何在向服务器发送request时附加已保存的cookie数据
2012-09-21 00:00
302 查看
应用场景:
在开发android基于手机端+服务器端的应用时,登陆->获取用户信息->获取授权用户相关业务数据(如用户工作任务安排)
,此时就涉及到在登陆后必须把保存有用户已登陆的cookie数据(和服务器端使用cookie或session来判断用户是否登陆没关系,因为这两种方式,在客户端来说,都是通过保存cookie数据来实现的)一同发送到服务器端,不然,服务器端会认为你没有登陆,而不给提供用户工作任务安排的数据
我在工作中就遇到过这问题
一开始我是这样书写代码的
调用发现登陆成功后在获取工作任务时服务器提示未登陆,看来是没把cookie发送到服务器,由是找资料
修改后如下,有两个类
WebHelperResponse.java
WebHelper.java
在开发android基于手机端+服务器端的应用时,登陆->获取用户信息->获取授权用户相关业务数据(如用户工作任务安排)
,此时就涉及到在登陆后必须把保存有用户已登陆的cookie数据(和服务器端使用cookie或session来判断用户是否登陆没关系,因为这两种方式,在客户端来说,都是通过保存cookie数据来实现的)一同发送到服务器端,不然,服务器端会认为你没有登陆,而不给提供用户工作任务安排的数据
我在工作中就遇到过这问题
一开始我是这样书写代码的
import java.io.IOException; import java.net.SocketTimeoutException; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.AbstractHttpClient; import org.apache.http.impl.client.DefaultHttpClient; String result = ""; /* HTTP Post */ HttpPost httpRequest = new HttpPost(url); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair(para, data));// jsonParameter try { // HTTP request httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); // HTTP response DefaultHttpClient defaultHttpClient = new DefaultHttpClient(); // 请求超时 defaultHttpClient.getParams().setParameter( CoreConnectionPNames.CONNECTION_TIMEOUT, 10000); // 读取超时 defaultHttpClient.getParams().setParameter( CoreConnectionPNames.SO_TIMEOUT, 10000); // 发送请求 HttpResponse httpResponse = defaultHttpClient.execute(httpRequest); // 得到应答的字符串 // 200 ok if (httpResponse.getStatusLine().getStatusCode() == 200) { result = EntityUtils.toString(httpResponse.getEntity()); } } catch (ClientProtocolException e) { System.out.println("ClientProtocolException:" + e.toString()); e.printStackTrace(); return null; } catch (UnsupportedEncodingException e) { System.out.println("UnsupportedEncodingException:" + e.toString()); e.printStackTrace(); } catch (SocketTimeoutException e) { System.out.println("SocketTimeoutException:" + e.toString()); e.printStackTrace(); } catch (IOException e) { System.out.println("IOException:" + e.toString()); e.printStackTrace(); }
调用发现登陆成功后在获取工作任务时服务器提示未登陆,看来是没把cookie发送到服务器,由是找资料
修改后如下,有两个类
WebHelperResponse.java
package com.demo.utils; public class WebHelperResponse { public String ResponseText = ""; public boolean IsOk = false; public boolean IsError = false; public String ErrMsg = ""; }
WebHelper.java
package com.nt.android.app.slorders.utils; import java.io.IOException; import java.net.SocketTimeoutException; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.CookieStore; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.AbstractHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.CoreConnectionPNames; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; public class WebHelper { private static CookieStore cookieStore; public static WebHelperResponse postJson(String url, String data) { return postData(url, data, "jsondata"); } public static WebHelperResponse postXml(String url, String data) { return postData(url, data, "xmldata"); } // url参数中不允许有空格,否则将在new HttpPost(url)引发java.lang.IllegalArgumentException错误 public static WebHelperResponse postData(String url, String data, String para) { WebHelperResponse m_response = new WebHelperResponse(); m_response.IsOk = false; m_response.IsError = false; String result = ""; /* HTTP Post */ HttpPost httpRequest = new HttpPost(url); // param NameValuePair[] // request.getParameter("name") List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair(para, data));// jsonParameter try { // HTTP request httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); // HTTP response DefaultHttpClient defaultHttpClient = new DefaultHttpClient(); // 请求超时 defaultHttpClient.getParams().setParameter( CoreConnectionPNames.CONNECTION_TIMEOUT, 10000); // 读取超时 defaultHttpClient.getParams().setParameter( CoreConnectionPNames.SO_TIMEOUT, 10000); // 添加Cookie if (cookieStore != null) { defaultHttpClient.setCookieStore(cookieStore); } // 发送请求 HttpResponse httpResponse = defaultHttpClient.execute(httpRequest); int responseStatusCode = httpResponse.getStatusLine() .getStatusCode(); System.out.println("response statuscode:" + responseStatusCode); // 得到应答的字符串 // 200 ok if (responseStatusCode == 200) { result = EntityUtils.toString(httpResponse.getEntity()); // 保存Cookie cookieStore = ((AbstractHttpClient) defaultHttpClient) .getCookieStore(); m_response.IsError = false; m_response.IsOk = true; m_response.ResponseText = result; } else if (responseStatusCode == 404) { // 找不到页面 m_response.IsError = true; m_response.IsOk = false; System.out.println("404:page not found."); m_response.ErrMsg = "不存在此服务,请检查服务器地址配置"; } else { m_response.IsError = true; m_response.IsOk = false; System.out.println("error,responsestatuscode:" + responseStatusCode); m_response.ErrMsg = "服务出错"; } } catch (SocketTimeoutException e) { System.out.println("ClientProtocolException:" + e.toString()); e.printStackTrace(); m_response.IsError = true; m_response.IsOk = false; m_response.ErrMsg = "连接错误:未能连接到服务器!"; } catch (IOException e) { System.out.println("ClientProtocolException:" + e.toString()); e.printStackTrace(); m_response.IsError = true; m_response.IsOk = false; m_response.ErrMsg = "错误:服务器未能提供服务!"; } return m_response; } }
相关文章推荐
- [android]-如何在向服务器发送request时附加已保存的cookie数据
- 如何从android应用向MYsql服务器发送数据?
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
- Android 内存不足 应用释放,如何保存数据,加广告页(笔记)
- Android发送SOAP数据给服务器调用webservice,实现手机号归属地查询
- Android突发情况(来电话,按Home键,内存不足)如何保存数据
- Android 中如何获取 H5 保存在 LocalStorage 的数据
- Android 发送全4位的int整型数据到服务器困惑
- [Android开发] 在Android开发时,如何实现和服务器的数据同步?
- Android开发之与服务器(jsp)发送、接受JSON数据
- Android发送SOAP数据给服务器调用webservice,实现手机号归属地查询
- Android利用JSON发送数据到服务器
- 【Android进阶】如何使用文件来保存程序中的数据
- android视频开发之一Android 如何使用juv-rtmp-client.jar向Red5服务器发布实时视频数据
- 如何在jsp页面下载后台服务器返回的数据并保存为txt格式
- Android 如何使用juv-rtmp-client.jar向Red5服务器发布实时视频数据
- Android之Activity(八):活动意外被回收,如何处理临时数据的保存问题?
- Android利用JSON发送数据到服务器
- android 蓝牙编程重点---如何发送和接收16进制数据
- Android客户端项目全局异常处理和服务器数据保存