当服务消费端去调用服务提供者的服务的时候,已经封装了一个模板类,叫做RestTemplate,当时只使用了RestTemplate中最简单的一个功能getForEntity发起了一个get请求去调用服务端的数据,同时,我们还通过配置@LoadBalanced注解开启客户端负载均衡,RestTemplate的功能不可谓不强大,如feign 和Rabbon+RestTemplate等两种方式负载均衡

现在看一下RestTemplate中几种常见请求方法的使用。 

本文主要从以下四个方面来看RestTemplate的使用:

GET请求

POST请求

PUT请求

DELETE请求

 

GET请求 在RestTemplate中,发送一个GET请求,我们可以通过如下两种方式:

第一种:getForEntity 

getForEntity方法的返回值是一个ResponseEntity,ResponseEntity是Spring对HTTP请求响应的封装,包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等。比如下面一个例子:

@RequestMapping("/gethello")
public String getHello() {
    ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class);
    String body = responseEntity.getBody();
    HttpStatus statusCode = responseEntity.getStatusCode();
    int statusCodeValue = responseEntity.getStatusCodeValue();
    HttpHeaders headers = responseEntity.getHeaders();
    StringBuffer result = new StringBuffer();
    result.append("responseEntity.getBody():").append(body).append("<hr>")
            .append("responseEntity.getStatusCode():").append(statusCode).append("<hr>")
            .append("responseEntity.getStatusCodeValue():").append(statusCodeValue).append("<hr>")
            .append("responseEntity.getHeaders():").append(headers).append("<hr>");
    return result.toString();
}

 

关于这段代码,我说如下几点: getForEntity的第一个参数为我要调用的服务的地址,这里我调用了服务提供者提供的/hello接口,注意这里是通过服务名调用而不是服务地址,如果写成服务地址就没法实现客户端负载均衡了。 getForEntity第二个参数String.class表示我希望返回的body类型是String 拿到返回结果之后,将返回结果遍历打印出来

 

有时候我在调用服务提供者提供的接口时,可能需要传递参数,有两种不同的方式,如下:

@RequestMapping("/sayhello")
public String sayHello() {
    ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/sayhello?name={1}", String.class, "张三");
    return responseEntity.getBody();
}
@RequestMapping("/sayhello2")
public String sayHello2() {
    Map<String, String> map = new HashMap<>();
    map.put("name", "李四");
    ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/sayhello?name={name}", String.class, map);
    return responseEntity.getBody();
}

传对象的方式
@RequestMapping("/book1")
public Book book1() {
    ResponseEntity<Book> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/getbook1", Book.class);
    return responseEntity.getBody();
}

可以用一个数字做占位符,最后是一个可变长度的参数,来一一替换前面的占位符 也可以前面使用name={name}这种形式,

最后一个参数是一个map,map的key即为前边占位符的名字,map的value为参数值

第二种:getForObject 

getForObject函数实际上是对getForEntity函数的进一步封装,如果你只关注返回的消息体的内容,对其他信息都不关注,此时可以使用getForObject,举一个简单的例子,如下:直接返回类型就可以

@RequestMapping("/book2")
public Book book2() {
    Book book = restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);
    return book;
}

 简单使用 如下,参数传递

private Map<String, Object> getData(String url){
		
		//String url = "http://microservice-service/getdata/getTSPDataForTmsInComplete?vin=" + urls+ "&fromTime=" + urls;
		if (StringUtils.isBlank(url)) {
			return null;
		}
		JSONObject result = JSONObject.parseObject(restTemplate.getForObject(url, String.class));
		//Map<String, Object> resultMap = new HashMap<>();
		if (result.getIntValue("code") == 0){
			result.getString("data");
		}else{
			result.put("code", 1);
		}
		return result;
	}

第三种 利用post请求提交数据,封装数据方便和安全性更高, 接收方参数如下

public R recoverySave(@RequestParam Map<String, Object> map)  参数可以是   map  或者 是json

// post请求方式,  直接封装json传递参数
	private JSONObject postData(JSONObject jsonObj,String urls){
		
		   HttpHeaders headers = new HttpHeaders();
	        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
	        headers.setContentType(type);
	        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
	        
	        HttpEntity<String> formEntity = new HttpEntity<String>(jsonObj.toString(), headers);
	        String result =  restTemplate.postForObject(urls, formEntity, String.class);
	        JSONObject results = JSONObject.parseObject(result);
	    	if (results.getIntValue("code") == 0){
	    		results.getString("data");
			}else{
				results.put("code", 1);
			}
		   return results.getJSONObject("data");
	}

其它方法靖访问如下

更多参求请参考