Java中使用RestTemplate对外部接口的呼出

1.Service:外部接口调用

声明

    @Autowired

    private RestTemplate restTemplate;

    @Autowired

    @Qualifier(“sslRestTemplete”)

    private RestTemplate sslRestTemplete;

实际接口呼出

            MultiValueMap<String, String> headers = new LinkedMultiValueMap<>(); // 定义header

            headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE);// 呼出格式

            headers.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_UTF8_VALUE);// 接收格式

            HttpEntity<Object> entity = new HttpEntity<>(postJsonString, headers);// 定义HttpEntity

        if (url.startsWith(“https”)) {// Https开头的网址使用sslRestTemplete

                this.setDefaultCharset(sslRestTemplete.getMessageConverters());// 未知缘由格式中的UTF8未生效,单独设置

                // Post的情况

                    reps = sslRestTemplete.postForObject(url, entity, String.class);

              // Put的情况

                    ResponseEntity<String> repsPut = sslRestTemplete.exchange(url, HttpMethod.PUT, entity, String.class);

                    reps = repsPut.getBody();   }

                // Get

            reps = sslRestTemplete.getForObject(url, String.class);

            } else {// Http开头的网址使用 restTemplete,与前者类似 }

单独设置数据格式

private void setDefaultCharset(List<HttpMessageConverter<?>> converterList) {

        for (HttpMessageConverter<?> converter : converterList) {

            if (converter instanceof StringHttpMessageConverter) {

                ((StringHttpMessageConverter) converter).setDefaultCharset(Charset.forName(“UTF-8”));

                break; }  }}

2.ServiceTest:UT测试的Mock

声明:

    @Autowired

    WebApplicationContext wc;

    MockMvc mockMvc;

    @MockBean

    @Qualifier(value = “restTemplate”)

    RestTemplate restTemplate;

    @MockBean

    @Qualifier(value = “sslRestTemplete”)

    RestTemplate sslRestTemplete;

@Before 

public void setUp() throws Exception {

 this.mockMvc = MockMvcBuilders.webAppContextSetup(wc).build(); 

}

mock主代码中读取文件等的获得的值

        ReflectionTestUtils.setField(XXXXService, “testMode”, false);

        ReflectionTestUtils.setField(XXXXService, “XXXXurl”, “https://XXXX”);

        ReflectionTestUtils.setField(XXXXService, “XXXXUrl”, “https://XXXXXX”);

        ReflectionTestUtils.setField(XXXXService, “sslRestTemplete”, sslRestTemplete);

        ReflectionTestUtils.setField(XXXXService, “restTemplate”, restTemplate);

MOCK函数

        // MockPut

        ArgumentCaptor<HttpMethod> httpMethodPut = ArgumentCaptor.forClass(HttpMethod.class);

        ArgumentCaptor<HttpEntity> httpEntityPut = ArgumentCaptor.forClass(HttpEntity.class);

        ArgumentCaptor<String> stringPut = ArgumentCaptor.forClass(String.class);

        Mockito.when(sslRestTemplete.exchange(stringPut.capture(), httpMethodPut.capture(), httpEntityPut.capture(), Mockito.any(Class.class))).thenReturn(new ResponseEntity<>(ResponseStr, HttpStatus.OK));

        // MockPost

        ArgumentCaptor<HttpEntity> httpEntityPost = ArgumentCaptor.forClass(HttpEntity.class);

        ArgumentCaptor<String> stringPost = ArgumentCaptor.forClass(String.class);

        Mockito.when(sslRestTemplete.postForObject(stringPost.capture(), httpEntityPost.capture(), Mockito.any(Class.class))).thenReturn(ResponseStr);

    // MockGet

Mockito.when(sslRestTemplete.getForObject(url, String.class)).thenReturn(ResponseStr)

    // MOCK数据格式设置底层

List<HttpMessageConverter<?>> converterList = new ArrayList<>();

        converterList.add(new ByteArrayHttpMessageConverter());

        Mockito.when(sslRestTemplete.getMessageConverters()).thenReturn(converterList);

获取Caputer内容

DTO.clase putDto= JSONObject.parseObject(httpEntityPut.getValue().getBody().toString(),DTO.class);

3.Json和Dto的相互转换

DTO中项目设置

 @JSONField(name = “JSONFieldName”)

    private 数据类型.class 项目名;

DTO转Json

String dtoJson = JSONObject.toJSONString(DTO)

Json转Dto

DTO.clase dto= JSONObject.parseObject(dtoJson,DTO.class);

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
初心莫付的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容