首页 > 代码库 > Android之Http网络编程(一)

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

Android之Http网络编程(一)