背景:

一般情况下都是 后端提供接口,前端调用,解决需求,但是有时需要后端调用后端接口。

几种方式总结:

在Java项目中调用第三方接口的方式有:

①通过JDK网络类Java.net.HttpURLConnection;

②通过common封装好的HttpClient;

③通过Apache封装好的HttpClient;由②发展来的

④通过SpringBoot-RestTemplate;

1. 通过JDK网络类Java.net.HttpURLConnection

比较原始的一种调用做法,这里把get请求和post请求都统一放在一个方法里面

public class HttpUrlConnectionToInterface {/*** 以post或get方式调用对方接口方法,* @param pathUrl*/public static void doPostOrGet(String pathUrl, String data){OutputStreamWriter out = null;BufferedReader br = null;String result = "";try {URL url = new URL(pathUrl);//打开和url之间的连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();//请求方式conn.setRequestMethod("POST");//conn.setRequestMethod("GET");//设置通用的请求属性conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");//DoOutput设置是否向httpUrlConnection输出,DoInput设置是否从httpUrlConnection读入,此外发送post请求必须设置这两个conn.setDoOutput(true);conn.setDoInput(true);/*** 下面的三句代码,就是调用第三方http接口*///获取URLConnection对象对应的输出流out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");//发送请求参数即数据out.write(data);//flush输出流的缓冲out.flush();/*** 下面的代码相当于,获取调用第三方http接口后返回的结果*///获取URLConnection对象对应的输入流InputStream is = conn.getInputStream();//构造一个字符流缓存br = new BufferedReader(new InputStreamReader(is));String str = "";while ((str = br.readLine()) != null){result += str;}System.out.println(result);//关闭流is.close();//断开连接,disconnect是在底层tcp socket链接空闲时才切断,如果正在被其他线程使用就不切断。conn.disconnect();} catch (Exception e) {e.printStackTrace();}finally {try {if (out != null){out.close();}if (br != null){br.close();}} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) {/***手机信息查询接口:http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=手机号*      http://api.showji.com/Locating/www.showji.com.aspx?m=手机号&output=json&callback=querycallback*/doPostOrGet("https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", "");}
}
2. 通过apache common封装好的HttpClient

httpClient的get或post请求方式步骤:

  1. 生成一个HttpClient对象并设置相应的参数
  2. 生成一个GetMethod对象或PostMethod并设置响应的参数
  3. 用HttpClient生成的对象来执行GetMethod生成的Get方法
  4. 处理响应状态码
  5. 若响应正常,处理HTTP响应内容
  6. 释放连接

pom文件添加依赖:

        <dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.1</version></dependency>
生活小提示:

如果有一些jar包找不到,(不是maven管理需要自己下载)有时候有各种问题,或者墙或者找不到之类,可以通过创建一个maven空项目,添加pom依赖,然后下载,在pom仓库里找到即可用。

public class HttpClientToInterface {/*** httpClient的get请求方式* 使用GetMethod来访问一个URL对应的网页实现步骤:* 1.生成一个HttpClient对象并设置相应的参数;* 2.生成一个GetMethod对象并设置响应的参数;* 3.用HttpClient生成的对象来执行GetMethod生成的Get方法;* 4.处理响应状态码;* 5.若响应正常,处理HTTP响应内容;* 6.释放连接。* @param url* @param charset* @return*/public static String doGet(String url, String charset){/*** 1.生成HttpClient对象并设置参数*/HttpClient httpClient = new HttpClient();//设置Http连接超时为5秒httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);/*** 2.生成GetMethod对象并设置参数*/GetMethod getMethod = new GetMethod(url);//设置get请求超时为5秒getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);//设置请求重试处理,用的是默认的重试处理:请求三次getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());String response = "";/*** 3.执行HTTP GET 请求*/try {int statusCode = httpClient.executeMethod(getMethod);/*** 4.判断访问的状态码*/if (statusCode != HttpStatus.SC_OK){System.err.println("请求出错:" + getMethod.getStatusLine());}/*** 5.处理HTTP响应内容*///HTTP响应头部信息,这里简单打印Header[] headers = getMethod.getResponseHeaders();for (Header h: headers){System.out.println(h.getName() + "---------------" + h.getValue());}//读取HTTP响应内容,这里简单打印网页内容//读取为字节数组byte[] responseBody = getMethod.getResponseBody();response = new String(responseBody, charset);System.out.println("-----------response:" + response);//读取为InputStream,在网页内容数据量大时候推荐使用//InputStream response = getMethod.getResponseBodyAsStream();} catch (HttpException e) {//发生致命的异常,可能是协议不对或者返回的内容有问题System.out.println("请检查输入的URL!");e.printStackTrace();} catch (IOException e){//发生网络异常System.out.println("发生网络异常!");}finally {/*** 6.释放连接*/getMethod.releaseConnection();}return response;}/*** post请求* @param url* @param json* @return*/public static String doPost(String url, JSONObject json){HttpClient httpClient = new HttpClient();PostMethod postMethod = new PostMethod(url);postMethod.addRequestHeader("accept", "*/*");postMethod.addRequestHeader("connection", "Keep-Alive");//设置json格式传送postMethod.addRequestHeader("Content-Type", "application/json;charset=utf-8");//必须设置下面这个HeaderpostMethod.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");//添加请求参数postMethod.addParameter("commentId", json.getString("commentId"));String res = "";try {int code = httpClient.executeMethod(postMethod);if (code == 200){res = postMethod.getResponseBodyAsString();System.out.println(res);}} catch (IOException e) {e.printStackTrace();}return res;}public static void main(String[] args) {doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", "UTF-8");System.out.println("-----------分割线------------");System.out.println("-----------分割线------------");System.out.println("-----------分割线------------");JSONObject jsonObject = new JSONObject();jsonObject.put("commentId", "13026194071");doPost("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", jsonObject);}
}
3 通过Apache封装好的CloseableHttpClient

CloseableHttpClient是在HttpClient的基础上修改更新而来的,这里还涉及到请求头token的设置(请求验证),利用fastjson转换请求或返回结果字符串为json格式,当然上面两种方式也是可以设置请求头token、json的,这里只在下面说明。

