Android客户端使用HttpClient发起web数据访问

HttpClient与服务器数据交互方式:HttpPost和HttpGet 分别对应Post和Get提交。因为要做Android客户端的缘故,所以就必须实现客户端与服务器实现数据交互,以保证数据链条的通畅,实现数据闭环。由于之前对Android客户端访问web数据没有设置权限,所以可以很好的访问系统资源,但是如果是开发应用这种方式就存在极大的安全隐患,一个Host或Get提交过去数据就获取到了,web端系统完全就是裸奔。所以web端权限管理很有必要,也就不用过于担心Android客户端带来的安全隐患。Android新手学习一般都会遇到问题,前两天就遇到web端设置了权限而Android客户端发起访问获取不到数据的问题。

获取JSON遇到权限问题:http://my.oschina.net/boonya/blog/317057 这篇文章和本文要讲的内容有点关系。

1.HttpPost与HttpGet实现用户登录和列表展现

编写一个测试Activity,MainActivity.

package com.boonya.httpclienttest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.json.JSONArray;
import org.json.JSONObject;
import com.boonya.httpclienttest.utils.HtttpClientUtil;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class MainActivity extends Activity
{

	private static final String TAG = "MainActivity";

	private List<HashMap<String, Object>> videos = null;

	private HashMap<String, Object> video = null;

	private ListView listView = null;

	private static String loginurl = "http://192.168.1.147:8090/wtms/androidservice/login";

	private static String getdataurl = "http://192.168.1.147:8090/wtms/androidservice/videos.avd";

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		listView = (ListView) findViewById(R.id.videos);

		postMethod();

		getMethod();
	}

	/**
	 * HttpGet获取服务器数据显示
	 *
	 * @param url
	 */
	protected void getMethod()
	{
	    HttpGet request = new HttpGet(getdataurl);
	    //request.setHeader("Cookie", HtttpClientUtil.getCookie());//设置cookie
		try
		{
			//设置请求参数项
            //request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            HttpClient client = HtttpClientUtil.getInstance();
            //执行请求返回相应
            HttpResponse response = client.execute(request);
			// 判断请求是否成功
			if (response.getStatusLine().getStatusCode() == 200)
			{ // 200表示请求成功

				StringBuilder builder = new StringBuilder();
				BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

				String s = null;
				while ((s = bufferedReader.readLine()) != null)
				{
					builder.append(s);
				}

				// String out = EntityUtils.toString(entity, "UTF-8");
				String msg = builder.toString();

				Log.d("log", ">>>>执行 方法 getMethod()获取到范围值:"+msg);

				JSONArray jsonArray = new JSONArray(msg);

				videos = new ArrayList<HashMap<String, Object>>();
				for (int i = 0; i < jsonArray.length(); i++)
				{
					JSONObject jsonObject = (JSONObject) jsonArray.get(i);
					int id = jsonObject.getInt("id");
					String name = jsonObject.getString("name");
					int timelength = jsonObject.getInt("time");

					video = new HashMap<String, Object>();
					video.put("id", id);
					video.put("name", name);
					video.put("timelength", "时长为:" + timelength);

					videos.add(video);
				}

				SimpleAdapter adapter = new SimpleAdapter(this, videos, R.layout.item, new String[]
				{ "name", "timelength" }, new int[]
				{ R.id.title, R.id.timelength });
				listView.setAdapter(adapter);

			}
		} catch (Exception e)
		{
			e.printStackTrace();
			Log.e(TAG, e.toString());
			Toast.makeText(MainActivity.this, "获取数据失败", Toast.LENGTH_LONG).show();
		}
	}

	/**
	 * HttpPost提交数据
	 */
	@SuppressWarnings(
	{ "unchecked", "rawtypes" })
	protected void postMethod()
	{

		try
		{
			// 使用ApacheHttp客户端进行连接(重要方法)
			HttpClient client = HtttpClientUtil.getInstance();

			// 如果是Get提交则创建HttpGet对象,否则创建HttpPost对象
			// POST提交的方式
			HttpPost request = new HttpPost(loginurl);
			// 如果是Post提交可以将参数封装到集合中传递
			List params = new ArrayList();
			params.add(new BasicNameValuePair("username", "test"));
			params.add(new BasicNameValuePair("password", "test"));
			// UrlEncodedFormEntity用于将集合转换为Entity对象
			request.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
			try
			{
				// 获取相应消息
				HttpResponse response = client.execute(request);
				StringBuilder builder = new StringBuilder();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                // 操作cookie
               /* List<Cookie> cookies = ((AbstractHttpClient) client).getCookieStore().getCookies();
                if(cookies!=null&&cookies.size()>0)
                {
                	for (int i = 0; i < cookies.size(); i++)
					{
						HtttpClientUtil.setCookie(cookies.get(i).getValue());
					}
                }*/
                String s =null;
                while((s = bufferedReader.readLine())!=null){
                	builder.append(s);
                }

                String string=builder.toString();
            	Log.d("log", ">>>>执行 方法 postMethod()获取到范围值:"+string);

			} catch (ClientProtocolException e)
			{
				e.printStackTrace();
			} catch (IOException e)
			{
				e.printStackTrace();
			}

		} catch (UnsupportedEncodingException e)
		{
			e.printStackTrace();
		}

	}

}

2.实现客户端与服务器cookie共享

这里采用单例模式实现HttpClient对象在Android客户端的唯一性,用户在登录系统后,这个对象会记录用户的Cookie,一旦建立客户端与服务器的访问认证,以后就可以任意发送HTTP请求到服务器请求或操作资源了。

package com.boonya.httpclienttest.utils;

import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;

public class HtttpClientUtil
{
	/** 设置请求超时10秒钟 */
	private static final int REQUEST_TIMEOUT = 10 * 1000;

	/** 设置等待数据超时时间10秒钟 */
	private static final int SO_TIMEOUT = 10 * 1000;

	private static HttpClient instance;

	/**  记住cookie字符串*/
	private static String cookie;

	/**
	 * 自定义方法:初始化HttpClient,并设置超时
	 *
	 * @return 返回:HttpClient 对象
	 */
	private HtttpClientUtil()
	{

	}

	public static String getCookie()
	{
		return cookie;
	}

	public static void setCookie(String cookie)
	{
		HtttpClientUtil.cookie = cookie;
	}

	public static HttpClient getInstance()
	{
		if (instance == null)
		{
			BasicHttpParams httpParams = new BasicHttpParams();

			HttpConnectionParams.setConnectionTimeout(httpParams, REQUEST_TIMEOUT);

			HttpConnectionParams.setSoTimeout(httpParams, SO_TIMEOUT);

			instance = new DefaultHttpClient(httpParams);
		}
		return instance;
	}

}

上面cookie字段并非必须的,如果HttpClient不是单例的,那么用户需要在静态变量来记住登录后的cookie。

优化HttpClientUtil的cookie获取方法:

package com.boonya.httpclienttest.utils;

import java.util.List;

import org.apache.http.client.HttpClient;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.AbstractHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;

public class HtttpClientUtil
{
	/** 设置请求超时10秒钟 */
	private static final int REQUEST_TIMEOUT = 10 * 1000;

	/** 设置等待数据超时时间10秒钟 */
	private static final int SO_TIMEOUT = 10 * 1000;

	private static HttpClient instance;

	/** 记住cookie字符串 */
	private static String cookie = null;

	/**
	 * 自定义方法:初始化HttpClient,并设置超时
	 *
	 * @return 返回:HttpClient 对象
	 */
	private HtttpClientUtil()
	{

	}

	public static String getCookie()
	{
		// 确保实例存在
		HtttpClientUtil.getInstance();
		// 获取cookie
		List<Cookie> cookies = ((AbstractHttpClient) instance).getCookieStore().getCookies();
		if (cookies != null && cookies.size() > 0)
		{
			for (int i = 0; i < cookies.size(); i++)
			{
				cookie = cookies.get(i).getValue();
			}
		}
		return cookie;
	}

	public static HttpClient getInstance()
	{
		if (instance == null)
		{
			BasicHttpParams httpParams = new BasicHttpParams();

			HttpConnectionParams.setConnectionTimeout(httpParams, REQUEST_TIMEOUT);

			HttpConnectionParams.setSoTimeout(httpParams, SO_TIMEOUT);

			instance = new DefaultHttpClient(httpParams);
		}
		return instance;
	}

}
时间: 2024-11-05 13:27:47

