restTemplate配置及发送json请求
原创
©著作权归作者所有:来自51CTO博客作者chushiyunaaa的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 方案一
- 方案二(这种方案编译时不报错,但是运行时会报错)
- exchange和postForEntity的区别
- 报错: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
- rest逻辑处理
- httpStatus 200的判断
接口只能接收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(),是一样的。