Java后台调用别的系统的Restful接口

版权声明:转发请注明链接和出处,靴靴 https://blog.csdn.net/weixin_43525116/article/details/84954002

配置与实现调用

注:本次实现调用restful接口时,入参和出参都是一个类,使用post请求方式,这里有 RestTemplate的几种请求方式.(GET,POST,DELETE,PUT)

本项目所在项目A,与提供restful接口的,被调用的项目B,必须在同一个环境的Eureka上注册,才能调用到。(一个大项目会有好几个环境dev,test等)

例:一个SpringBoot项目的test环境的Eureka配置(项目发布到test环境之后自动注册,启动本地服务之后,Eureka服务列表里也可以看到你的本地机器名):
application-test.yml
test环境Eureka自动注册配置

Maven依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 这里使用版本变量,可根据项目需要自行设定合适的版本 -->
    <version>${spring.boot.version}</version> 
</dependency>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
</dependencies>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
    <version>1.4.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>       

(注意:一定要记得导入调用restful接口所在项目B的jar包噢!!)

注册与使用RestTemplate

方法一:

applicationContext-mvc.xml 里注册 RestTemplate

<!-- 配置RestTemplate -->
    <!--Http client Factory -->
    <bean id="httpClientFactory"
        class="org.springframework.http.client.SimpleClientHttpRequestFactory">
        <property name="connectTimeout" value="10000" />
        <property name="readTimeout" value="10000" />
    </bean>

    <!--RestTemplate -->
    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
        <constructor-arg ref="httpClientFactory" />
    </bean>

@Controller:

    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @Autowired
    private RestTemplate restTemplate;
    
    /**
     * 测试restful接口调用
     */
    @RequestMapping(value = "getTest", method = RequestMethod.GET)
    @ResponseBody
    public PackScanRecVo getTest() {
        // 入参数据添加
        ScanArrSo so = new ScanArrSo();
        Long siteId = 3068L;
        Date from = DateUtil.setTimeToTheStartOfTheDay(new Date());
        Date to = DateUtil.setTimeToTheEndOfTheDay(new Date());
        so.setScanSiteId(siteId);
        so.setScanDateFrom(from);
        so.setScanDateTo(to);

        // 利用Ribbon的组件 LoadBalancerClient,拼接动态服务地址
        // 因为Eureka上的服务地址是会变的,根据服务ID来获取IP和端口,再拼接
        ServiceInstance serviceInstance = loadBalancerClient.choose("服务ID");
        String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort()
                + "/应用名/接口url";
        System.out.println(url);
        
        ResponseEntity<PackScanRecVo> responseEntity = restTemplate.postForEntity(url, so, PackScanRecVo.class);
        return responseEntity.getBody();
    }

方法二:

在项目启动类 WebApplication.java 里注册 RestTemplate

注意添加注解:
@EnableEurekaClient @EnableFeignClients
@Bean @LoadBalanced


@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@ImportResource(locations = { "classpath:spring/applicationContext-*.xml" })
@ComponentScan(nameGenerator = xx.xx.xx.util.spring.MyBeanNameGenerator.class)
@EnableDiscoveryClient
public class WebApplication {

    private static final Logger logger = LoggerFactory.getLogger(WebApplication.class);
    
    public static void main(String[] args) throws Exception {
        SpringApplication.run(WebApplication.class, args);
    }

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

@Controller:

    @Autowired
    private RestTemplate restTemplate;
   
    /**
     * 测试restful接口调用
     */
    @RequestMapping(value = "getTest", method = RequestMethod.GET)
    @ResponseBody
    public PackScanRecVo getTest() {
        // 入参数据添加
        ScanArrSo so = new ScanArrSo();
        Long siteId = 3068L;
        Date from = DateUtil.setTimeToTheStartOfTheDay(new Date());
        Date to = DateUtil.setTimeToTheEndOfTheDay(new Date());
        so.setScanSiteId(siteId);
        so.setScanDateFrom(from);
        so.setScanDateTo(to);
        
        // Ribbon根据服务名找到对应IP和端口
        String url = "http://服务名/应用名/接口url";

        ResponseEntity<PackScanRecVo> responseEntity = restTemplate.postForEntity(url, so, PackScanRecVo.class);
        return responseEntity.getBody();
    }

遇坑

  1. 刚开始将上述两种注册方式都实现了,导致方法二的实现方式失效,只能使用方法一的负载均衡类拼接动态IP方式找到系统B的服务接口,所以
    1). RestTemplate 只能注册一次;
    2). 所以两种方法的配置和实现是对应的,不能串用;

  2. 问清楚项目B接口是什么请求方式,使用对应的RestTemplate请求方法;请求方式错误会报405错;

猜你喜欢

转载自blog.csdn.net/weixin_43525116/article/details/84954002
今日推荐