`
fancybiy
  • 浏览: 8006 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用Apache HttpClient的健壮HTTP

阅读更多

下面的部分内容来源于《Unlocking Android》一书:

 

要了解HTTPClient,我们先看一下如何使用核心类来执行HTTP GET和POST方法请求,此处我们结合使用Apache的ResonseHandler和Android的Handler,在与用户界面不同的线程中发起网络请求。


 

 

// new a Handler to receive the response by HTTP request.
private final Handler mHandler = new Handler() {
	public void handleMessage(Message msg) {
		mPrgressDialog.dismiss();
		String result = msg.getData().getString("RESPONSE");
		mOutput.setText(result);
	};
};

@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);
	mButton = (Button) findViewById(R.id.btn);
	mButton.setOnClickListener(new OnClickListener() {
		public void onClick(View v) {
			mOutput.setText("");
			performRequest(url);
		}
	});
	mOutput = (TextView) findViewById(R.id.output);
}

// perform HTTP request with HttpRequestHelper asynchronously.
private void performRequest(final String url) {
	final ResponseHandler<String> responseHandler = HttpRequestHelper
			.getResponseHandlerInstance(mHandler);
	// show a ProgressDialog to represent that it is woring now, and it
	// will dismiss after receiving response.
	mPrgressDialog = ProgressDialog.show(this, "working...",
			"performing HTTP request");
	new Thread() {
		public void run() {
			HttpRequestHelper helper = new HttpRequestHelper(
					responseHandler);
			// use GET method
			helper.performGet(url, null, null, null);
		};
	}.start();
}
  
/**
 * Helper for HTTP request via GET or POST method.
 */
public final class HttpRequestHelper {

	private static final int POST_TYPE = 1;
	private static final int GET_TYPE = 2;
	public static final String CONTENT_TYPE = "Content-Type";
	public static final String MIME_FORM_ENCODED = "application/x-www-form-urlencoded";
	public static final String MIME_TEXT_PLAIN = "text/plain";
	private final ResponseHandler<String> mResponseHandler;

	public HttpRequestHelper(ResponseHandler<String> responseHandler) {
		mResponseHandler = responseHandler;
	}

	public void performGet(String url, String user, String pwd,
			final Map<String, String> addtionalHeaders) {
		performRequest(null, url, user, pwd, addtionalHeaders, null, GET_TYPE);
	}

	public void performPost(String contentType, String url, String user,
			String pwd, Map<String, String> addtionalHeaders,
			Map<String, String> params) {
		performRequest(contentType, url, user, pwd, addtionalHeaders, params,
				POST_TYPE);
	}

	public void performPost(String url, String user, String pwd,
			Map<String, String> addtionalHeaders, Map<String, String> params) {
		performRequest(MIME_FORM_ENCODED, url, user, pwd, addtionalHeaders,
				params, POST_TYPE);
	}

	private void performRequest(String contentType, String url, String user,
			String pwd, Map<String, String> headers,
			Map<String, String> params, int requestType) {
		DefaultHttpClient client = new DefaultHttpClient();
		if (user != null && pwd != null) {
			client.getCredentialsProvider().setCredentials(AuthScope.ANY,
					new UsernamePasswordCredentials(user, pwd));
		}

		final Map<String, String> sendHeaders = new HashMap<String, String>();
		if (headers != null && !headers.isEmpty()) {
			sendHeaders.putAll(headers);
		}
		if (POST_TYPE == requestType) {
			sendHeaders.put(CONTENT_TYPE, contentType);
		}
		if (!sendHeaders.isEmpty()) {
			client.addRequestInterceptor(new HttpRequestInterceptor() {

				public void process(HttpRequest request, HttpContext context)
						throws HttpException, IOException {
					for (String key : sendHeaders.keySet()) {
						if (!request.containsHeader(key)) {
							request.addHeader(key, sendHeaders.get(key));
						}
					}
				}
			});
		}

		if (POST_TYPE == requestType) {
			HttpPost post = new HttpPost(url);
			List<NameValuePair> nvps = null;
			if (params != null && !params.isEmpty()) {
				nvps = new ArrayList<NameValuePair>();
				for (String key : params.keySet()) {
					nvps.add(new BasicNameValuePair(key, params.get(key)));
				}
			}
			if (nvps != null) {
				try {
					post.setEntity(new UrlEncodedFormEntity(nvps));
				} catch (UnsupportedEncodingException e) {
					// TODO: handle exception
				}
			}
			execute(client, post);
		} else if (GET_TYPE == requestType) {
			execute(client, new HttpGet(url));
		}
	}

	private void execute(HttpClient client, HttpRequestBase method) {
		try {
			client.execute(method, mResponseHandler);
		} catch (Exception e) {
			BasicHttpResponse erroResponse = new BasicHttpResponse(
					new ProtocolVersion("HTTP_ERROR", 1, 1), 500, "ERROR");
			erroResponse.setReasonPhrase(e.getMessage());
			try {
				mResponseHandler.handleResponse(erroResponse);
			} catch (Exception e2) {
				// TODO: handle exception
			}
		}
	}

	public static ResponseHandler<String> getResponseHandlerInstance(
			final Handler handler) {
		return new ResponseHandler<String>() {
			public String handleResponse(HttpResponse response)
					throws ClientProtocolException, IOException {
				Message message = handler.obtainMessage();
				Bundle data = new Bundle();
				HttpEntity entity = response.getEntity();
				String result = null;
				if (entity != null) {
					try {
						result = EntityUtils.toString(entity);
						data.putString("RESPONSE", result);
					} catch (IOException e) {
						data.putString("RESPONSE", "Error - " + e.getMessage());
					}
				} else {
					StatusLine status = response.getStatusLine();
					data.putString("RESPONSE",
							"Error - " + status.getReasonPhrase());
				}
				message.setData(data);
				message.sendToTarget();
				return result;
			}
		};
	}
}
  • 大小: 68.2 KB
分享到:
评论

相关推荐

    apache_httpclient 高清 pdf

    根据提供的文件内容,本文将介绍Apache HttpClient的相关知识点。Apache HttpClient是一个流行的Java库,...开发者需要通过阅读HttpClient的完整文档来充分利用它的功能,从而开发出健壮、高效的HTTP客户端应用程序。

    httpclient和httpcore的jar包

    - **异常处理**:正确捕获和处理HttpClient和HTTPCore可能抛出的异常,确保程序的健壮性。 - **线程安全**:HttpClient对象不是线程安全的,如果要在多线程环境中使用,应为每个线程创建单独的实例或者使用线程安全...

    java使用HttpClient发送http请求

    本文将深入讲解如何使用HttpClient来发送HTTP请求,以及相关的源码分析。 首先,让我们了解HttpClient的基本用法。Apache HttpClient库提供了丰富的功能,包括GET、POST、PUT等各种HTTP方法的支持。以下是一个简单...

    HttpClient使用HttpGet进行json数据传输(所使用的jar.zip)

    HttpClient是Apache基金会开发的一个HTTP客户端库,用于在Java应用程序中执行HTTP请求。在这个场景中,我们关注的是如何使用HttpClient的HttpGet方法来传输JSON数据。HttpGet主要用于发起一个HTTP GET请求,通常用于...

    httpclient4.3 封装工具类

    HttpClient是Apache基金会开发的一个HTTP客户端库,主要用于处理HTTP请求。HttpClient 4.3版本是对该库的一次重要更新,提供了更多的功能和优化。这个封裝工具类是对HttpClient 4.3进行的二次开发,旨在简化HTTP请求...

    HttpClient--最全--安装包+官方文档(中文)

    HttpClient是Apache软件基金会的一个开源Java库,用于在Java应用程序中执行HTTP请求。它提供了一种高效、灵活且功能丰富的机制,使开发者能够处理HTTP协议,包括GET、POST、PUT等方法,以及处理Cookie、重定向、认证...

    commons--httpclient.jar

    总的来说,Apache HttpClient是Java开发者进行HTTP通信的有力工具,通过理解并熟练掌握其核心组件和使用方法,可以极大地提升HTTP服务的开发效率和质量。同时,结合`commons-codec-1.3.jar`和`commons-logging-api-...

    一个基于HttpClient封装的Http组件.rar

    HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性,它不仅使客户端发送Http请求变得容易,而且也方便开发人员测试接口(基于Http协议的),提高了开发的效率,也方便提高代码的健壮性 注意:...

    commons-httpclient-2.0

    4. **版本兼容性**:由于HttpClient 2.0较老,可能不支持一些新出现的HTTP特性或标准,所以在新项目中,通常推荐使用更新的替代品,如Apache HttpClient 4.x 或者Java 11自带的`java.net.http.HttpClient`。...

    httpclient-4.5.2.jar

    《深入理解HTTPClient 4.5.2及依赖库》 在Java开发中,与HTTP通信密切相关的一个重要库就是Apache HttpClient。...在实际开发中,结合这些库的使用,我们可以编写出更加健壮、高效的HTTP客户端代码。

    httpclient-tutorial开发指导文档.pdf

    Apache HttpClient是一个广泛使用的Java库,它用于发送HTTP请求并处理HTTP响应。Apache HttpClient 4.5版本是一个重要更新,提供了新的功能和改进,这篇文档提供了全面的指导,介绍了如何使用和配置HttpClient来处理...

    org.apache.http jar包

    Apache HttpClient是一个广泛使用的Java库,它是Apache软件基金会的一部分,主要用于执行HTTP请求。这个"org.apache.http.jar"包包含了HttpClient库的实现,使得开发者能够在Java应用中方便地与HTTP服务器进行交互。...

    httpclient.zip

    在这个`httpclient.zip`压缩包中,我们可以看到几个关键的类:`HttpUtils.java`、`HttpDeleteBody.java`和`HttpGetBody.java`,这些都是基于Apache HttpClient实现的HTTP操作的自定义封装。 1. **HttpUtils.java** ...

    彻底解决httpClient乱码问题

    综上所述,解决HttpClient乱码问题涉及多个环节,包括正确设置字符编码、理解HTTP头信息、自定义HttpClient配置以及编写健壮的工具类。只有对HTTP通信的各个环节有深入理解,才能有效地处理这类问题,确保数据传输的...

    httpclient.post例子

    在Java编程中,Apache HttpClient库是一个非常常用的工具,用于执行HTTP请求,如GET、POST等。本示例将深入探讨如何使用HttpClient库实现POST请求。首先,我们需要理解POST请求的基本概念,它通常用于向服务器发送...

    httpclient4.5 jar包

    HttpClient是Apache软件基金会下的一个开源项目,主要用于提供高效的、最新的、功能丰富的HTTP协议客户端编程工具包。HttpClient 4.5作为其重要的版本,针对Java开发者提供了强大的HTTP客户端支持,使得在进行网络...

    java学习资料,org.apache.http jar包工具

    Java学习资料中的`org.apache....通过理解并熟练使用Apache HttpClient,开发者可以构建高效、健壮的网络应用程序,实现与HTTP服务器的复杂交互。在学习过程中,建议结合实际项目练习,加深对HttpClient的理解和应用。

    HttpClient实现文件下载

    Apache HttpClient 是一个用于发送HTTP请求的Java类库,它提供了多种方法来处理HTTP请求,并且支持包括GET、POST在内的各种HTTP方法。本文将详细介绍如何使用 HttpClient 进行文件下载。 #### 二、环境准备与需求...

    java-http请求jar包

    在Java项目中使用Apache HttpClient,首先需要将`httpcomponents-client-4.5.5.jar`添加到项目的类路径中。这个jar包包含了HttpClient的核心类和其他依赖,例如HTTP协议解析的`httpcore`模块,以及处理HTTP连接管理...

    使用 HttpClient 和 HtmlParser 实现简易网络爬虫

    2. **发起HTTP请求**:使用HttpClient的HttpGet或HttpPost方法,向目标URL发起请求。HttpGet用于获取静态页面,HttpPost则常用于提交表单数据。 3. **处理响应**:HttpClient会返回一个HttpResponse对象,其中包含...

Global site tag (gtag.js) - Google Analytics