`

利用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网络请求封装,可动态切换网络引擎

    在Android系统中,HTTP请求可以通过多种方式实现,如使用Android自带的HttpURLConnection,或者是第三方库如Volley、Retrofit、OkHttp等。OkHttp因其高效的性能、良好的API设计以及丰富的特性,成为了许多开发者首选...

    Android网络请求框架

    1. HttpURLConnection:Android SDK自带的一种网络请求方式,适用于简单的HTTP请求。它可以实现GET、POST等基本请求方法,但配置起来相对繁琐,不适用于复杂的网络请求场景。 2. HttpClient:虽然已被弃用,但在旧...

    android异步http请求

    在Android应用开发中,进行网络通信是不可或缺的一部分,而HTTP请求是网络通信中最常见的操作。在用户界面(UI)线程上执行网络操作会导致应用程序无响应(ANR),因此,Android推荐使用异步HTTP请求来避免阻塞主线...

    Android网络编程之Http通信

    Android网络编程是移动应用...无论是使用Android SDK自带的HttpURLConnection还是选择一个第三方的库,了解如何正确处理网络请求、如何优化网络通信以及如何提高应用的响应性和安全性,都是移动应用开发者必备的技能。

    Android实现网络访问

    常见的数据格式有JSON和XML,可以使用Gson库解析JSON,或者使用Android自带的XmlPullParser解析XML。 6. **错误处理**:网络请求可能会失败,应捕获并处理IOException、SocketTimeoutException等异常。同时,对于...

    Android从网络加载图片并显示在ImageView控件上

    HttpURLConnection是Android自带的API,可以用来发送HTTP请求。OkHttp则提供了更高效的网络通信,支持连接池和自动重试机制。在这个场景下,我们需要发送一个GET请求到图片的URL来获取数据。 其次,由于网络请求...

    Android源码资源包

    Android源码资源包是开发Android应用或进行系统级定制时不可或缺的一部分。这个压缩包包含了Android操作系统的源代码,主要用于深入理解Android的工作原理、调试应用程序、优化性能或者进行自定义ROM的开发。解压后...

    网络请求与XML处理,

    常见的网络请求库有Android自带的HttpURLConnection,但更多开发者倾向于使用第三方库,如OkHttp和Volley,它们提供了更高效的性能和易用的API。 1. OkHttp:这是一个广泛使用的网络请求库,以其高性能、低内存占用...

    老罗Android视频http协议开发包

    老罗的Android视频系列中专门有一章讲解了如何利用HTTP协议进行开发,这个开发包就是为了配合该章节内容而提供的。在这个压缩包中,包含了与HTTP协议开发相关的资源和示例代码,确保开发者可以跟随教程实践。 首先...

    调用Android自带日历功能

    调用Android自带日历功能是Android开发中一个实用的功能,它允许开发者在应用程序中集成与设备内置日历的交互,从而提升用户体验。以下是对这一功能的深入解析及相关知识点的详细介绍。 ### 调用Android日历功能 ...

    Android 自带Samples

    标题中的“Android 自带Samples”指的是Android SDK中包含的一系列示例项目,这些项目展示了如何使用Android API来实现特定功能或交互。 描述中提到的"ApiDemos"是Android Samples中最为经典的一个,它几乎包含了...

    Android 8.0 系统自带 SoundRecoder

    总的来说,Android 8.0 系统自带的 SoundRecorder 是一个实用且高效的录音工具,无论是在日常生活中记录灵感,还是在工作中进行会议记录,都能提供稳定可靠的服务。了解并掌握它的功能和使用技巧,将有助于我们更好...

    android 自带案例

    Android应用经常需要进行网络操作,如HTTP请求、WebSocket通信、下载上传等。samples中的网络示例展示了如何使用HttpURLConnection、OkHttp、Volley等库进行网络请求,以及如何处理JSON或XML数据。 五、多媒体与...

    OKHttp.jar包 3.4.1 下载

    与Android自带的HttpURLConnection相比,OKHttp提供了更好的性能和更低的资源消耗。它支持HTTP/1.1和HTTP/2协议,同时具备连接池、响应缓存、请求重试和连接超时等功能,极大地提高了网络请求的效率。 ### 特性 1....

    android系统自带相册源码.rar

    Android系统的自带相册是用户与设备之间进行图片和视频浏览、管理的重要接口,其源码包含了丰富的Android开发知识,包括UI设计、图片处理、数据管理等多个方面。对于Android开发者来说,深入理解这个组件的源码,...

    Android系统自带项目源代码

    总的来说,通过深入研究Android系统上层应用的源代码,开发者不仅可以提高自己的编程技巧,还能更好地理解和利用Android平台的各种特性和服务,从而创造出更高效、更稳定、更具创新性的应用。这是一条通往Android...

    commons-httpclient包和ksoap2-android-assembly包

    然而,需要注意的是,由于HttpClient在较新的Android版本中已被弃用,推荐使用Android自带的HttpURLConnection或者更现代的第三方库,如OkHttp。同样,对于新项目,考虑使用RESTful API和像Retrofit这样的库,可能比...

    如何用Fiddler对Android应用进行抓包

    - **抓包权限**:某些Android应用可能会对网络请求进行加密或使用自签名证书,此时可能需要安装Fiddler提供的根证书到Android设备上,才能完整地捕获HTTPS流量。 #### 使用Fiddler分析数据 完成以上配置后,即可...

    android自带定位

    网络定位主要利用移动网络基站或者Wi-Fi热点的信息,通过三角定位原理估算设备的位置。这种定位方法的优点在于快速、省电,而且在室内通常也能工作,但其精度相对较低,通常在几百米到几公里之间。在网络定位中,...

Global site tag (gtag.js) - Google Analytics