传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate。
首先:
定义一个RestFu接口
@RestController
public class TestController
{
// @RequestMapping(value = "/testPost", method = RequestMethod.POST)
@PostMapping(value = "/testPost") //等价于上面
public ResponseBean testPost(@RequestBody RequestBean requestBean)
{
ResponseBean responseBean = new ResponseBean();
responseBean.setRetCode("0000");
responseBean.setRetMsg("succ");
return responseBean;
}
}
//请求地址
String url = "http://localhost:8080/testPost";
//入参
RequestBean requestBean = new RequestBean();
requestBean.setTest1("1");
requestBean.setTest2("2");
requestBean.setTest3("3");
RestTemplate restTemplate = new RestTemplate();
ResponseBean responseBean = restTemplate.postForObject(url, requestBean, ResponseBean.class);
从这个例子可以看出,使用restTemplate访问restful接口非常的简单粗暴无脑。(url, requestMap, ResponseBean.class)这三个参数分别代表 请求地址、请求参数、HTTP响应转换被转换成的对象类型。
RestTemplate方法的名称遵循命名约定,第一部分指出正在调用什么HTTP方法,第二部分指示返回的内容。本例中调用了restTemplate.postForObject方法,post指调用了HTTP的post方法,Object指将HTTP响应转换为您选择的对象类型。还有其他很多类似的方法 。
SpringCloud中可以这样调用:
@RestController
public class WebController {
@Autowired
private RestTemplate restTemplate;
//http://localhost:8089/web/hello
@RequestMapping("/web/hello")
public String hello () {
//逻辑判断(省略)
//调用 服务提供者提供的服务,直接调用 ,而不是SpringCloud调用。
// return restTemplate.getForEntity("http://localhost:8080/service/hello", String.class).getBody();
//用服务站名称替代 ip+port
return restTemplate.getForEntity("http://SPRINGCLOUD-PROVIDER/service/hello", String.class).getBody();
}
@RequestMapping("/web/user")
public String user () {
//逻辑判断(省略)
//调用SpringCloud服务提供者提供的服务
ResponseEntity<User> responseEntity = restTemplate.getForEntity("http://01-SPRINGCLOUD-SERVICE-PROVIDER/service/user", User.class);
int statusCodeValue = responseEntity.getStatusCodeValue();
HttpStatus httpStatus = responseEntity.getStatusCode();
HttpHeaders httpHeaders = responseEntity.getHeaders();
User body = responseEntity.getBody();
System.out.println(statusCodeValue);
System.out.println(httpStatus);
System.out.println(httpHeaders);
System.out.println(body.getId() + "--" + body.getName() + "--" + body.getPhone());
return restTemplate.getForEntity("http://01-SPRINGCLOUD-SERVICE-PROVIDER/service/user", String.class).getBody();
}