网络连接之——HttpClient(doGet和doPost)

1.概述:

我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。当然有时也用URLConnection。
Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。

但在android6.0之后,HttpClient被完全抛弃。如果要继续使用需要Apache HttpClient,需要在eclipse下libs里添加org.apache.http.legacy.jar,android studio里在相应的module下的build.gradle中加入:
android {
useLibrary ‘org.apache.http.legacy’
}


HttpClient和HttpURLConnection一样有doGet和doPost两种方式,这里仅介绍一下doGet方法,doPost方法仍旧和JAVA中学习的一样,如果忘记了可以看一下:doGet和doPost

资料:

 HttpClient其实是一个interface类型,HttpClient封装了对象需要执行的Http请求、身份验证、连接管理和其它特性。从文档上看,HttpClient有三个已知的实现类分别是:AbstractHttpClient, AndroidHttpClient, DefaultHttpClient,会发现有一个专门为Android应用准备的实现类AndroidHttpClient,当然使用常规的DefaultHttpClient也可以实现功能,但是既然开发的是Android应用程序,还是使用Android专有的实现类,一定有其优势。

 从两个类包所有在位置就可以看出区别,AndroidHttpClient定义在android.net.http.AndroidHttpClient包下,属于Android原生的http访问,而DefaultHttpClient定义在org.apache.http.impl.client.DefaultHttpClient包下,属于对apche项目的支持。而AndroidHttpClient没有公开的构造函数,只能通过静态方法newInstance()方法来获得AndroidHttpClient对象。
因为Android4.0之后对使用网络有特殊要求,已经无法再在主线程中访问网络了,必须使用多线程访问的模式

2.doGet方法:

这里使用一个范例来介绍一下doGet方法的使用:

范例:

功能:利用doGet方法去连接指定网络,并传输数据,服务器接收数据后,在其控制台打印。

思路:连接网络不能在主线程中进行,所以必须使用异步通信,这里我们使用AsyncTask的方式。
缺陷:由于每次点击按钮,都会开启一个线程去连接网络,这并不是我们想要的结果,所以下节博客,我们将会介绍一下谷歌提供的一些网络通信框架^^。

1)线程中连接服务器:

class MyAsyncTask extends AsyncTask<String, Integer, String>{//在线程中去连接网络

        @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            Log.d("message", result);
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            // TODO Auto-generated method stub
            super.onProgressUpdate(values);
        }

        @Override
        protected String doInBackground(String... arg0) {
            // TODO Auto-generated method stub
// HttpClientBuilder builder = HttpClientBuilder.create();
// builder.setConnectionTimeToLive(3000, TimeUnit.MICROSECONDS);//?
            //2.生成client
            HttpClient client = new DefaultHttpClient();//可以直接用DefaultHttpClient来创建client
            //3.设置为get方法
            String url = "http://192.168.0.74:8080/myServer/Myserverlet?name=zhangsan";
            HttpGet get = new HttpGet(url);
            Log.d("message", url);
            //4.设置服务器接收后数据的读取方式为utf-8
            get.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
            try {
                //5.执行get方法得到服务器的返回的所有的数据,都存到response中。
                HttpResponse response = client.execute(get);
                //6.httpclient 访问服务器返回的表头,包含http状态码
                StatusLine statusLine = response.getStatusLine();
                //7.得到状态码
                int code = statusLine.getStatusCode();

                if(code==HttpURLConnection.HTTP_OK){//如果连接成功
                    //8.获得数据实体
                    HttpEntity entity = response.getEntity();
                    //9.获得输入流
                    InputStream is = entity.getContent();

                    BufferedReader br = new BufferedReader(new InputStreamReader(is));
                    String line = br.readLine();
                    while(line != null){
                        System.out.println(line);
                        line=br.readLine();
                    }
                }
            } catch (ClientProtocolException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            return "连接成功!";
        }

    }

解析:
这里使用DefaultHttpClient创建client实例

HttpClient client = new DefaultHttpClient();

或者使用:

HttpClientBuilder builder = HttpClientBuilder.create().build();

2)开启线程。

MyAsyncTask mytask = new MyAsyncTask (); mytask.excute();

你可能感兴趣的:(android,http协议,android应用)