系列文章目錄
文章目錄
- 系列文章目錄
- 前言
前言
前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站,這篇文章男女通用,看懂了就去分享給你的碼吧。
RestTemplate 是從 Spring3.0 開始支持的一個 HTTP 請求工具,它提供了常見的REST請求方案的模版,例如 GET 請求、POST 請求、PUT 請求、DELETE 請求以及一些通用的請求執行方法 exchange 以及 execute。RestTemplate 繼承自 InterceptingHttpAccessor 并且實現了 RestOperations 接口,其中 RestOperations 接口定義了基本的 RESTful 操作,這些操作在 RestTemplate 中都得到了實現。接下來我們就來看看這些操作方法的使用。
這里有一個用戶查詢接口
# http://localhost:8081/user/1
返回格式
{"id": 1,"username": "java小強","address": "北京市"
}
訂單查詢接口里面要查詢用戶信息,這里僅供演示
public Order queryOrderById(Long orderId) {// 1.查詢訂單Order order = orderMapper.findById(orderId);String url = "http://localhost:8081/user/{userId}";Map<String, Object> para = new Hashtable<>();para.put("userId", order.getUserId());User user = restTemplate.getForObject(url, User.class, para);order.setUser(user);// 4.返回return order;
}
通過代碼點進去查看Spring源碼,可以看到getForObject有三個重載方法
@Override
@Nullable
public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);HttpMessageConverterExtractor<T> responseExtractor =new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger);return execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables);
}
@Override
@Nullable
public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);HttpMessageConverterExtractor<T> responseExtractor =new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger);return execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables);
}
@Override
@Nullable
public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException {RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);HttpMessageConverterExtractor<T> responseExtractor =new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger);return execute(url, HttpMethod.GET, requestCallback, responseExtractor);
}
這里使用了加參數的,如果不用Map傳遞參數,也可以URL中拼接,例如
String url = "http://" + host + ":" + port + "/hello?name="+ URLEncoder.encode(name,"UTF-8");
URI uri = URI.create(url);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);
但需要注意的是,這種傳參方式,參數如果是中文的話,需要對參數進行編碼,使用 URLEncoder.encode 方法來實現。
源碼往下,可以看到還有三個返回為ResponseEntity的方法
@Override
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables)throws RestClientException {RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType);return nonNull(execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables));
}@Override
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables)throws RestClientException {RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType);return nonNull(execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables));
}@Override
public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType) throws RestClientException {RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType);return nonNull(execute(url, HttpMethod.GET, requestCallback, responseExtractor));
}
有什么區別?點進去看
public class ResponseEntity<T> extends HttpEntity<T> {
// 省略
}
再進去看HttpEntity實現,看到它有一個HttpHeaders變量
private final HttpHeaders headers;
此時應該知道區別,就是HttpEntity可以獲取響應頭了。
RestTemplate再往下看可以看到還有專門只獲取響應頭的方法。
上面代碼中getForObject,這個get是指使用get方式請求,如果往下翻源碼,就可以看到Post等各種方式請求的調用方法。