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. 推荐vpn的文章

    http://wsgzao.github.io/post/fq/ 免费方案 各个平台的解决方案都不唯一,请认真阅读原文中的说明部分 百度浏览器 你这么大摇大摆提供FQ插件,真不用担心360菊(jǔ)爆 ...

  2. MariaDB-5.5.32源码编译安装

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:Oracle公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分 ...

  3. Oracle-查看oracle是否有表被锁

    问题现象: 查看oracle是否有表被锁 解决方法: select sid,serial#,program,terminal,username,b.object_id,c.object_name  f ...

  4. PCb过孔大小设置 / 丝印层字符尺寸设置

    PCb过孔大小一般设置为:内孔(孔尺寸)0.30(12mil),外壳(直径)0.6(24mil) 常用过孔设置: 内径: 15mil(0.381mm)  30mil(0.762mm) 外径: 20mi ...

  5. SQL Server中取两个表的交集,并集和差集

    在项目中遇到要取两个表差集的情况 假设有两个表tblNZPostCodes, NZPostcode  两个表中存储的都是新西兰的post code信息,字段一致,只是数据上有所差异. 1. Union ...

  6. jsp值传到后台Struts2中的action三种方法

    Action接收表单传递过来的参数有3种方法: 如,登陆表单login.jsp: <form action="login" method="post" n ...

  7. CGAffineTransform相关函数

    CoreGraphics.h CGAffineTransform rotation = CGAffineTransformMakeRotation(M_PI_2);
[xxx setTransform ...

  8. 网页标签图片如何保存&下载?

    最简单的方法就是鼠标右键,查看网页源代码,ctrl+f输入favicon.ico,一般网站都是这个

  9. Sql Server 存储过程使用技巧

    1.创建带Try...Catch的存储过程模板 Copy下面的代码,然后新建查询,就可以写sql语句,执行完后,一个你自己的存储过程就建立好了! USE [DB]--设定对应的数据库 GO SET A ...

  10. 使用JDK自带jvisualvm监控tomcat

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...