> 文章列表 > Android HTTP访问的两种方式(HttpClient和HttpURLConnection)

Android HTTP访问的两种方式(HttpClient和HttpURLConnection)

Android HTTP访问的两种方式(HttpClient和HttpURLConnection)

一、简介

大部分需要联网的 Android 应用程序都会使用 HTTP 去发送和接收数据。Android 中包括两种方式来进行 HTTP 的请求:HttpURLConnection 和 HttpClient。

URL请求最常用的两种方式:GET请求与POST请求。一般来说,Get是向服务器索取数据的一种请求,而Post是向服务器提交数据的一种请求。

二、示例

2.1 HttpURLConnection的使用

在JDK的java.net包中已经提供了访问HTTP协议的基本功能的类:HttpURLConnection。
HttpURLConnection是Java的标准类,它继承自URLConnection,可用于向指定网站发送GET请求、POST请求。

① 使用GET方式访问HTTP

package com.qf.demo;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;/*** GET请求示例* * @author 小明**/
public class GetDemo {public static void main(String[] args) {try {// 1. 得到访问地址的URLURL url = new URL("http://localhost:8080/Servlet/do_login.do?username=test&password=123456");// 2. 得到网络访问对象java.net.HttpURLConnectionHttpURLConnection connection = (HttpURLConnection) url.openConnection();/* 3. 设置请求参数(过期时间,输入、输出流、访问方式),以流的形式进行连接 */// 设置是否向HttpURLConnection输出connection.setDoOutput(false);// 设置是否从httpUrlConnection读入connection.setDoInput(true);// 设置请求方式connection.setRequestMethod("GET");// 设置是否使用缓存connection.setUseCaches(true);// 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向connection.setInstanceFollowRedirects(true);// 设置超时时间connection.setConnectTimeout(3000);// 连接connection.connect();// 4. 得到响应状态码的返回值 responseCodeint code = connection.getResponseCode();// 5. 如果返回值正常,数据在网络中是以流的形式得到服务端返回的数据String msg = "";if (code == 200) { // 正常响应// 从流中读取响应信息BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line = null;while ((line = reader.readLine()) != null) { // 循环从流中读取msg += line + "\\n";}reader.close(); // 关闭流}// 6. 断开连接,释放资源connection.disconnect();// 显示响应结果System.out.println(msg);} catch (IOException e) {e.printStackTrace();}}
}

② 使用POST方式访问HTTP

package com.qf.demo;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;/*** POST请求示例* * @author 小明**/
public class PostDemo {public static void main(String[] args) {try {// 1. 获取访问地址URLURL url = new URL("http://localhost:8080/Servlet/do_login.do");// 2. 创建HttpURLConnection对象HttpURLConnection connection = (HttpURLConnection) url.openConnection();/* 3. 设置请求参数等 */// 请求方式connection.setRequestMethod("POST");// 超时时间connection.setConnectTimeout(3000);// 设置是否输出connection.setDoOutput(true);// 设置是否读入connection.setDoInput(true);// 设置是否使用缓存connection.setUseCaches(false);// 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向connection.setInstanceFollowRedirects(true);// 设置使用标准编码格式编码参数的名-值对connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");// 连接connection.connect();/* 4. 处理输入输出 */// 写入参数到请求中String params = "username=test&password=123456";OutputStream out = connection.getOutputStream();out.write(params.getBytes());out.flush();out.close();// 从连接中读取响应信息String msg = "";int code = connection.getResponseCode();if (code == 200) {BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = reader.readLine()) != null) {msg += line + "\\n";}reader.close();}// 5. 断开连接connection.disconnect();// 处理结果System.out.println(msg);} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

2.2 HttpClient的使用

HttpClient相比较来说简化了HttpURLConnection对象对Session、Cookie的处理。简单来说,HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收响应,以及管理HTTP连接。

使用HttpClient发送请求、接收响应很简单,只要如下几步即可。
1、创建HttpClient对象。
2、如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3、如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HttpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4、调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse。
5、调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

① 使用GET方式访问HTTP

package com.qf.client;import java.io.IOException;import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;/*** GET请求示例* * @author 小明**/
public class GetDemo {public static void main(String[] args) {// 1. 创建HttpClient对象CloseableHttpClient httpClient = HttpClientBuilder.create().build();// 2. 创建HttpGet对象HttpGet httpGet = new HttpGet("http://localhost:8080/Servlet/do_login.do?username=test&password=123456");CloseableHttpResponse response = null;try {// 3. 执行GET请求response = httpClient.execute(httpGet);System.out.println(response.getStatusLine());// 4. 获取响应实体HttpEntity entity = response.getEntity();// 5. 处理响应实体if (entity != null) {System.out.println("长度:" + entity.getContentLength());System.out.println("内容:" + EntityUtils.toString(entity));}} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {// 6. 释放资源try {response.close();httpClient.close();} catch (IOException e) {e.printStackTrace();}}}
}

② 使用POST方式访问HTTP

package com.qf.client;import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;/*** POST请求测试* * @author 小明**/
public class PostDemo {public static void main(String[] args) {// 1. 创建HttpClient对象CloseableHttpClient httpClient = HttpClientBuilder.create().build();// 2. 创建HttpPost对象HttpPost post = new HttpPost("http://localhost:8080/Servlet/do_login.do");// 3. 设置POST请求传递参数List<NameValuePair> params = new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("username", "test"));params.add(new BasicNameValuePair("password", "12356"));try {UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params);post.setEntity(entity);} catch (UnsupportedEncodingException e) {e.printStackTrace();}// 4. 执行请求并处理响应try {CloseableHttpResponse response = httpClient.execute(post);HttpEntity entity = response.getEntity();if (entity != null){System.out.println("响应内容:");System.out.println(EntityUtils.toString(entity));}response.close();} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {// 释放资源try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}}
}

三、参考

  • HttpClient和HttpURLConnection的区别和案例
  • HttpURLConnection与HttpClient浅析