Android之Http网络编程(一)

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通信的最常见的最简单的使用我们都会了。至于这两种通信方式的更进一步的使用,需要我们大家更进一步的学习和理解,加油!

时间: 2024-12-20 13:33:41

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

Android之Http网络编程(三)

在前面两篇博客<Android之Http网络编程(一)>.<Android之Http网络编程(二)>中,简单的介绍了对网页的请求和客户端与服务端的简单的参数交互.那么,这一篇博客就来认识一下Android客户端获取服务端返回的数据. 大家都知道客户端与服务端的交互大体过程如下: Android客户端向服务器发出请求. 服务端接收请求并响应. 服务端返回数据给客户端. 对于Android客户端来说,最重要的也就莫过于获取服务端返回的数据来展示了. 那么,首先我们要知道服务端返回的数据

Android开发中网络编程与常见功能优化总结

Android提供的AsyncTask,但事实上AsyncTask的问题更加严重,Thread只有在run函数不结束时才出现这种内存泄露问题,然而AsyncTask内部的实现机制是运用了 ThreadPoolExcutor,该类产生的Thread对象的生命周期是不确定的,是应用程序无法控制的,因此如果AsyncTask作为Activity的内部类,就更容易出现内存泄露的问题. 一般的应用都是从服务器获取数据,然后通过极致的界面风格,将数据清晰,明朗的展现给用户. 那么就可以分为这两块: 1.界面

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

网络图片查看器 1. 确定图片的网址 2. 发送http请求 URL url = new URL(address); // 获取客户端和服务器的连接对象,此时还没有建立连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置请求方法,注意必须大写 conn.setRequestMethod("GET"); // 设置连接和读取超时 conn.setConnectTimeout(5000); c

Android中的网络编程

谷歌在Android6.0之后就废弃了使用HttpClinet进行网络连接.所以,这里需要重点学习的是通过HttpUrlConnect进行网络连接. String path="这里是你想要的连接"; URL url=new URL(path); HttpURLConnection huc=(HttpURLConnection)url.openConnection(); huc.setConnectTimeout(3000); huc.setReadTimeout(3000); //请求

Android之Http网络编程(二)

上一篇文章简单的介绍了Android中http的两种通信方式,并且分别用获取百度网页做了实例.但是在实际应用中,更多的是客户端通过请求的参数来实现在服务端的具体操作,并最终返回数据给客户端.因为我们不可能对客户端的每一个需要网络请求的操作都单独的设置一个不变的网络地址. (因为我是从.net转过来的还没真正学过java web,所以web方面的代码比较简单,大家见谅.) 下面我们来做一个简单的小例子:(简单的用户登录) 这里我们会使用到tomcat,以及Genimotion获取本地IP的方法.对

Android学习笔记-网络编程

1.使用UDP协议传输数据 UDP协议不可靠,数据包发送出去之后无法确定是否被接收方接收到 在Java里写好Server如下 package com.umgsai.server; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.util.Calendar; import java.util.Date; public class Server { static Date date ; publi

Android之Http网络编程(四)

前面几篇博文简单的介绍了一些常见的Http的操作,这些操作几乎都是在新开的线程中进行的网络请求,并在日志中打印出获取到的网络数据.那么,问题来了!(呃~感觉下一句是蓝翔有木有?)如何在把获取到的网络数据显示在UI界面上呢?如果按照前几篇博文的例子,并在主线程中直接对子线程获取的网络数据直接进行操作就会发现一个问题,那就是在主线程中根本就获取不到子线程得到的从服务器返回的数据.因为,网络操作属于耗时操作,为了不阻塞主线程而放在子线程中,当主线程中的代码执行完后子线程未必就获取到服务器返回的数据了.

Android中的网络编程系列(一):URLConnection

转载请注明出处:http://blog.csdn.net/bettarwang/article/details/41229955 URL(Uniform Resource Locator)对象代表统一资源定位器,它是指向互联网资源的指针.URL由协议名.主机.端口和资源路径组件,即满足如下格式: protocol://host:port/path 例如http://kan.sogou.com/dianying/就是一个URL地址. URL提供了多个构造方法用于创建URL对象,同时它提供的主要方法

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

Apache HttpClient框架 GET方式请求提交数据 1. 创建一个HttpClient HttpClient hc = new DefaultHttpClient(); 2. 创建一个HttpGet,要提交给服务器的数据已经拼接在path中 HttpGet hg = new HttpGet(path); 3. 使用HttpClient对象发送GET请求,建立连接,返回响应头对象 HttpResponse hr = hc.execute(hg); 4. 拿到响应头中的状态行,获取状态码