天天看点

Android与web服务器数据交互编程---1

之前曾经写过一篇文章介绍与web服务器的http数据交互方式实现。

这篇文章主要总结博主在开发过程中遇到的问题,做笔记以备翻阅

开发遇到的问题:

1之前使用webservices接口的方式与web通信

可实现数据的获取,能简单通过参数传递的方式与web数据简单交互,但涉及request的业务流程无法正常执行(现有的web服务器,内部业务流程多通过request传递)

2使用http与web通讯,数据同样通过参数传递,基本实现大部分功能,在业务流程方面貌似同样遇到了阻力,最终查到原因:缺少session中必要的信息

需要解决的问题,如何保证session在移动端跟web服务器端保持一致

度娘一查资料一大堆:

针对目前项目具体应用 提出问题:如何保持xutils框架下session保持

进入正题:

以登录为例:

获取sessionid并保存

private void login() {
		String uploadHost = "http://10.1.11.90:8080/BCVNTest";
		RequestParams params = new RequestParams();

		// params.setHeader("Cookie", "seesionid");

		params.addQueryStringParameter("method", "login");
		params.addQueryStringParameter("username", "test");
		params.addQueryStringParameter("password", "123456");

		uploadMethod(params, uploadHost);

	}
           
private void uploadMethod(final RequestParams params, final String uploadHost) {

		http.send(HttpMethod.POST, uploadHost, params, new RequestCallBack<String>() {
			@Override
			public void onStart() {
				msgTextview.setText("conn...");
			}

			@Override
			public void onLoading(long total, long current, boolean isUploading) {
				if (isUploading) {
					msgTextview.setText("upload: " + current + "/" + total);
				} else {
					msgTextview.setText("reply: " + current + "/" + total);
				}
			}

			@SuppressLint("NewApi")
			@Override
			public void onSuccess(ResponseInfo<String> responseInfo) {
				msgTextview.setText("reply: " + responseInfo.result);
				Log.v(TAG, "sfq->>:" + responseInfo.result);

				DefaultHttpClient dh = (DefaultHttpClient) http.getHttpClient();
				//保存cookies的实例
				MyCookieStore.cookieStore = dh.getCookieStore();
				//获取web反馈回来的cookie信息,主要是为了提取其中sessionid
				Log.v(TAG, "sfq->>cookieStore:" + MyCookieStore.cookieStore);
				CookieStore cs = dh.getCookieStore();
				List<Cookie> cookies = cs.getCookies();
				String aa = null;
				for (int i = 0; i < cookies.size(); i++) {
					if ("JSESSIONID".equals(cookies.get(i).getName())) {
						aa = cookies.get(i).getValue();
						break;
					}
				}
				Log.v(TAG, "sfq--->>>sessionId:" + aa);

			}

			@Override
			public void onFailure(HttpException error, String msg) {
				msgTextview.setText(error.getExceptionCode() + ":" + msg);
			}
		});
	}
           
public class MyCookieStore {

	public static org.a pache.http.client.CookieStore cookieStore=null;

}
           

以上会在登录方法中调用,目的是实现登录功能并获取sessionid,接下来的web交互操作都需要加上一句:http.configCookieStore(MyCookieStore.cookieStore);目的在于将sessionId传递给web,web自动的接受这个id并通过自己的一套机制查找该id对应的登录session,那么服务器就知道了到底是哪个用户在向自己请求数据,自己应该将数据发送给谁。。。。。

登录以后再次执行post方法时的关键+++++++++

HttpUtils http = new HttpUtils();

http.configCookieStore(MyCookieStore.cookieStore);