java对接第三方接口的三种方式

这篇具有很好参考价值的文章主要介绍了java对接第三方接口的三种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在日常工作中,经常需要跟第三方系统对接,我们做为客户端,调用他们的接口进行业务处理,常用的几种调用方式有:
1.原生的Java.net.HttpURLConnection(jdk);

2.再次封装的HttpClient、CloseableHttpClient(Apache);

3.Spring提供的RestTemplate;

当然还有其他工具类进行封装的接口,比如hutool的HttpUtil工具类,里面除了post、get请求外,还有下载文件的方法downloadFile等。

HttpURLConnection调用方法
HTTP正文的内容是通过OutputStream流写入,向流中写入的数据不会立即发送到网络,而是存在于内存缓冲区中,待流关闭时,根据写入的内容生成HTTP正文。
调用getInputStream()方法时,会返回一个输入流,用于从中读取服务器对于HTTP请求的返回报文

@Slf4j
public class HttpURLConnectionUtil {
   /**
     *
     * Description: 发送http请求发送post和json格式
     * @param url          请求URL
     * @param params    json格式的请求参数
     */
    public static String doPost(String url, String params) throws Exception {

        OutputStreamWriter out = null;
        BufferedReader reader = null;
        StringBuffer response = new StringBuffer();
        URL httpUrl = null; // HTTP URL类 用这个类来创建连接
        try {
            // 创建URL
            httpUrl = new URL(url);
            log.info("--------发起Http Post 请求 ------------- url:" + url + "---------params:" + params);

            // 建立连接
            HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
            //设置请求的方法为"POST",默认是GET
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("connection", "keep-alive");
            conn.setUseCaches(false);// 设置不要缓存
            conn.setInstanceFollowRedirects(true);
            //由于URLConnection在默认的情况下不允许输出,所以在请求输出流之前必须调用setDoOutput(true)
            conn.setDoOutput(true);
            // 设置是否从httpUrlConnection读入
            conn.setDoInput(true);
            //设置超时时间
            conn.setConnectTimeout(30000);
            conn.setReadTimeout(30000);
            conn.connect();
            // POST请求
            out = new OutputStreamWriter(conn.getOutputStream());
            out.write(params);
            out.flush();
            // 读取响应
            reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
            String lines;
            while ((lines = reader.readLine()) != null) {
                response.append(lines);
            }
            reader.close();
            // 断开连接
            conn.disconnect();
        } catch (Exception e) {
            log.error("--------发起Http Post 请求 异常 {}-------------", e);
            throw new Exception(e);
        }
        // 使用finally块来关闭输出流、输入流
        finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException ex) {
                log.error(String.valueOf(ex));
            }
        }
        return response.toString();
    }
}


CloseableHttpClient调用
CloseableHttpClient 是一个抽象类,实现了httpClient接口,也实现了java.io.Closeable;
支持连接池管理,可复用已建立的连接 PoolingHttpClientConnectionManager
通过 httpClient.close() 自动管理连接释放
支持HTTPS访问 HttpHost proxy = new HttpHost(“127.0.0.1”, 8080, “http”);

@Slf4j
public class CloseableHttpClientUtil {
    /**
    *url 第三方接口地址
    *json 传入的报文体,可以是dto对象,string、json等
    *header 额外传入的请求头参数
    */    
  public static String doPost(String url, Object json,Map<String,String> header) {

        CloseableHttpClient httpclient = HttpClientBuilder.create().build();
        HttpPost httpPost= new HttpPost(url);//post请求类型
        String result="";//返回结果
        String requestJson="";//发送报文体
        try {
            requestJson=JSONObject.toJSONString(json);
            log.info("发送地址:"+url+"发送报文:"+requestJson);
            //StringEntity s = new StringEntity(requestJson, Charset.forName("UTF-8"));
            StringEntity s= new StringEntity(requestJson, "UTF-8");
               // post请求是将参数放在请求体里面传过去的;这里将entity放入post请求体中
               httpPost.setHeader("Content-Type", "application/json;charset=utf8");
            httpPost.setEntity(s);
            if(header!=null){
                Set<String> strings = header.keySet();
                for(String str:strings){
                    httpPost.setHeader(str,header.get(str));
                }
            }
            HttpResponse res = httpclient.execute(httpPost);
            if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    result = EntityUtils.toString(res.getEntity());
                    //也可以把返回的报文转成json类型
                    // JSONObject  response = JSONObject.parseObject(result);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        finally {
             //此处可以加入记录日志的方法
            // 关闭连接,释放资源
           if (httpclient!= null){
                try {
                    httpclient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    }
        return result;
    }
}



RestTemplate调用
//可以在项目启动类中添加RestTemplate 的bean,后续就可以在代码中@Autowired引入。文章来源地址https://www.toymoban.com/news/detail-861048.html

@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}

@Slf4j
@Component
public class RestTemplateUtils {
    @Autowired
    private RestTemplate restTemplate;

