您的位置:首页 > 理论基础 > 计算机网络

Android——HttpURLConnection和HttpClien

2016-07-09 21:22 495 查看
Android的网络通信的方式有两种:使用Socket或者HTTP,HTTP又包括两种方式编程方式:

(1)HttpUrlConnection;

(2)HttpClient;

一、HttpURLConnection

HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。

使用HttpURLConnection的步骤如下:

1)创建一个URL对象: URL url = new URL(http://www.baidu.com);

2)调用URL对象的openConnection( )来获取HttpURLConnection对象实例: HttpURLConnection conn
= (HttpURLConnection) url.openConnection();

3)设置HTTP请求使用的方法:GET或者POST,或者其他请求方式比如:PUT conn.setRequestMethod("GET");

4)设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头 conn.setConnectTimeout(6*1000);conn.setReadTimeout(6
* 1000);

5)调用getInputStream()方法获得服务器返回的输入流,然后输入流进行读取了 InputStream in = conn.getInputStream();

6)最后调用disconnect()方法将HTTP连接关掉 conn.disconnect();

HttpURLConnection有以下三种使用场景:

1.HttpURLConnection连接URL,获取网页数据(比如浏览器等)

1)创建一个URL对象

URL url = new URL(http://www.baidu.com);

2)利用HttpURLConnection对象从网络中获取网页数据

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

3)设置连接超时

conn.setConnectTimeout(6*1000);

4)对响应码进行判断

if (conn.getResponseCode() != 200) //从Internet获取网页,发送请求,将网页以流的形式读回来

throw new RuntimeException("请求url失败");

5)得到网络返回的输入流

InputStream is = conn.getInputStream();

6)String result = readData(is, "GBK"); //文件流输入出文件用outStream.write

7)conn.disconnect();

总结:

--记得设置连接超时,如果网络不好,Android系统在超过默认时间会收回资源中断操作.

--返回的响应码200,是成功.

--在Android中对文件流的操作和JAVA SE上面是一样的.

--在对大文件的操作时,要将文件写到SDCard上面,不要直接写到手机内存上.

--操作大文件是,要一遍从网络上读,一遍要往SDCard上面写,减少手机内存的使用.这点很重要,面试经常会被问到.

--对文件流操作完,要记得及时关闭.

2.向Internet发送请求参数(提交请求参数,有get和post两种方式)

步骤:

1)创建URL对象:URL realUrl = new URL(requestUrl);

2)通过HttpURLConnection对象,向网络地址发送请求

HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();

3)设置容许输出:conn.setDoOutput(true);

4)设置不使用缓存:conn.setUseCaches(false);

5)设置使用POST的方式发送:conn.setRequestMethod("POST");

6)设置维持长连接:conn.setRequestProperty("Connection", "Keep-Alive");

7)设置文件字符集:conn.setRequestProperty("Charset", "UTF-8");

8)设置文件长度:conn.setRequestProperty("Content-Length", String.valueOf(data.length));

9)设置文件类型:conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

10)以流的方式输出.

总结:

--发送POST请求必须设置允许输出

--不要使用缓存,容易出现问题.

--在开始用HttpURLConnection对象的setRequestProperty()设置,就是生成HTML文件头.

3.向Internet发送xml数据

XML格式是通信的标准语言,Android系统也可以通过发送XML文件传输数据.

1)将生成的XML文件写入到byte数组中,并设置为UTF-8:byte[] xmlbyte = xml.toString().getBytes("UTF-8");

2)创建URL对象,并指定地址和参数:URL url = new URL(http://localhost:8080/itcast/contanctmanage.do?method=readxml);

3)获得链接:HttpURLConnection conn = (HttpURLConnection) url.openConnection();

4)设置连接超时:conn.setConnectTimeout(6* 1000);

5)设置允许输出conn.setDoOutput(true);

6)设置不使用缓存:conn.setUseCaches(false);

7)设置以POST方式传输:conn.setRequestMethod("POST");

8)维持长连接:conn.setRequestProperty("Connection", "Keep-Alive");

9)设置字符集:conn.setRequestProperty("Charset", "UTF-8");

10)设置文件的总长度:conn.setRequestProperty("Content-Length", String.valueOf(xmlbyte.length));

11)设置文件类型:conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");

12)以文件流的方式发送xml数据:outStream.write(xmlbyte);

总结:

--我们使用的是用HTML的方式传输文件,这个方式只能传输一般在5M一下的文件.

--传输大文件不适合用HTML的方式,传输大文件我们要面向Socket编程.确保程序的稳定性--将地址和参数存到byte数组中:byte[] data = params.toString().getBytes();

二、HttpClient

HttpClient拥有DefaultHttpClient和AndroidHttpClient两个具体的实现类,它们都有众多的API,而且实现比较稳定,bug数量也很少。但也正是因为HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前Android开发团队在提升和优化HttpClient方面的工作态度并不积极。

使用 HttpClient 需要以下 6 个步骤:

1. 创建 HttpClient 的实例

2. 创建某种连接方法的实例,在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址

3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例

4. 读 response

5. 释放连接。无论执行方法是否成功,都必须释放连接

6. 对得到后的内容进行处理

1.获取网页数据(比如浏览器等)

public class SimpleClient {
public static void main(String[] args) throws IOException
{
HttpClient client = new HttpClient();
// 设置代理服务器地址和端口
//client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);
// 使用 GET 方法 ,如果服务器需要通过 HTTPS 连接,那只需要将下面 URL 中的 http 换成 https
HttpMethod method=new GetMethod("http://java.sun.com");
//使用POST方法
//HttpMethod method = new PostMethod("http://java.sun.com");
client.executeMethod(method);

//打印服务器返回的状态
System.out.println(method.getStatusLine());
//打印返回的信息
System.out.println(method.getResponseBodyAsString());
//释放连接
method.releaseConnection();
}
}


2.向Internet发送请求参数(提交请求参数,有get和post两种方式)

private void PostByHttpClient(final String url)
{
new Thread()
{
public void run()
{
try{
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("user", "猪大哥"));
params.add(new BasicNameValuePair("pawd", "123"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params,"UTF-8");
httpPost.setEntity(entity);
HttpResponse httpResponse =  httpClient.execute(httpPost);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity entity2 = httpResponse.getEntity();
detail = EntityUtils.toString(entity2, "utf-8");
handler.sendEmptyMessage(SHOW_DATA);
}
}catch(Exception e){e.printStackTrace();}
};
}.start();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: