zoukankan      html  css  js  c++  java
  • JAVA 调用第三方接口

    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请求方式步骤:

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

     

    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

  • 相关阅读:
    理解对象和对象的描述特性
    常用JS方法整理
    vue组件从开发到发布
    Mac OS X下安装Vue脚手架(vue-cli)
    前端开发中提到的“脚手架”到底指什么,CLI?gulp 和 gulp-cli有什么区别
    【Android Studio快捷键】之代码提示
    Linux安装vmtools
    VC 获取控制台窗体的句柄(hWnd)
    ym——物联网入口之中的一个Android蓝牙4.0
    Nginx 做系统的前端反向proxy
  • 原文地址:https://www.cnblogs.com/wfy680/p/15013761.html
Copyright © 2011-2022 走看看