HttpClient 远程接口调用方式
2019-08-16 11:25:35来源:博客园 阅读 ()
HttpClient 远程接口调用方式
远程接口调用方式HttpClient 问题:现在我们已经开发好了接口了,那该如何调用这个接口呢? 答:使用Httpclient客户端。 Httpclient简介 什么是httpclient HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等) 下载地址:http://hc.apache.org/ httpclient作用 在java代码中,发送Http请求。通常用来实现远程接口调用。 HttpClient测试 在工程中添加httpclient的pom依赖。<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency>
执行GET请求
public static void doGet(){ // 创建Httpclient对象 CloseableHttpClient httpclient = HttpClients.createDefault(); // 创建http GET请求 HttpGet httpGet = new HttpGet("http://www.oschina.net/"); CloseableHttpResponse response = null; try { // 执行请求 response = httpclient.execute(httpGet); System.out.println(response.getStatusLine()); // 判断返回状态是否为200 if (response.getStatusLine().getStatusCode() == 200) { String content = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println("内容长度:" + content.length()); } }catch(Exception e){ e.printStackTrace(); } finally { if (response != null) { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } }
执行GET带参数
public static void doGetParam(){ // 创建Httpclient对象 CloseableHttpClient httpclient = HttpClients.createDefault(); CloseableHttpResponse response = null; try { // 定义请求的参数 URI uri = new URIBuilder("http://www.baidu.com/s").setParameter("wd", "数据库").build(); System.out.println(uri); // 创建http GET请求 HttpGet httpGet = new HttpGet(uri); // 执行请求 response = httpclient.execute(httpGet); // 判断返回状态是否为200 if (response.getStatusLine().getStatusCode() == 200) { String content = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println(content); } }catch(Exception e){ e.printStackTrace(); }finally { if (response != null) { try { response.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } try { httpclient.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
执行post请求
public static void doPost(){ // 创建Httpclient对象 CloseableHttpClient httpclient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build(); // 创建http POST请求 HttpPost httpPost = new HttpPost("http://www.oschina.net/"); CloseableHttpResponse response = null; try { // 执行请求 response = httpclient.execute(httpPost); System.out.println(response.getStatusLine()); // 判断返回状态是否为200 if (response.getStatusLine().getStatusCode() == 200) { String content = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println(content); } }catch(Exception e){ e.printStackTrace(); }finally { if (response != null) { try { response.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } try { httpclient.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
执行post带参数
public static void doPostParam() throws Exception{ // 创建Httpclient对象 CloseableHttpClient httpclient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build(); // 创建http POST请求 HttpPost httpPost = new HttpPost("http://www.oschina.net/search"); // 设置2个post参数,一个是scope、一个是q List<NameValuePair> parameters = new ArrayList<NameValuePair>(); parameters.add(new BasicNameValuePair("scope", "project")); parameters.add(new BasicNameValuePair("q", "java")); // 构造一个form表单式的实体 UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters); // 将请求实体设置到httpPost对象中 httpPost.setEntity(formEntity); CloseableHttpResponse response = null; try { // 执行请求 response = httpclient.execute(httpPost); System.out.println(response.getStatusLine()); // 判断返回状态是否为200 if (response.getStatusLine().getStatusCode() == 200) { String content = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println(content); } } finally { if (response != null) { response.close(); } httpclient.close(); } }
httpclient常见问题及解决方案 请求参数乱码 设置请求的编码格式:
obj.addHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
响应HTTP/1.1 403 Forbidden 原因:网站设置了反爬虫机制,禁止非法访问。 解决方案:伪装浏览器。
obj.addHeader("User-Agent"," Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537. 36 (KHTML, like Gecko) Chrome/31.0.1650.63")
封装通用工具类HttpClientUtils
package org.chu.ego.base.utils; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.client.LaxRedirectStrategy; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; /** * --发送get请求的api * CloseableHttpClient类 ,client实现类 * HttpClients类 ,client工具类,用于创建客户端对象。 * CloseableHttpResponse接口,请求的响应对象 * URIBuilder类 :url构建类,用于设置get请求的路径变量 * HttpGet类 :get请求的发送对象 * EntityUtils类 实体处理类 * * --发送post 请求使用的api * CloseableHttpClient类 * HttpClientBuilder client构建对象,用于创建客户端对象。 * LaxRedirectStrategy类,post请求重定向的策略 * CloseableHttpResponse 请求的响应对象 * HttpPost post请求的发送对象 * NameValuePair 类,用于设置参数值 * UrlEncodedFormEntity:用于设置表单参数给发送对象HttpPost * * @author ranger * */ public class HttpClientUtils { public static String doGet(String url,Map<String, String> params){ //获取httpclient客户端 CloseableHttpClient httpclient = HttpClients.createDefault(); String resultString = ""; CloseableHttpResponse response = null; try { URIBuilder builder = new URIBuilder(url); if(null!=params){ for (String key:params.keySet()) { builder.setParameter(key, params.get(key)); } } HttpGet get = new HttpGet(builder.build()); response = httpclient.execute(get); System.out.println(response.getStatusLine()); if(200==response.getStatusLine().getStatusCode()){ HttpEntity entity = response.getEntity(); resultString = EntityUtils.toString(entity, "utf-8"); } } catch (Exception e) { e.printStackTrace(); } finally { if(null!=response){ try { response.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(null!=httpclient){ try { httpclient.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return resultString; } public static String doGet(String url){ return doGet(url, null); } public static String doPost(String url,Map<String,String> params){ /** * 在4.0及以上httpclient版本中,post需要指定重定向的策略,如果不指定则按默认的重定向策略。 * * 获取httpclient客户端 */ CloseableHttpClient httpclient = HttpClientBuilder.create().setRedirectStrategy( new LaxRedirectStrategy()).build(); String resultString = ""; CloseableHttpResponse response = null; try { HttpPost post = new HttpPost(url); List<NameValuePair> paramaters = new ArrayList<>(); if(null!=params){ for (String key : params.keySet()) { paramaters.add(new BasicNameValuePair(key,params.get(key))); } UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity (paramaters); post.setEntity(formEntity); } /** * HTTP/1.1 403 Forbidden * 原因: * 有些网站,设置了反爬虫机制 * 解决的办法: * 设置请求头,伪装浏览器 */ post.addHeader("user-agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"); response = httpclient.execute(post); System.out.println(response.getStatusLine()); if(200==response.getStatusLine().getStatusCode()){ HttpEntity entity = response.getEntity(); resultString = EntityUtils.toString(entity, "utf-8"); } } catch (Exception e) { e.printStackTrace(); } finally { if(null!=response){ try { response.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(null!=httpclient){ try { httpclient.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return resultString; } public static String doPost(String url){ return doPost(url, null); } }
原文链接:https://www.cnblogs.com/aknife/p/11265878.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring系列.ApplicationContext接口 2020-06-11
- 为什么阿里巴巴Java开发手册中强制要求接口返回值不允许使用 2020-06-06
- Java生鲜电商平台-生鲜电商接口幂等性原理与防重复提交方案( 2020-06-05
- Java连载120-反射机制获取构造方法和父类、父接口 2020-06-05
- Java Spring注入一个接口的多个实现类在map里如何实现?案 2020-06-04
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash