Java如何调用第三方接口

这篇“Java如何调用第三方接口”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java如何调用第三方接口”文章吧。

    一、 通过JDK网络类Java.net.HttpURLConnection

    1.java.net包下的原生java api提供的http请求

    使用步骤:

    1、通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection)。

    2、设置请求的参数。

    3、发送请求。

    4、以输入流的形式获取返回内容。

    5、关闭输入流。

    2.HttpClientUtil工具类

    /**
     * jdk 调用第三方接口
     * @author hsq
     */
    public class HttpClientUtil2 {
    
    
        /**
         * 以post方式调用对方接口方法
         * @param pathUrl
         */
        public static String doPost(String pathUrl, String data){
            OutputStreamWriter out = null;
            BufferedReader br = null;
            String result = "";
            try {
                URL url = new URL(pathUrl);
    
                //打开和url之间的连接
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    
                //设定请求的方法为"POST",默认是GET
                //post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
                conn.setRequestMethod("POST");
    
                //设置30秒连接超时
                conn.setConnectTimeout(30000);
                //设置30秒读取超时
                conn.setReadTimeout(30000);
    
                // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;
                conn.setDoOutput(true);
                // 设置是否从httpUrlConnection读入,默认情况下是true;
                conn.setDoInput(true);
    
                // Post请求不能使用缓存
                conn.setUseCaches(false);
    
                //设置通用的请求属性
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");  //维持长链接
                conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
    
                //连接,从上述url.openConnection()至此的配置必须要在connect之前完成,
                conn.connect();
    
                /**
                 * 下面的三句代码,就是调用第三方http接口
                 */
                //获取URLConnection对象对应的输出流
                //此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,所以在开发中不调用上述的connect()也可以)。
                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();
                }
            }
            return result;
        }
    
        /**
         * 以get方式调用对方接口方法
         * @param pathUrl
         */
        public static String doGet(String pathUrl){
            BufferedReader br = null;
            String result = "";
            try {
                URL url = new URL(pathUrl);
    
                //打开和url之间的连接
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    
                //设定请求的方法为"GET",默认是GET
                //post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
                conn.setRequestMethod("GET");
    
                //设置30秒连接超时
                conn.setConnectTimeout(30000);
                //设置30秒读取超时
                conn.setReadTimeout(30000);
    
                // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;
                conn.setDoOutput(true);
                // 设置是否从httpUrlConnection读入,默认情况下是true;
                conn.setDoInput(true);
    
                // Post请求不能使用缓存(get可以不使用)
                conn.setUseCaches(false);
    
                //设置通用的请求属性
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");  //维持长链接
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
    
                //连接,从上述url.openConnection()至此的配置必须要在connect之前完成,
                conn.connect();
    
                /**
                 * 下面的代码相当于,获取调用第三方http接口后返回的结果
                 */
                //获取URLConnection对象对应的输入流
                InputStream is = conn.getInputStream();
                //构造一个字符流缓存
                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                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 (br != null){
                        br.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return result;
        }
    }

    3.第三方api接口

    /**
     * @author hsq
     */
    @RestController
    @RequestMapping("/api")
    public class HelloWorld {
    
        private static final Logger log= LoggerFactory.getLogger(HelloWorld.class);
    
        @GetMapping ("/getHello")
        public Result getHelloWord(){
            log.info("进入到api接口.......");
            return Result.success("hello world api get 接口数据");
        }
    
        @PostMapping("/postHello")
        public Result postHelloWord(@RequestBody User user){
            log.info("进入post 方法.....");
            System.out.println(user.toString());
            return Result.success("hello world api post接口数据");
        }
    }

    Java如何调用第三方接口  java 第1张

    4.测试类

     @Test
        public void testJDKApi(){
            //测试get方法
            String s = HttpClientUtil2.doGet("http://localhost:9092/api/getHello");
            System.out.println("get方法:"+s);
            //测试post方法
            User user = new User();
            user.setUname("胡萝卜");
            user.setRole("普通用户");
            //把对象转换为json格式
            String s1 = JsonUtil.toJson(user);
            String postString = HttpClientUtil2.doPost("http://localhost:9092/api/postHello",s1);
            System.out.println("post方法:"+postString);
        }

    结果:

    Java如何调用第三方接口  java 第2张

    二、通过Apache common封装好的HttpClient

    1.引入依赖

     		<!--HttpClient-->
            <dependency>
                <groupId>commons-httpclient</groupId>
                <artifactId>commons-httpclient</artifactId>
                <version>3.1</version>
            </dependency>
            <!--json-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.28</version>
            </dependency>

    2.httpClientUtil

    /**
    	*httpClient的get请求方式
         * 使用GetMethod来访问一个URL对应的网页实现步骤:
         * 1.生成一个HttpClient对象并设置相应的参数;
         * 2.生成一个GetMethod对象并设置响应的参数;
         * 3.用HttpClient生成的对象来执行GetMethod生成的Get方法;
         * 4.处理响应状态码;
         * 5.若响应正常,处理HTTP响应内容;
         * 6.释放连接。
     * @author hsq
     */
    public class HttpClientUtil {
    
        /**
         * @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");
            //必须设置下面这个Header
            postMethod.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("param", json.getString("param"));
            StringRequestEntity param = new StringRequestEntity(json.getString("param"));
            postMethod.setRequestEntity(param);
            String res = "";
            try {
                int code = httpClient.executeMethod(postMethod);
                if (code == 200){
                    byte[] responseBody = postMethod.getResponseBody();
                    res = new String(responseBody, "UTF-8");
                    //res = postMethod.getResponseBodyAsString();
                    System.out.println(res);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return res;
        }
    }

    3.第三方api接口

    @RestController
    @RequestMapping("/api")
    public class HelloWorld {
    
        private static final Logger log= LoggerFactory.getLogger(HelloWorld.class);
    
    
        @GetMapping ("/getHello")
        public Result getHelloWord(){
            log.info("进入到api接口.......");
            return Result.success("hello world api get 接口数据");
        }
    
        @PostMapping("/postHello")
        public Result postHelloWord(@RequestBody User user){
            log.info("进入post 方法.....");
            System.out.println(user.toString());
            return Result.success("hello world api post接口数据");
        }
    
    }

    4.测试类

     	@Test
        public void testApi() {
            //测试get方法
            String s = HttpClientUtil.doGet("http://localhost:9092/api/getHello", "UTF-8");
            System.out.println("get方法:"+s);
            //测试post方法
            User user = new User();
            user.setUname("胡萝卜");
            user.setRole("普通用户");
            JSONObject jsonObject = new JSONObject();
            String s1 = JsonUtil.toJson(user);
            jsonObject.put("param",s1);
            String postString = HttpClientUtil.doPost("http://localhost:9092/api/postHello", jsonObject);
            System.out.println("post方法:"+postString);
        }

    结果:

    三、通过Spring的RestTemplate

    1.引入依赖

    导入springboot的web包

        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.4.RELEASE</version>
        </parent>
     
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>

    2.RestTemplate配置类

    /**
     * @author hsq
     */
    @Configuration
    public class RestTemplateConfig {
    
        @Bean
        public RestTemplate restTemplate(ClientHttpRequestFactory factory){
            return new RestTemplate(factory);
        }
    
        @Bean
        public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
            SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
            factory.setConnectTimeout(15000);
            factory.setReadTimeout(5000);
            return factory;
        }
    }

    3.RestTemplate实现类

    /**
     * @author hsq
     */
    @Component
    public class RestTemplateToInterface {
    
        @Autowired
        private RestTemplate restTemplate;
    
        /**
         * 以get方式请求第三方http接口 getForEntity
         * @param url
         * @return
         */
        public Result doGetWith2(String url){
            ResponseEntity<Result> responseEntity = restTemplate.getForEntity(url, Result.class);
            Result result = responseEntity.getBody();
            return result;
        }
    
        /**
         * 以get方式请求第三方http接口 getForObject
         * 返回值返回的是响应体,省去了我们再去getBody()
         * @param url
         * @return
         */
        public Result doGetWith3(String url){
            Result result  = restTemplate.getForObject(url, Result.class);
            return result;
        }
    
        /**
         * 以post方式请求第三方http接口 postForEntity
         * @param url
         * @param user
         * @return
         */
        public String doPostWith2(String url,User user){
            ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, user, String.class);
            String body = responseEntity.getBody();
            return body;
        }
    
        /**
         * 以post方式请求第三方http接口 postForEntity
         * 返回值返回的是响应体,省去了我们再去getBody()
         * @param url
         * @param user
         * @return
         */
        public String doPostWith3(String url,User user){
            String body = restTemplate.postForObject(url, user, String.class);
            return body;
        }
    
        /**
         * exchange
         * @return
         */
        public String doExchange(String url, Integer age, String name){
            //header参数
            HttpHeaders headers = new HttpHeaders();
            String token = "asdfaf2322";
            headers.add("authorization", token);
            headers.setContentType(MediaType.APPLICATION_JSON);
    
            //放入body中的json参数
            JSONObject obj = new JSONObject();
            obj.put("age", age);
            obj.put("name", name);
    
            //组装
            HttpEntity<JSONObject> request = new HttpEntity<>(obj, headers);
            ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
            String body = responseEntity.getBody();
            return body;
        }
    }

    4.第三方api接口

    /**
     * @author hsq
     */
    @RestController
    @RequestMapping("/api")
    public class HelloWorld {
    
        private static final Logger log= LoggerFactory.getLogger(HelloWorld.class);
    
        @GetMapping ("/getHello")
        public Result getHelloWord(){
            log.info("进入到api接口.......");
            return Result.success("hello world api get 接口数据");
        }
    
        @PostMapping("/postHello")
        public Result postHelloWord(@RequestBody User user){
            log.info("进入post 方法.....");
            System.out.println(user.toString());
            return Result.success("hello world api post接口数据");
        }
    }

    Java如何调用第三方接口  java 第3张

    5.测试类

    //注入使用
    @Autowired
    private RestTemplateToInterface restTemplateToInterface;
    
    @Test
    public void testSpringBootApi(){
        Result result= restTemplateToInterface.doGetWith2("http://localhost:9092/api/getHello");
        System.out.println("get结果:"+result);
        User user = new User();
        user.setUname("胡萝卜");
        user.setRole("普通用户");
        String s = restTemplateToInterface.doPostWith2("http://localhost:9092/api/postHello", user);
        System.out.println("post结果:"+s);
    }

    结果:

    Java如何调用第三方接口  java 第4张

    以上就是关于“Java如何调用第三方接口”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注蜗牛博客行业资讯频道。

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    评论

    有免费节点资源,我们会通知你!加入纸飞机订阅群

    ×
    天气预报查看日历分享网页手机扫码留言评论电报频道链接