时间:2021-05-20
基本概念
Spring RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率,所以很多客户端比如 Android或者第三方服务商都是使用 RestTemplate 请求 restful 服务。
spring-web的RestTemplata是对java底层http的封装,使用RestTemplata用户可以不再关注底层的连接建立,并且RestTemplata不仅支持Rest规范,还可以定义返回值对象类型。
在使用中可以直接new一个RestTemplate对象,在我们创建的RestTemplate对象中会有一些返回消息的消息转换器,可以根据返回数据的 MediaType 寻找对应的转换器并进行 MediaType 转换。自己也可以创建消息转换器,创建一个类继承AbstractGenericHttpMessageConverter<T>类或者实现HttpMessageConverter<T>接口,需要注意的是canRead方法和canWrite方法最好自己做判断,在writeInternal或write方法中将参数写入到流,在readInternal或read方法中将返回结果从流的body中获取并进行类型映射。
RestTemplate对象在底层通过使用java.net包下的实现创建HTTP 请求,可以通过使用ClientHttpRequestFactory指定不同的HTTP请求方式。
ClientHttpRequestFactory接口主要提供了两种实现方式:
RestTemplate默认是使用SimpleClientHttpRequestFactory,内部是调用jdk的HttpConnection,默认超时为-1,我们可以自己定义超时时间
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();//设置连接超时,单位毫秒factory.setConnectTimeout(5000);//设置读取超时,单位毫秒factory.setReadTimeout(10000);RestTemplate restTemplate = new RestTemplate(factory);使用GET请求:
String url = "http://localhost:80/mandy/login.json?account=123456&password=123456";Result res = restTemplate.getForObject(url, Result.class);RestTemplate源码:
@Override public <T> T getForObject(String url, Class<T> responseType, Object... urlVariables) throws RestClientException { RequestCallback requestCallback = acceptHeaderRequestCallback(responseType); HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger); return execute(url, HttpMethod.GET, requestCallback, responseExtractor, urlVariables); }使用get请求直接将参数拼接到地址上最好,不知道什么原因如果使用第三个参数,即便是MultiValueMap类型也不行(网上有人说用MultiValueMap类型可以,我试了不行)
使用POST请求:
HashMap<String, Object> map = new HashMap<String, Object>(); map.put("name", "测试"); map.put("account", "qwer"); map.put("password", "qwer"); ObjectMapper mapper = new ObjectMapper(); String jsonStr = null; try { jsonStr = mapper.writeValueAsString(map); } catch (Exception e) { e.printStackTrace(); }//创建HTTP头部实体,填充头部信息,比如数据格式 HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);//创建HTTP实体,可以直接利用构造方法将请求体和请求头放进去 HttpEntity<String> httpEntity = new HttpEntity<String>(jsonStr2, httpHeaders);String url = "http://localhost:80/mandy/user_enable.json";//调用方法进行请求 Result res2 = restTemplate.postForObject(url, httpEntity, Result.class);RestTemplate源码:
@Override public <T> T postForObject(String url, Object request, Class<T> responseType, Object... uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request, responseType); HttpMessageConverterExtractor<T> responseExtractor = new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger); return execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables); }使用PUT请求:
HashMap<String, Object> map = new HashMap<String, Object>();map.put("user_id", "1");map.put("enable", 0);ObjectMapper mapper = new ObjectMapper();String jsonStr = null;try { jsonStr = mapper.writeValueAsString(map);} catch (JsonProcessingException e) { e.printStackTrace();}//创建HTTP头部实体,填充头部信息,比如数据格式HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);//创建HTTP实体,可以直接利用构造方法将请求体和请求头放进去HttpEntity<String> httpEntity = new HttpEntity<String>(jsonStr, httpHeaders); String url = "http://localhost:80/mandy/user_enable.json";restTemplate.put(url , httpEntity);RestTemplate源码:
@Override public void put(String url, Object request, Object... urlVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(request); execute(url, HttpMethod.PUT, requestCallback, null, urlVariables); }这个方法有个小的缺点就是没有请求结果的返回值,如果需要用到返回值,就不能用这个方法。
如果要使用delete类型的请求,RestTemplate的put方法的参数列中只有下面几种
@Overridepublic void delete(String url, Object... urlVariables) throws RestClientException { execute(url, HttpMethod.DELETE, null, null, urlVariables);}@Overridepublic void delete(String url, Map<String, ?> urlVariables) throws RestClientException { execute(url, HttpMethod.DELETE, null, null, urlVariables);}@Overridepublic void delete(URI url) throws RestClientException { execute(url, HttpMethod.DELETE, null, null);}这些方法并没有给我们参数让我们放请求体内容,所以如果要直接使用RestTemplate提供的Delete方法,接口必须使用restful风格,将参数放在地址中,通过@PathVariable(value="")注解将参数获取到。
重点: 其实我们可以直接使用RestTemplate的 exchange 方法,如下
@Overridepublic <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) throws RestClientException { RequestCallback requestCallback = httpEntityCallback(requestEntity, responseType); ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType); return execute(url, method, requestCallback, responseExtractor, uriVariables);}这里只列举了一个方法,其他的可以看源码,这个方法可以进行所有类型的请求。
在这个方法中,method参数可以通过HTTPMethod枚举来进行获取,requestEntity参数是自己封装的HttpEntity实体,包含请求体和请求头,responseType参数是返回结果的映射类,uriVariables这个参数给我的印象就是鸡肋(个人看法),获取请求返回接口可以通过方法返回值的getBody()方法获取。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Spring-cloud-eureka使用feign调用服务接口的具体方法,供大家参考,具体内容如下基于spring-boot2.0以上版本完成的微服务架构po
本文实例讲述了zendframework中使用memcache的方法。分享给大家供大家参考,具体如下:zendframework项目中,以下是具体方法:1.找到
iPhone如何自动接听或拒接来电具体方法iPhone如何自动接听或拒接来电具体方法iPhone如何自动接听或拒接来电具体方法 2、开启“自动接听
具体方法:1使用pandaread_excel方法加载excel2使用concat将DataFrame列表进行拼接3然后使用pd.ExcelWriter对象和t
本文实例简述了PHP处理Oracle的CLOB的方法。分享给大家供大家参考。具体方法如下:1.写入数据在使用PDO的预处理方法时,如果使用bindParam()