HttpClient网络访问

一、HttpClient网络访问:

(一)、简介:
1、Apache组织提供了HttpClient项目,可以实现网络访问。在Android中,成功集成了HttpClient,所以在Android中可以直接使用HttpClient访问网络。
2、与HttpURLConnection相比,HttpClient将前者中的输入、输出流操作,统一封装成HttpGet、HttpPost、HttpRequest类。

* HttpClient:网络连接对象;
* HttpGet:代表发送GET请求;
* HttpPost:代表发送POST请求;
* HttpResponse:代表处理服务器响应的对象。
* HttpEntity对象:该对象中包含了服务器所有的返回内容。

3、使用步骤:

1. 创建HttpClient对象:通过实例化DefaultHttpClient获得;
2. 创建HttpGet或HttpPost对象:通过实例化 HttpGet或HttpPost 获得,而构造方法的参数是urlstring(即需要访问的网络url地址)。也可以通过调用setParams()方法来添加请求参数;
3. 调用HttpClient对象的execute()方法,参数是刚才创建的 HttpGet或HttpPost对象 ,返回值是HttpResponse对象;
4. 通过response对象中的getStatusLine()方法和getStatusCode()方法获取服务器响应状态是否是200。
5. 调用 HttpResponse对象的getEntity()方法,返回HttpEntity对象。而该对象中包含了服务器所有的返回内容。
6. 借助EntityUtils的toString()方法或toByteArray()对 HttpEntity对象进行处理,也可以通过IO流对 HttpEntity对象进行操作。

(二)、封装HttpClientHelper工具类:

publicclass HttpClientHelper {
publicstatic HttpClient checkNetwork(String url) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
HttpResponse httpResponse = null;
try {
httpResponse = httpClient.execute(request);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
return httpClient;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
returnnull;
}

/**
* 作用:实现网络访问文件,将获取到数据储存在文件流中
* 
* @param url
*            :访问网络的url地址
* @returninputstream
*/
publicstatic InputStream loadFileFromURL(String url) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet requestGet = new HttpGet(url);
HttpResponse httpResponse;
try {
httpResponse = httpClient.execute(requestGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = httpResponse.getEntity();
return entity.getContent();
}
} catch (Exception e) {
e.printStackTrace();
}
returnnull;
}

/**
* 作用:实现网络访问文件,将获取到的数据存在字节数组中
* 
* @param url
*            :访问网络的url地址
* @return byte[]
*/
publicstaticbyte[] loadByteFromURL(String url) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet requestGet = new HttpGet(url);
try {
HttpResponse httpResponse = httpClient.execute(requestGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
return EntityUtils.toByteArray(httpEntity);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("====>" + e.toString());
}
returnnull;
}

/**
* 作用:实现网络访问文件,返回字符串
* 
* @param url
*            :访问网络的url地址
* @return String
*/
publicstatic String loadTextFromURL(String url) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet requestGet = new HttpGet(url);
try {
HttpResponse httpResponse = httpClient.execute(requestGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
return EntityUtils.toString(httpEntity,"utf-8");
}
} catch (Exception e) {
e.printStackTrace();
}
returnnull;
}

/**
* 作用:实现网络访问文件,先给服务器通过“GET”方式提交数据,再返回相应的数据
* 
* @param url
*            :访问网络的url地址
* @param params
*            String url:访问url时,需要传递给服务器的参数。
*            第二个参数格式为:username=wangxiangjun&password=123456
* @return byte[]
*/
publicstaticbyte[] doGetSubmit(String url,String params) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet requestGet = new HttpGet(url + "?" + params);
try {
HttpResponse httpResponse = httpClient.execute(requestGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
return EntityUtils.toByteArray(httpEntity);
}
} catch (Exception e) {
e.printStackTrace();
}
returnnull;
}

/**
* 作用:实现网络访问文件,先给服务器通过“POST”方式提交数据,再返回相应的数据
* 
* @param url
*            :访问网络的url地址
* @param params
*            String url:访问url时,需要传递给服务器的参数。 第二个参数为:List<NameValuePair>
* @return byte[]
*/
publicstaticbyte[] doPostSubmit(String url,List<NameValuePair> params) {
HttpClient httpClient = new DefaultHttpClient();
HttpPost requestPost = new HttpPost(url);
try {
requestPost.setEntity(new UrlEncodedFormEntity(params,"utf-8"));
HttpResponse httpResponse = httpClient.execute(requestPost);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
return EntityUtils.toByteArray(httpEntity);
}
} catch (Exception e) {
e.printStackTrace();
}
returnnull;
}

/**
* 作用:实现网络访问文件,先给服务器通过“POST”方式提交数据,再返回相应的数据
* 
* @param url
*            :访问网络的url地址
* @param params
*            String url:访问url时,需要传递给服务器的参数。 Map<String,Object>
* @return byte[]
*/
publicstaticbyte[] doPostSubmit(String url,Map<String,Object> params) {
HttpClient httpClient = new DefaultHttpClient();
HttpPost requestPost = new HttpPost(url);

List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
try {
if (params != null) {
for (Map.Entry<String,Object> entry : params.entrySet()) {
String key = entry.getKey();
String value = entry.getValue().toString();
BasicNameValuePair nameValuePair = new BasicNameValuePair(
key,value);
parameters.add(nameValuePair);
}
}
requestPost
.setEntity(new UrlEncodedFormEntity(parameters,"utf-8"));
HttpResponse httpResponse = httpClient.execute(requestPost);

if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
return EntityUtils.toByteArray(httpEntity);
}
} catch (Exception e) {
e.printStackTrace();
}
returnnull;
}
}

POST和GET在表单提交时的区别:
  Post传递必须依赖于表单,传值的内容没有大小限制,传值内容不会在地址栏显示,比 Get 传值安全;
  Get传值的内容会通过地址栏显示,而地址栏长度有最大长度限制,因为 Get 传参内容不可以过长,当超过某个长度后会自动裁切掉多余内容。比起 Post 传参, Get 传参不够安全。但是 Get 传参可以通过表单,也可以不通过表单,直接通过地址栏传参。因此 Get 传参更灵活。

相关文章

Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...