当前位置: 首页 > >

网络连接之??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{//在线程中去连接网络

@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();



友情链接: