Android之Http网络编程(一)
Android应用作为一个客户端程序绝大部分都是需要进行网络请求和访问的,而http通信是一种比较常见并常用的通信方式。
在Android中http网络编程中有两种实现方式,一种是使用HttpURLConnection,另一种就是使用HttpClient。
这两种实现方式的大体过程都是:
- Android客户端向服务器发出请求。
- 服务端接收请求并响应。
- 服务端返回数据给客户端。
在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根据使用目的不同,在具体使用时会稍有区别。下面,就常见的几种应用举例说明。
- 从Internet获取网页,即向URL发送请求,将网页以流的形式读回本地。
- 从Internet获取文件,即利用HttpURLConnection对象从网络中获取文件数据。
- 向Internet发送请求参数,即向服务器传递参数,即向服务器传递参数。
- 向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网络编程(一)的更多相关文章
- Android之Http网络编程(三)
在前面两篇博客<Android之Http网络编程(一)>.<Android之Http网络编程(二)>中,简单的介绍了对网页的请求和客户端与服务端的简单的参数交互.那么,这一篇博 ...
- Android应用开发-网络编程(一)(重制版)
网络图片查看器 1. 确定图片的网址 2. 发送http请求 URL url = new URL(address); // 获取客户端和服务器的连接对象,此时还没有建立连接 HttpURLConnec ...
- Android应用开发-网络编程(一)
网络图片查看器 1. 确定图片的网址 2. 发送http请求 URL url = new URL(address); // 获取客户端和服务器的连接对象,此时还没有建立连接 HttpURLConnec ...
- Android之Http网络编程(四)
前面几篇博文简单的介绍了一些常见的Http的操作,这些操作几乎都是在新开的线程中进行的网络请求,并在日志中打印出获取到的网络数据.那么,问题来了!(呃~感觉下一句是蓝翔有木有?)如何在把获取到的网络数 ...
- Android之Http网络编程(二)
上一篇文章简单的介绍了Android中http的两种通信方式,并且分别用获取百度网页做了实例.但是在实际应用中,更多的是客户端通过请求的参数来实现在服务端的具体操作,并最终返回数据给客户端.因为我们不 ...
- Android中的网络编程
谷歌在Android6.0之后就废弃了使用HttpClinet进行网络连接.所以,这里需要重点学习的是通过HttpUrlConnect进行网络连接. String path="这里是你想要的 ...
- Android应用开发-网络编程(二)(重制版)
Apache HttpClient框架 GET方式请求提交数据 1. 创建一个HttpClient HttpClient hc = new DefaultHttpClient(); 2. 创建一个Ht ...
- Android应用开发-网络编程(二)
Apache HttpClient框架 GET方式请求提交数据 1. 创建一个HttpClient HttpClient hc = new DefaultHttpClient(); 2. 创建一个Ht ...
- Android网络编程概述
Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包 ...
随机推荐
- keil编译STM32工程时 #error directive: "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"
我们可以双击错误,然后会自动定位到文件 stm32f10x.h 中出错的地方,可以看到代码: #if !defined (STM32F10X_LD) && !defined (STM3 ...
- Keil C51汉字显示的bug问题
一.缘起 这两天改进MCU的液晶显示方法,采用“即编即显”的思路,编写了一个可以直接显示字符串的程序.如程序调用disstr("我是你老爸");液晶屏上就会显示“我是你老爸”. 二 ...
- nyoj 60 谁获得了最高奖学金
谁获得了最高奖学金 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: ...
- 解决弹出的窗口window.open会被浏览器阻止的问题(自定义open方法)
由于在使用window.open时,在很多情况下,弹出的窗口会被浏览器阻止,但若是使用a链接target='_blank',则不会,基于这一特点,自己封装了一个open方法: function ope ...
- magento 列表页显示产品属性值的几种调用方式
之前有人提到要在列表显示一些特定的属性,除了自带的名字,价格等.因为列表页和产品页都有一个同名的产品对象:$_product,而在产品页,$_product是直接可以用$_product->ge ...
- Oracle- PL/SQL DEV工具的使用收集
1.工具---首选项---用户界面---编辑器----定制关键词 里面可以选择关键字是否大写 2.美化代码段,点击菜单edit,然后pl/sql beautifer,快捷键:PL/SQL Develo ...
- 【数据结构】非常有用的hash表
这篇博客的目的是让尚未学会hash表的朋友们对hash表有一个直观的理解,并且能根据本文定义出属于自己的第一个hash表,但算不上研究文,没有深究概念和成功案例. 什么是has ...
- JavaScript要点(十) HTML DOM - 改变 HTML
HTML DOM 允许 JavaScript 改变 HTML 元素的内容. A.改变 HTML 输出流 JavaScript 能够创建动态的 HTML 内容: 今天的日期是: Thu Oct 13 2 ...
- SCOM MP中的PowerShell脚本
该脚本可在MP中运行 #param ($file,$threshold) #此处可定义file 和 threshold 参数,该参数可以从脚本外部接收 $threshold = 10 $file = ...
- cocos2dx windows phone平台下CCLabelTTF自己主动换行的实现(2)
前几天发过一篇文章说怎样实现wp8下的CCLabelTTF怎样自己主动换行,后来发现果如预料的那般.效果非常不好.主要是非等宽字体的情况下看着非常糟心.因此再改动了一版.效果要好非常多了. 详细实现事 ...