 <!--CloseableHttpClient--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.28</version></dependency>
public class CloseableHttpClientToInterface {private static String tokenString = "";private static String AUTH_TOKEN_EXPIRED = "AUTH_TOKEN_EXPIRED";private static CloseableHttpClient httpClient = null;/*** 以get方式调用第三方接口* @param url* @return*/public static String doGet(String url, String token){//创建HttpClient对象CloseableHttpClient httpClient = HttpClientBuilder.create().build();HttpGet get = new HttpGet(url);try {if (tokenString != null && !tokenString.equals("")){tokenString = getToken();}//api_gateway_auth_token自定义header头,用于token验证使用get.addHeader("api_gateway_auth_token", tokenString);get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");HttpResponse response = httpClient.execute(get);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){//返回json格式String res = EntityUtils.toString(response.getEntity());return res;}} catch (IOException e) {e.printStackTrace();}return null;}/*** 以post方式调用第三方接口* @param url* @param json* @return*/public static String doPost(String url, JSONObject json){try {if (httpClient == null){httpClient = HttpClientBuilder.create().build();}HttpPost post = new HttpPost(url);if (tokenString != null && !tokenString.equals("")){tokenString = getToken();}//api_gateway_auth_token自定义header头,用于token验证使用post.addHeader("api_gateway_auth_token", tokenString);post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");StringEntity s = new StringEntity(json.toString());s.setContentEncoding("UTF-8");//发送json数据需要设置contentTypes.setContentType("application/x-www-form-urlencoded");//设置请求参数post.setEntity(s);HttpResponse response = httpClient.execute(post);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){//返回json格式String res = EntityUtils.toString(response.getEntity());return res;}} catch (Exception e) {e.printStackTrace();}finally {if (httpClient != null){try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}}return null;}/*** 获取第三方接口的token*/public static String getToken(){String token = "";JSONObject object = new JSONObject();object.put("appid", "appid");object.put("secretkey", "secretkey");try {if (httpClient == null){httpClient = HttpClientBuilder.create().build();}HttpPost post = new HttpPost("http://localhost/login");post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");StringEntity s = new StringEntity(object.toString());s.setContentEncoding("UTF-8");//发送json数据需要设置contentTypes.setContentType("application/x-www-form-urlencoded");//设置请求参数post.setEntity(s);HttpResponse response = httpClient.execute(post);//这里可以把返回的结果按照自定义的返回数据结果,把string转换成自定义类//ResultTokenBO result = JSONObject.parseObject(response, ResultTokenBO.class);//把response转为jsonObjectJSONObject result = JSONObject.parseObject(response);if (result.containsKey("token")){token = result.getString("token");}} catch (Exception e) {e.printStackTrace();}return token;}/*** 测试*/public static void test(String telephone){JSONObject object = new JSONObject();object.put("telephone", telephone);try {//首先获取tokentokenString = getToken();String response = doPost("http://localhost/searchUrl", object);//如果返回的结果是list形式的,需要使用JSONObject.parseArray转换//List<Result> list = JSONObject.parseArray(response, Result.class);System.out.println(response);} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {test("12345678910");}}
4 通过SpringBoot-RestTemplate
    delete() 在特定的URL上对资源执行HTTP DELETE操作exchange() 在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中映射得到的execute() 在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象getForEntity() 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象postForEntity() POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的postForObject() POST 数据到一个URL,返回根据响应体匹配形成的对象headForHeaders() 发送HTTP HEAD请求,返回包含特定资源URL的HTTP头optionsForAllow() 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息postForLocation() POST 数据到一个URL,返回新创建资源的URLput() PUT 资源到特定的URL

参考:
http://www.cnblogs.com/angusbao/p/7727649.html 纯Java api HttpURLConnection

https://blog.csdn.net/chijiandi/article/details/81388240 纯Java api HttpURLConnection

https://www.cnblogs.com/xuegu/p/8490815.html 封装api HttpClient

https://www.cnblogs.com/unknows/p/8534713.html

https://blog.csdn.net/qq_35860138/article/details/82967727 封装api HttpClient

https://www.cnblogs.com/swordfall/p/10757499.html

https://blog.csdn.net/a1032818891/article/details/81172478 SpringBoot-RestTemplate

Java调用第三方接口(http总结)相关推荐

  1. Java 调用第三方接口方法

    Java 调用第三方接口方法 一. 通过JDK网络类Java.net.HttpURLConnection 1.java.net包下的原生java api提供的http请求 使用步骤: 1.通过统一资源 ...

  2. Java 调用第三方接口,实战来了!

    在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口. 1.准备工作: 在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的restTem ...

  3. Java调用第三方接口示范

    在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口. 使用流程 [1]准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的re ...

  4. java调用第三方接口示例

    引言:在我们开发的过程中,常常会听到或者接触到第三方接口,那么这个第三方接口到底是什么呢? 简单来说就是一个远程接口,不是在你本机上的,你需要通过远程url去访问调用该接口.许多项目中有明确的要求需要 ...

  5. java调用第三方接口发送手机验证码

    本实例调用互亿无线触发短信接口,采用commons-httpclient-3.1.jar及dom4j-1.6.1.jar俩个jar包实现,可根据个人需求更改调用接口 //接口类型:互亿无线触发短信接口 ...

  6. java调用第三方接口_java调用第三方接口,获取接口返回的数据。

    java接收远程调用的数据,得到的是如上个数的返回内容,我怎么写才能获取到值,现在使用的请求方法如下: public static HttpResult postJsonData(String url ...

  7. Java调用第三方http接口 单点登录 HttpClient

    Java调用第三方http接口的方式 Java调用第三方接口示范 范例: 响应形式: 主逻辑: 访问此地址:http:// { cas }/cas/login?service=http://local ...

  8. http方式调用第三方接口

    java如何调用对方http接口(II) - 流年煮雪 - 博客园 纯Java api HttpURLConnection Java调用外部接口_CJD的博客-CSDN博客_调用外部接口 纯Java  ...

  9. java调用第三方天气预报API接口

    java调用第三方天气预报API接口 package com.sensordata.controller; import com.common.json.JSONObject; import java ...

  10. java如何调用第三方接口

    最近在做一个项目,因一些机制问题,需要我用java代码调用第三方接口.因其接口使用的是@RequestBody注入访问对象的,@RequestBody接受收的是一个json格式的字符串,一定是一个字符 ...

最新文章

  1. JavaScript字符串数组拼接的性能测试及优化方法
  2. c语言fread读取错误,【求助】C语言fread读取二进制文件时,读取结果全都是零
  3. footer固定到底部
  4. 图表中各个参数的应用( AChartEngine XMultipleSeriesRenderer
  5. java scavenge_请概述一下Java中都有哪些垃圾收集器
  6. c# 错误 两个输出文件名解析为同一个输出路径
  7. 解决jquery调用NET webservice跨域的问题
  8. 动态规划之回文串问题
  9. 安装linux可是c盘文件夹失败,硬盘安装linux失败,进不去以前的windows怎么处理?
  10. 通俗易懂的MonteCarlo积分方法(五)
  11. java 彻底删除文件_如何删除java文件
  12. Python的遗传算法GA优化深度置信网络DBN超参数回归预测
  13. 三大开源bi工具_bi智能报表,好用的开源报表工具
  14. Element UI 极简教程(1)
  15. 虚假信息成物联网“毒瘤”
  16. java应聘面试自我介绍范文
  17. IIS 发生未知FastCGI错误:0x80070005
  18. Hola Stduio导入RUBE配置的过程
  19. centos7安装mplayer+smplayer
  20. 常用的交易策略评价指标及计算

热门文章

  1. WIFI密码破解笔记
  2. NATAPP使用教程(内网穿透)
  3. vant中修改用户的头像
  4. latex制作中英文简历(含模板代码)
  5. python二级多少分过_计算机二级分值分配 多少分及格
  6. 【笔记】Loop曲面细分算法c++实现
  7. 程序员从月薪6k到15k,你知道这3个月我是怎么过来的吗?
  8. 从零开始的Win10系统设置
  9. 对称矩阵(MIT课程)
  10. 无线WIFI短信认证平台(互亿无线)