RestTemplate各种传参方式

RestTemplate是Spring提供的用于访问Rest服务的客户端,

RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

调用RestTemplate的默认构造函数,RestTemplate对象在底层通过使用java.net包下的实现创建HTTP 请求,

可以通过使用ClientHttpRequestFactory指定不同的HTTP请求方式。

ClientHttpRequestFactory接口主要提供了两种实现方式

1、一种是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)创建底层的Http请求连接。

2、一种方式是使用HttpComponentsClientHttpRequestFactory方式,底层使用HttpClient访问远程的Http服务,使用HttpClient可以配置连接池和证书等信息。

引入以下Jar包,即可通过注解的方式直接使用

1.引入jar包

compile group: 'org.springframework.boot',name:'spring-boot-starter-web',version:'1.4.2.RELEASE'

2.初始化

2.1配置restTemplate 初始化config,可配置相关参数

@Configuration
public class RestTemplateConfig {

    @Bean(name="httpClient")
    public CloseableHttpClient httpClient() {
        return HttpClientBuilder.create().build();
    }
 
    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory());
        return restTemplate;
    }
 
    @Bean
    public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() {
        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        clientHttpRequestFactory.setHttpClient(httpClient());
        return clientHttpRequestFactory;
    }
 
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setThreadNamePrefix("poolScheduler");
        scheduler.setPoolSize(50);
        return scheduler;
    }
}

2.2第二种初始化方式

在启动类中直接new,不需要上面的RestTemplateConfig,使用默认参数

@SpringBootApplication

public class MainApplication {

   @Bean

   public RestTemplate restTemplate(){

      return new RestTemplate();

   }

   public static void main(String[] args) {

      SpringApplication.run(MainApplication .class, args);

   }

}

3.使用

@Autowired
private RestTemplate httpRestTemplate

3.1 POST请求方式

3.1.1单个参数post请求

·被调方:

@PostMapping("/modify")
public RespBody modify(@RequestParam("typeId")int typeId,@RequestParam("typeName")String typeName) {
    try {
        service.modify(typeId,typeName);
        return RespBody.success();
    }catch (Exception e) {
        logger.error("出错", e);
        return RespBody.fail(ErrorCode.ERROR);
    }
}

调用方:

public RespBody modify(long typeId,String typeName) {
    try {
        MultiValueMap<String,Object> map = new LinkedMultiValueMap<>();
        map.add("typeId",typeId);
        map.add("typeName",typeName);
        RespBody respBody = httpRestTemplate.postForObject(URL+ "/modify",map,RespBody.class);
        return respBody;
    } catch (Exception e) {
        log.error("出错", e);
    }
}

此种方式默认mediatype是form-data,如果需要指定mediatype,可使用如下方式

public RespBody modify(long typeId,String typeName) {
    try {
        MultiValueMap<String,Object> map = new LinkedMultiValueMap<>();
        map.add("typeId",typeId);
        map.add("typeName",typeName);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        HttpEntity requestBody = new HttpEntity(args, headers);
        RespBody respBody = httpRestTemplate.postForObject(URL+ "/modify",requestBody ,RespBody.class);
        return respBody;
    } catch (Exception e) {
        log.error("出错", e);
    }
}

3.1.2参数为对象post的形式

被调方:

@PostMapping("save")
public RespBody save(@RequestBody(required = true) WeChatConfigArgs weChatConfigArgs){
    try {
        service.save(weChatConfigArgs);
        return RespBody.success();
    } catch (Exception e) {
        e.printStackTrace();
        return RespBody.fail();
    }

}
调用方:
public RespBody save(WeChatConfigArgs weChatConfigArgs) {
    try {
        RespBody respBody = httpRestTemplate.postForObject( URL+ "/save",weChatConfigArgs,RespBody.class);
        return respBody;
    } catch (Exception e) {
        log.error("保存公众微信配置失败", e);
        return RespBody.fail();
    }
}

3.2 GET请求方式

3.2.1 无参GET请求

调用方:

RespBody respBody = httpRestTemplate.getForObject(URL+ "/save",RespBody.class);

返回数据类型是网页时

restTemplate.getMessageConverters().add(new WxMappingJackson2HttpMessageConverter());

String re = restTemplate.getForObject("http://test.x.com", String.class);public class 

WxMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
    public WxMappingJackson2HttpMessageConverter(){
        List<MediaType> mediaTypes = new ArrayList<>();
        mediaTypes.add(MediaType.TEXT_PLAIN);
        mediaTypes.add(MediaType.TEXT_HTML);  //加入text/html类型的支持
        setSupportedMediaTypes(mediaTypes);// tag6
    }
}

参考文章:https://www.cnblogs.com/duanxz/p/3510622.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值