restTemplate配置及发送json请求


接口只能接收json请求。 如果其他格式会报错。
日志报错:Content type 'text/plain;charset=ISO-8859-1

restTemplate代码很简单,但是要注意下文中的2个要点:

String url="http://www.test.com/api/getUser";
User user= new User();
user.setName("zhangsan");

String s = JSON.toJSONString(user);
// 要点1: 这三句设置header非常重要
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON); 
HttpEntity<String> request = new HttpEntity<String>(s, headers);

try {
	// 要点2:这里要发送包含header的request,不要直接发对象的json报文
	restTemplate.postForEntity(url, request, User.class);
}catch (Exception e){
    logger.error("异常了",e);
}

restTemplate为空的问题

方案一

在启动类,或配置类里面添加如下代码:

 @Autowired
 private RestTemplateBuilder builder;
 
 @Bean
 public RestTemplate restTemplate() {
     return new RestTemplate();
 }

问题解决。

方案二(这种方案编译时不报错,但是运行时会报错)
@Resource
private RestTemplate restTemplate;

这个方案实际不可行。只是作为反面教材来对照下。

exchange和postForEntity的区别

exchange是原始的方法,灵活度最高。
postForEntity比exchange少了一个参数,相当于把post封装了。

其实本质都一样。

报错: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException

如果报这个错,很可能是restTemplate不存在。 配置下build即可。

rest逻辑处理

除了状态码200等之外,还要考虑到超时等,例如主机不存在等。

@RequestMapping("/restUrl")
public String restUrl(@RequestParam(name="url") String url){
    try {
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, "1234", String.class);
        if(HttpStatus.OK==responseEntity.getStatusCode()){
            logger.info("rest请求成功,返回报文:{}",responseEntity);
        }else{
            logger.info("rest请求失败,返回报文:{}",responseEntity);
        }
    }catch (Exception e){
        logger.error("rest请求异常,error:",e);
        ;
        return e.getMessage()+e.getSuppressed();
    }

    return "query success";
}

httpStatus 200的判断

一般来说有2种写法,都是可以的:

//  最优雅
if(HttpStatus.OK==responseEntity.getStatusCode()){
}

// 不够优雅
if(HttpStatus.OK.value()=responseEntity.getStatusCode().value()){
}

// 我就拿数字直接比较... 其实这样也可以
if(200==responseEntity.getStatusCode().value()){
}

另:getStatusCode().value()可以写为getStatusCodeValue(),是一样的。
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值