Android应用作为一个客户端程序绝大部分都是需要进行网络请求和访问的,而http通信是一种比较常见并常用的通信方式。

在Android中http网络编程中有两种实现方式,一种是使用HttpURLConnection,另一种就是使用HttpClient。

这两种实现方式的大体过程都是:

  1. Android客户端向服务器发出请求。
  2. 服务端接收请求并响应。
  3. 服务端返回数据给客户端。

在Http通信中有POST和GET两种方式,其不同之处在于GET方式可以获得静态页面,同时可以将请求参数放在URL字符串后面,传递给服务器;而POST方式的参数则是放在Http请求中的。因此,无论你是用哪一种HTTP实现方式都需要明确所使用的请求方式。

下面我们我们先来认识HttpURLConnection:

HttpURLConnection继承于URLConnection类,二者都是抽象类。其对象主要通过URL对象的openConnection方法创建,在获得HttpURLConnection对象之后,默认采用GET方式请求数据,此时即可使用输入流读取信息。

示例如下:(其中strurl为“http://www.baidu.com”)

private HttpURLConnection conn;

URL url = new URL(strurl);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");//设置请求方式
conn.setConnectTimeout(6 * 1000);//设置连接超时的时间
conn.setReadTimeout(8000);//设置读取超时的毫秒数
if (conn.getResponseCode() != 200)//判断是否请求成功
throw new RuntimeException("运行异常");
//获取服务器返回的输入流
InputStream is = conn.getInputStream();

如果使用POST方式,还需要对一些参数进行设置(包括上面示例中的一些设置,除此之外还有以下常见设置)。

          conn.setConnectTimeout(6 * 1000);//设置连接超时的时间
conn.setReadTimeout(8000);//设置读取超时的毫秒数
conn.setDoOutput(true);//是否允许输出
conn.setUseCaches(false);//是否使用缓存
conn.setRequestMethod("POST");//设置请求方式
conn.setInstanceFollowRedirects(true);//是否自动执行http重定向
//以下设置一般请求属性,即网页的头部信息
conn.setRequestProperty("Charset", "UTF-8");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "application/x-www-from-urlencoded");
conn.setRequestProperty("Content-Length", String.valueOf(data.length));

HttpURLConnection根据使用目的不同,在具体使用时会稍有区别。下面,就常见的几种应用举例说明。

  1. 从Internet获取网页,即向URL发送请求,将网页以流的形式读回本地。
  2. 从Internet获取文件,即利用HttpURLConnection对象从网络中获取文件数据。
  3. 向Internet发送请求参数,即向服务器传递参数,即向服务器传递参数。
  4. 向Internet传送XML数据。(使用HTTP的的方式传输文件,一般文件大小在5M一下,HTTP通信方式不适合传输大文件,对大文件的传输最好使用Socket通信方式,以保证程序的稳定性。)

下面我们以第一种为例:

static String strurl = "http://www.baidu.com";

public static void testHttpUrlConnection() {
new Thread(new Runnable() {
private HttpURLConnection conn; public void run() { try {
URL url = new URL(strurl);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");//设置请求方式
conn.setConnectTimeout(6 * 1000);//设置连接超时的时间
conn.setReadTimeout(8000);//设置读取超时的毫秒数 if (conn.getResponseCode() != 200)//判断是否请求成功
throw new RuntimeException("运行异常");
//获取服务器返回的输入流
InputStream is = conn.getInputStream();
String str = convertStreamToString(is);
System.out.println("HttpUrlConnection方式"+str); } catch (Exception e) {
System.out.println("utils异常");
e.printStackTrace();
}
//关闭http链接
conn.disconnect();
}
}).start(); }

将流转换成字符串

/**
* 将流转换成字符串
*
* @param is
* @return
*/
public static String convertStreamToString(InputStream is) {
/*
* To convert the InputStream to String we use the
* BufferedReader.readLine() method. We iterate until the BufferedReader
* return null which means there's no more data to read. Each line will
* appended to a StringBuilder and returned as String.
*/
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder(); String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
} return sb.toString();
}

运行程序,测试结果如下:

获取网页成功。

接下来,我们来简单的认识HttpClient:

HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。

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

我们用HttpClient实现上面HttpURLConnection获取百度网页的同样的功能。

public static void testHtppClient() {
new Thread(new Runnable() { @Override
public void run() {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(strurl);
HttpResponse response; try {
response = client.execute(request);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
String str = EntityUtils.toString(response.getEntity());
System.out.println("HtppClient实现方式"+str);
} } catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}).start();
}

结果如下:

目前,两种http通信的最常见的最简单的使用我们都会了。至于这两种通信方式的更进一步的使用,需要我们大家更进一步的学习和理解,加油!

