您的位置:首页 > 产品设计 > UI/UE

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

2012-09-21 00:00 302 查看
应用场景:
在开发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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