Android客户端使用HttpClient发起web数据访问的相关文章

android客户端请求不到服务器数据

============问题描述============ 报错代码行 String url = "http://192.168.1.121:9090/shunfengche/requestMes?pageSize=" + pageSize + "&currentPageNumber=" + currentPageNumber; HttpClient client = new DefaultHttpClient(); HttpGet get = new Htt

Android客户端与Java服务器交互数据(一)SAE服务器搭建

平时大家的测试服务器都是运行在自己的PC上面,用Tomcat或者IIS搭建的本机服务器.其实新浪云平台SinaAppEngine也是挺好用的.今天总结一下我使用过程中的一些小心得: 1.创建SAE应用: 登陆http://sae.sina.com.cn/进行注册,微博帐号可以直接登陆.注册成功后进入"我的首页",控制台>应用管理>创建新应用 然后输入二级域名(应用的唯一标示),应用名称和其他信息,最后选择开发语言,这里以Java为例: JVM级别选择"经济版&qu

Android中使用系统提供API数据访问接口操作数据库

数据的增加 1.创建一个SQLite数据的帮助类 SQLiteDatabase db = helper.getWritableDatabase(); 2.创建一个类似map集合的类ContentValues,用来存储键值对 ContentValues values = new ContentValues(); 3.把需要增加的数据存放进去 values.put("name", name); values.put("number", number); 4.执行系统提供

Android客户端与Java服务器交互数据(二)阿里云ACE服务器搭建

前段时间写了一个新浪SAE部署代码的小总结,刚好今天阿里云云引擎ACE公测的审核资格通过了,就来对比一下ACE与新浪SAE的使用. 首先是账号,ACE作为阿里产品自然可以通过淘宝账号直接登录,而SAE则可以通过微博账号登录. http://www.aliyun.com/ 阿里云的主营业务比较多,主页很花哨,点击右上角的"管理控制台",然后进入"云引擎ACE",创建应用环境: 这里先写一个简单的JSP工程作为演示,打开Eclipse for JavaEE,然后File

#游戏平台接入#Android游戏平台接入(一)#android客户端和C++底层的数据交互#jni编程#欢迎交流#

1.jni是什么 2.jni应用情景 3.java 调用C++过程解析(附例子) 4.C++调用java 过程解析(附例子) 5.java,c++,jni数据类型对照 6.常用jni函数解析 http://blog.csdn.net/skywalker256/article/details/4677644

SSH服务器与Android通信(1)--Android客户端接收数据

基本原理是Android客户端通过HttpClient向服务器发出请求,服务器向Android客户端返回JSON字符串,Android客户端解析JSON字符串获得数据. 1. 新建一个Android项目,主要文件如下: 其中MainActivity是UI,CommThread是通信线程,负责和服务器通信,Util是工具类,Var存放变量. 2. Var.java: package com.hzhi.school.util; import java.util.ArrayList; import j

SSH服务器与Android通信(3)--Android客户端发送数据

Android客户端向SSH服务器发送数据主要有三种情况:通过客户端删除数据.添加数据和修改数据. 1.删除数据 先看看jsp文件里面是怎样删除数据的: <td align="center"><a href="clasdelete.action?id=<s:property value='#st.id'/>" onclick="if(!window.confirm('是否删除'))return false;" >

简单的android客户端servlet服务端的交互

android客户端通过GET方式发送数据到服务端,服务端获得数据后,从服务端获取数据库里的信息,并以JSON数据格式返回. 1.GET方式传参的格式: http://127.0.0.1/AndroidService/android/upload?title=aaa&timelength=90的形式 参数是?后的title=aaa&timelength=90.多个参数用&连接. 2.连接服务器发送请求参数并获得服务器返回的数据,客户端获得数据后,主要是对JSON数据的一些解析. /

openwebrtc 服务端和android客户端demo安装

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46649667 转载请一定注明出处! 1,关于openwebrtc OpenWebRTC 是基于 Gstreamer 实现的开源的.跨平台的 WebRTC 客户端框架,支持 H.264 和 VP8.利用 OpenWebRTC,WebRTC就不再仅仅是纯粹浏览器技术了,你可以在NativeAPP中使用WebRTC,并且还可以与浏览器WebRTC互联互通. 2,安装服务端demo d