`

利用Android自带的http包进行网络请求

阅读更多
目的是为了不依赖第三方的jar包进行网络请求(如:commons-httpclient.jar)

修改了一下,可以自定义请求的Header,增加了对POST表单数据的支持。

1. 建立一个连接配置类
class UserAgentConfig {
	public String host;
	public String scheme = "http";
	public int port = 80;
	public int timeoutConnection = 3000;
	public int timeoutSocket = 20000;
	public String username = "";
	public String password = "";
}

2. 封装请求类
public class HttpRequest {

	private String mUrl;
	private UserAgentConfig mConfig = null;
	private HashMap<String, String> mHeaders = null;
	private HttpEntity mBody = null;
	private int mStatus = -1;

	public HttpRequest(String url) {
		mUrl = url;
	}

	public void addHeader(String key, String value) {
		if (mHeaders == null)
			mHeaders = new HashMap<String, String>();

		mHeaders.put(key, value);
	}

	public void clearHeader() {
		mHeaders.clear();
		mHeaders = null;
	}

	public void setConfig(UserAgentConfig config) {
		mConfig = config;
	}

	public void setPostBody(List<BasicNameValuePair> body) {
		try {
			mBody = new UrlEncodedFormEntity(body, "utf-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

	public void setPostBody(String body) {
		try {
			mBody = new StringEntity(body);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

	public void execute() throws ClientProtocolException, IOException {
		httprequest();
	}

	public int getStatusCode() {
		return mStatus;
	}

	/**
	 * get "Stream" as response
	 * 
	 * @return response in stream
	 * @throws IOException
	 * @throws ClientProtocolException
	 */
	public InputStream getStream() throws ClientProtocolException, IOException {

		HttpEntity entity = httprequest();
		InputStream ret = null;

		if (entity != null) {
			try {
				byte[] b = EntityUtils.toByteArray(entity);
				ret = new ByteArrayInputStream(b);
			} finally {
				release(entity);
			}
		}

		return ret;
	}

	/**
	 * get "String" as response
	 * 
	 * @return response in string
	 * @throws IOException
	 * @throws ClientProtocolException
	 */
	public String getString() throws ClientProtocolException, IOException {

		HttpEntity entity = httprequest();
		String ret = null;

		if (entity != null) {
			try {
				ret = EntityUtils.toString(entity);
			} finally {
				release(entity);
			}
		}

		return ret;
	}

	/**
	 * release connection resource
	 * 
	 * @param entity
	 */
	private static void release(HttpEntity entity) {
		try {
			entity.consumeContent();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * get "HttpEntity" as response
	 * 
	 * @return
	 * @throws IOException
	 * @throws ClientProtocolException
	 */
	private HttpEntity httprequest() throws ClientProtocolException,
			IOException {

		System.out.println(mUrl);

		DefaultHttpClient client = null;
		HttpEntity entity = null;

		BasicHttpParams httpParameters = new BasicHttpParams();

		if (mConfig != null) {
			// set connection timeout
			HttpConnectionParams.setConnectionTimeout(httpParameters,
					mConfig.timeoutConnection);
		}

		client = new DefaultHttpClient(httpParameters);

		DefaultHttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(
				3, true);
		client.setHttpRequestRetryHandler(retryHandler);

		// set username & password if available
		if (mConfig != null
				&& !(isEmpty(mConfig.username) && isEmpty(mConfig.password))) {
			AuthScope as = new AuthScope(mConfig.host, mConfig.port);
			UsernamePasswordCredentials upc = new UsernamePasswordCredentials(
					mConfig.username, mConfig.password);

			client.getCredentialsProvider().setCredentials(as, upc);
		}

		// check get or post method by params
		HttpRequestBase method = null;
		if (mBody == null) {
			method = new HttpGet(mUrl);
		} else {
			method = new HttpPost(mUrl);
			((HttpPost) method).setEntity(mBody);
		}

		// set request header
		if (mHeaders != null) {
			Iterator<?> iter = mHeaders.entrySet().iterator();
			while (iter.hasNext()) {
				Map.Entry<?, ?> entry = (Entry<?, ?>) iter.next();
				String key = (String) entry.getKey();
				String val = (String) entry.getValue();
				method.setHeader(key, val);
			}
		}

		// get response
		HttpResponse response = null;
		if (mConfig == null || isEmpty(mConfig.host) || isEmpty(mConfig.scheme)) {
			// only URL is available
			response = client.execute(method);
		} else {
			BasicHttpContext localContext = new BasicHttpContext();

			BasicScheme basicAuth = new BasicScheme();
			localContext.setAttribute("preemptive-auth", basicAuth);

			HttpHost targetHost = new HttpHost(mConfig.host, mConfig.port,
					mConfig.scheme);

			response = client.execute(targetHost, method, localContext);
		}

		mStatus = response.getStatusLine().getStatusCode();
		entity = response.getEntity();

		return entity;
	}

	/**
	 * Check the string is valuable or not
	 * 
	 * @param s
	 * @return true if s is null or s.length() == 0 false otherwise
	 */
	private boolean isEmpty(String s) {
		return s == null || s.length() == 0;
	}
}

3. 调用
GET请求
HttpRequest request = new HttpRequest("...");
request.execute();

UserAgentConfig config = new UserAgentConfig();
config.host = "...";
config.username = "...";
config.password = "...";

HttpRequest request = new HttpRequest("...");
request.setConfig(config);

System.out.println(request.getString());

POST请求
HttpRequest request = new HttpRequest("...");
request.addHeader("...", "...");
request.setPostBody("....");
request.execute();

System.out.println(request.getStatusCode());
分享到:
评论
2 楼 dai_lm 2011-09-14  
qinweiping 写道
有完整的源码吗 发我一份 995308963@qq.com

这个几乎就是完整的代码了呀
1 楼 qinweiping 2011-09-13  
有完整的源码吗 发我一份 995308963@qq.com

相关推荐

    android系统原理及开发要点详解

     嵌入式Linux系统学习者:将Android作为一个集Linux核心和应用层程序于一体的系统进行学习,并可以利用Android的仿真环境运行和调试程序。  读者在学习本书的过程中,应尽量对照本书的框图和手头的Android源代码,...

    Android中判断网络连接状态的方法

    利用Android自带的ConnectivityManager类 有时候连上了wifi,但这个wifi是上不了网的,我们可以通过ping www.baidu.com来判断是否可以上网 也可以利用get请求访问www.baidu.com,如果get请求成功,说明可以上网 1...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    鉴于市场上用户的手机型号、种类、屏幕分辨率等参差不齐,传统方式根据主流系统分别开发相应的系统耗时又耗力,为了高效开发并节约开发项目成本,本文采用Android+HTML5相结合的方式进行移动端Web系统的设计研发工作...

    java开源包8

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包4

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    Java资源包01

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包1

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包2

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包3

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包11

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包6

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包5

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包10

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包7

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包9

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包101

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    JAVA上百实例源码以及开源项目源代码

    Java编写的山寨QQ,多人聊天+用户在线 21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证...

    RPC_Framework:基于TCP协议的远程过程调用框架客户端实现

    RPC_Framework #####基于TCP协议的远程过程调用框架——客户端,服务端基于TCP...直接利用工程自带单元测试可以使用服务端,因为彼此都使用json协议。如果想支持其他数据传输协议,只需替换数据层即可。 #####知识扩展

    JAVA上百实例源码以及开源项目

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

Global site tag (gtag.js) - Google Analytics