    /**
     * get 请求 参数在url后面  http://xxxx?aa=xxx&page=0&size=10";
     * @param urls 
     * @return string
     */
    public String doGetRequest(String urls) {
        
        URI uri = UriComponentsBuilder.fromUriString(urls).build().toUri();
        log.info("请求接口:{}", urls);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<String> httpEntity = new HttpEntity<>(headers);
        //通用的方法exchange,这个方法需要你在调用的时候去指定请求类型,可以是get,post,也能是其它类型的请求
        ResponseEntity<String> responseEntity = restTemplate.exchange(uri, HttpMethod.GET, httpEntity, String.class);
        if (responseEntity == null) {
            return null;
        }
        log.info("返回报文:{}", JSON.toJSONString(responseEntity));
        
        return responseEntity.getBody();
    }
    
    /**
     * post 请求 参数在 request里;
     * @param url, request
     * @return string
     */
    public String doPostRequest(String url, Object request){
        URI uri = UriComponentsBuilder.fromUriString(url).build().toUri();

        String requestStr= JSONObject.toJSONString(request);
        log.info("请求接口:{}, 请求报文:{}", url, requestStr);
        HttpHeaders headers = new HttpHeaders();    
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<String> httpEntity = new HttpEntity<>(requestStr, headers);
        ResponseEntity<String> responseEntity = restTemplate.exchange(uri, HttpMethod.POST, httpEntity, String.class);
                
        if (responseEntity == null) {
            return null;
        }
        
        String seqResult = "";
        try {
            if(responseEntity.getBody() != null ) {        
                if(responseEntity.getBody().contains("9001")) {
                    seqResult = new String(responseEntity.getBody().getBytes("ISO8859-1"),"utf-8");
                }else {
                    seqResult = new String(responseEntity.getBody().getBytes(),"utf-8");    
                }                                            
            }
            
            log.info("返回报文:{}", seqResult);
            
        } catch (UnsupportedEncodingException e) {
            log.error("接口返回异常", e);
        }

        return seqResult;
    }
}

到了这里,关于java对接第三方接口的三种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java发送http请求的几种方式,调用第三方接口的方法:HttpUtil、HttpURLConnection等

    参考:https://blog.csdn.net/yubin1285570923/article/details/126225347 put请求 post带请求头 get、delete类似… 使用JDK原生提供的net,无需其他jar包,代码如下: 需要用到commons-httpclient-3.1.jar,maven依赖如下: 看一下我实际应用的例子 需要用到httpclient-4.5.6.jar,maven依赖如下: RestTemplate 是由

    2024年01月18日
    浏览(39)
  • PHP聚合支付网站源码/对接十多个支付接口 第三方/第四方支付/系统源码

    PHP聚合支付网站源码/对接十多个支付接口 第三方/第四方支付/系统源码 内附数十个支付接口代码文件。 下载地址:https://bbs.csdn.net/topics/616764485  

    2024年02月11日
    浏览(32)
  • SpringBoot调用第三方WebService接口的两种实现方式

    WebService接口的发布通常一般都是使用WSDL(web service descriptive language)文件的样式来发布的,该文档包含了请求的参数信息,返回的结果信息,我们需要根据WSDL文档的信息来编写相关的代码进行调用WebService接口。接下来我将采用常见的两种方式调用WebService接口。 目前我需要

    2024年02月12日
    浏览(49)
  • java调第三方接口

    目录 背景 Spring的RestTemplate 1.引入依赖 2.RestTemplate配置类 3.RestTemplate实现类 java调第三方接口我百度的有三种方法. 第一种:通过JDK网络类Java.net.HttpURLConnection 第二种:通过Apache common封装好的HttpClient 第三种:通过Spring的RestTemplate 这个三种方法在我的scdn收藏里有,都是可以直接用的

    2024年02月05日
    浏览(46)
  • 【Springboot系列】Springboot系列-调用第三方接口的五种方式汇总,代码实例

    在开发中,经常需要调用第三方接口或者其他的应用接口来完成业务需求。今天分享下Spring Boot中调用第三方接口的多种方式。 1、使用OpenFeign进行调用(推荐) 2、使用原始httpClient请求 3、使用RestTemplate方法 4、使用hutool.httputil 5、使用OkHttp3 Feign是一个声明式的Web Service客户端

    2024年02月11日
    浏览(33)
  • JAVA开发(基于Restful的微服务第三方简易接口设计)

       一、需求背景 java后端需要提供接口服务,其中接口服务分为对内网的后台管理系统的接口,对外网的用户接口和对第三方系统的接口。这里主要讲对第三方的接口。 二、接口设计 我们可以参考微信小程序的接口,一般一个系统提供给第三方系统的接口都需要接口权限认

    2024年02月09日
    浏览(40)
  • uniapp 对接谷歌第三方登录

    1.登录谷歌开发者后台 https://console.developers.google.com/ 2.添加凭证 3.拿到客户端id后,项目中配置google登录:  示例代码:

    2024年04月29日
    浏览(34)
  • 天猫精灵家居对接第三方设备(详细版)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档· 文章目录 前言 补充准备阶段(内网映射到外网) 一、天猫精灵官网配置准备 二、天猫精灵部分实现代码 三、天猫精灵配置技能广场 四、天猫精灵语音调试测试 总结 随着物联网的发展,众多的硬件

    2024年02月06日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包