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

来源:互联网 发布:北方医疗大数据 编辑:程序博客网 时间:2024/04/30 10:49

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();
0 0
原创粉丝点击