注意:如果要将获取到的网络数据添加到界面上,需要使用到Android的异步消息处理机制。因为对网络的操作属于耗时操作,为了不阻塞主线程我们一般新开一个新的线程来执行网络请求。然而,只有主线程(即UI线程)可以更新界面,因此我们获取的网络数据通过异步消息处理机制从子线程传递到主线程,并最终实现更新UI。

对异步消息处理机制不熟悉的话 ,可以参考另外两篇博文《Android线程与异步消息处理机制》、《Android 在子线程中更新UI》。

DEMO下载:http://download.csdn.net/detail/af74776/7994837

Android之Http网络编程(一)的更多相关文章

  1. Android之Http网络编程(三)

    在前面两篇博客<Android之Http网络编程(一)>.<Android之Http网络编程(二)>中,简单的介绍了对网页的请求和客户端与服务端的简单的参数交互.那么,这一篇博 ...

  2. Android应用开发-网络编程(一)(重制版)

    网络图片查看器 1. 确定图片的网址 2. 发送http请求 URL url = new URL(address); // 获取客户端和服务器的连接对象,此时还没有建立连接 HttpURLConnec ...

  3. Android应用开发-网络编程(一)

    网络图片查看器 1. 确定图片的网址 2. 发送http请求 URL url = new URL(address); // 获取客户端和服务器的连接对象,此时还没有建立连接 HttpURLConnec ...

  4. Android之Http网络编程(四)

    前面几篇博文简单的介绍了一些常见的Http的操作,这些操作几乎都是在新开的线程中进行的网络请求,并在日志中打印出获取到的网络数据.那么,问题来了!(呃~感觉下一句是蓝翔有木有?)如何在把获取到的网络数 ...

  5. Android之Http网络编程(二)

    上一篇文章简单的介绍了Android中http的两种通信方式,并且分别用获取百度网页做了实例.但是在实际应用中,更多的是客户端通过请求的参数来实现在服务端的具体操作,并最终返回数据给客户端.因为我们不 ...

  6. Android中的网络编程

    谷歌在Android6.0之后就废弃了使用HttpClinet进行网络连接.所以,这里需要重点学习的是通过HttpUrlConnect进行网络连接. String path="这里是你想要的 ...

  7. Android应用开发-网络编程(二)(重制版)

    Apache HttpClient框架 GET方式请求提交数据 1. 创建一个HttpClient HttpClient hc = new DefaultHttpClient(); 2. 创建一个Ht ...

  8. Android应用开发-网络编程(二)

    Apache HttpClient框架 GET方式请求提交数据 1. 创建一个HttpClient HttpClient hc = new DefaultHttpClient(); 2. 创建一个Ht ...

  9. Android网络编程概述

    Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包 ...

随机推荐

  1. 编译并使用Lua语言

    Lua是一个小巧的脚本语言,该语言设计的目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. 可扩展性.Lua的扩展性非常卓越,可以通过Lua代码或C代码扩展,很多功能可以通过外部库来扩 ...

  2. 1N系列稳压二极管参数

    1N系列稳压二极管参数 型号 稳定电压 型号 稳定电压 型号 稳定电压 1N5236 7.5 1N5738 12 1N6002 12 1N5237 8.2 1N5739 13 1N6003 13 1N ...

  3. HDU 2222 Keywords Search(AC自动机模板题)

    学习AC自动机请戳这里:大神blog........ 自动机的模板: #include <iostream> #include <algorithm> #include < ...

  4. 软交换和IMS是什么关系

    软交换是一种功能实体,为下一代网络NGN提供具有实时性要求的业务的呼叫控制和连接控制功能,是下一代网络呼叫与控制的核心. 简单地看,软交换是实现传统程控交换机的"呼叫控制"功能的实 ...

  5. 把SVN添加到windows服务

    sc create SVN_Service binpath= "D:\DevTools\Subversion\bin\svnserve.exe --service --root D:\Dev ...

  6. 理解shared_ptr<T> ---2

    1.引用计数字段不能放在资源管理类中.我们的解决办法是,把引用计数和资源绑在一起,进行二次封装.但是这样存在一个大问题,不同类型的资源管理类不能兼容.也就是说,shared_ptr<Dog> ...

  7. Codeforces Round #324 (Div. 2) C. Marina and Vasya 贪心

    C. Marina and Vasya Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/584/pr ...

  8. 滑雪_poj_1088(记忆化搜索).java

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 67987   Accepted: 25013 Description ...

  9. 《Java并发编程实战》第十五章 原子变量与非堵塞同步机制 读书笔记

    一.锁的劣势 锁定后假设未释放.再次请求锁时会造成堵塞.多线程调度通常遇到堵塞会进行上下文切换,造成很多其它的开销. 在挂起与恢复线程等过程中存在着非常大的开销,而且通常存在着较长时间的中断. 锁可能 ...

  10. javascript---遇到关于this的相关问题(解决this)(持续更新中...)

    1.在原型中使用this <!doctype html> <html lang="en"> <head> <meta charset=&q ...