https://blog.csdn.net/qq_42873554/article/details/100182149?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162630638516780264085291%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=162630638516780264085291&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-2-100182149.pc_v2_rank_blog_default&utm_term=%E8%B0%83%E7%94%A8%E7%AC%AC%E4%B8%89%E6%96%B9http%E6%8E%A5%E5%8F%A3%E9%80%9A%E7%94%A8%E6%96%B9%E6%B3%95&spm=1018.2226.3001.4450
几种方式总结:
在Java项目中调用第三方接口的方式有:
①通过JDK网络类Java.net.HttpURLConnection;【Java 自带的 HttpUrlConnection 】
②使用用HttpClient调用API【经典的网络访问框架 HttpClient 】
③通过Apache封装好的CloseableHttpClient;
④通过SpringBoot-RestTemplate;【 Spring3.0 开始支持的一个 HTTP 请求工具】
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请求方式步骤:
- 生成一个HttpClient对象并设置相应的参数
- 生成一个GetMethod对象或PostMethod并设置响应的参数
- 用HttpClient生成的对象来执行GetMethod生成的Get方法
- 处理响应状态码
- 若响应正常,处理HTTP响应内容
- 释放连接
3、通过Apache封装好的CloseableHttpClient
package com.example.jpademo.Controller; import com.alibaba.fastjson.JSONObject; import com.example.jpademo.Entity.User; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; import java.util.ArrayList; import java.util.List; @RestController 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, List<JSONObject> jsonObjectList){ try { HttpPost post = new HttpPost(url); if (httpClient == null){ httpClient = HttpClientBuilder.create().build(); } if (tokenString != null && !tokenString.equals("")){ tokenString = getToken(); } //api_gateway_auth_token自定义header头,用于token验证使用 post.setHeader("api_gateway_auth_token", tokenString); post.setHeader("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(jsonObjectList.toString(),"UTF-8"); // 正确 //StringEntity s = new StringEntity(jsonObjectList.toString()); //s.setContentEncoding("UTF-8"); //这种设置没有效果,如果jsonObjectList中有中文则API收到?号
//设置请求参数 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 * Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后, * 服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个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"); //User-Agent:告诉服务器,客户端使用的操作系统、浏览器版本和名称 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数据需要设置contentType s.setContentType("application/x-www-form-urlencoded"); //设置请求参数 post.setEntity(s); HttpResponse response = httpClient.execute(post); //这里可以把返回的结果按照自定义的返回数据结果,把string转换成自定义类 //ResultTokenBO result = JSONObject.parseObject(response, ResultTokenBO.class); //把response转为jsonObject JSONObject result = JSONObject.parseObject(response.toString()); if (result.containsKey("token")){ token = result.getString("token"); } } catch (Exception e) { e.printStackTrace(); } return token; } /** * 测试 */ @GetMapping("/HttpClient/test") public String test(){ List<JSONObject> jsonObjectList=new ArrayList<JSONObject>(); JSONObject object = new JSONObject(); object.put("firstName", "李"); object.put("lastName", "光明"); object.put("email", "email李"); jsonObjectList.add(object); object = new JSONObject(); object.put("firstName", "李"); object.put("lastName", "成功"); object.put("email", "email李成功"); jsonObjectList.add(object); try { //首先获取token tokenString = getToken(); String response = doPost("http://localhost:8888/demo/addUsers_JSON2", jsonObjectList); //如果返回的结果是list形式的,需要使用JSONObject.parseArray转换 //List<Result> list = JSONObject.parseArray(response, Result.class); return response; } catch (Exception e) { e.printStackTrace(); return "执行错误!"; } } }
4、通过SpringBoot-RestTemplate