SpringBoot--访问外部接口

582 阅读2分钟

「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战

前言

上周做的一个小需求就是挂载其它团队做的一个链接,具体就是点击一个图标,调取他们的接口,传上需要的参数,校验通过后跳转一个页面。这么看是一个很简单的需求,但是在联调时还存在几个需要注意的点。接下来学习一下通用的访问外部接口的方法。

原生Http请求

这个方法就是在代码中采用原生的http请求,主要的代码如下:

public static JSONObject doPost(JSONObject data){
    HttpClient client = HttpClients.createDefault();
    String url = "......."
    HttpPost post = new HttpPost(url);
    JSONObject jsonObject = null;
    try{
        StringEntity s = new StringEntity(data.toString());
        s.setContentEncoding("UTF-8");
        s,setContentType("application/json");
        post.setEntity(s);
        post.addHeader("content-type","text/xml");
        HttpResponse res = client.execute(post);
        if(res.getStatusLine().getStatusCode == HttpStatus.SC_OK){
            String result = EntityUtils.toString(res.getEntity());
            jsonObject = JSONObject.parseObject(result);
        }catch(Exception e){
            throw new RuntimeException(e);
        }
    return jsonObject;
    }
}

Feign

  • 在maven项目中添加依赖
  • 编写接口,放置在service层
    • @FeignClient(url = "${decisionEngine.url}",name="engine") 这里的decisionEngine.url 是配置在properties中的,是ip地址和端口号
  • 在Java的启动类上加上@EnableFeignClients
  • 在代码中调用接口即可

RestTemplate

在SpringBoot开发中,RestTemplate同样提供了对外访问的接口API,上周用到了Get请求,这个请求提供了两种方式的接口getForObject和getForEntity:

  • getForObject 这个方法通过HttpMessageConverterExtractor对HTTP的请求相应体body内容进行对象转换,可以实现请求直接返回包装好的对象内容。
getForObject(String url,Class responseType,Object...urlVariables)

其中url为请求的地址,responseType为请求响应body的包装类型,就是用这个方法解决了我的问题,用原生的http请求得到的返回值一直是空的,到现在也不知道是哪里出了问题?

  • getForEntity 使用方法类似,格式为:
getForEntity(Stringurl,Class responseType,Object…urlVariables)

综述

在上周的联调时,第一个问题就是md5的加密解密方式的区别,导致接口校验总是不匹配,后来改为了统一的 base64.decode(encodedText), "UTF-8")方式;第二个问题就是更换链接跳转网页的方式,由原来的接口获取伪单点登录地址换成在调用接口时进行校验直接返回重定向后的地址,涉及到双方代码的更待;第三个问题就是get请求获取不到值,但是对方的接口用PostMan工具可以看到返回值,这就用上文中提到的RestTemplate方法的getForObject解决了。希望下次遇到这些坑可以完美避开~