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 传参更灵活。

微信公众号【码农园区】,技术分享,值得关注

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
HttpClient 网络不可达可能是由于以下几个原因导致的。首先,可能是网络连接出现了问题,比如网络故障或者服务器宕机。其次,可能是由于网络配置问题,比如防火墙阻止了对服务器的访问。最后,可能是由于使用HttpClient 版本过旧或者配置不正确导致的。在处理这种情况时,可以考虑以下几个解决方案。首先,检查网络连接是否正常,确保网络畅通。其次,检查防火墙设置,确保允许对服务器的访问。最后,可以尝试升级 HttpClient 版本或者重新配置 HttpClient 的连接参数,比如设置适当的连接超时时间和读取超时时间,以适应网络环境。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [Web开发 之HttpClient详解](https://blog.csdn.net/const_/article/details/104424916)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [网关使用 Apache HttpClient 连接池出现异常](https://blog.csdn.net/huangjinjin520/article/details/125176293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦之归途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值