spring框架提供的RestTemplate類可用於在應用中調用rest服務,它簡化了與http服務的通訊方式,統一了RESTful的標準,封裝了http連接, 咱們只須要傳入url及返回值類型便可。相較於以前經常使用的HttpClient,RestTemplate是一種更優雅的調用RESTful服務的方式。html
在Spring應用程序中訪問第三方REST服務與使用Spring RestTemplate類有關。RestTemplate類的設計原則與許多其餘Spring *模板類(例如JdbcTemplate、JmsTemplate)相同,爲執行復雜任務提供了一種具備默認行爲的簡化方法。java
RestTemplate默認依賴JDK提供http鏈接的能力(HttpURLConnection),若是有須要的話也能夠經過setRequestFactory方法替換爲例如 Apache HttpComponents、Netty或OkHttp等其它HTTP library。web
考慮到RestTemplate類是爲調用REST服務而設計的,所以它的主要方法與REST的基礎緊密相連就不足爲奇了,後者是HTTP協議的方法:HEAD、GET、POST、PUT、DELETE和OPTIONS。例如,RestTemplate類具備headForHeaders()、getForObject()、postForObject()、put()和delete()等方法。spring
RestTemplate包含如下幾個部分:restful
public MyRestClientService(RestTemplateBuilder restTemplateBuilder) { this.restTemplate = restTemplateBuilder .basicAuthorization("username", "password") .setConnectTimeout(3000) .setReadTimeout(5000) .rootUri("http://api.example.com/") .build(); } |
學習使用帶有Spring RestTemplate的ClientHttpRequestInterceptor,以Spring AOP風格記錄請求和響應頭和主體。app
import org.slf4j.Logger;import org.slf4j.LoggerFactory; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; import org.springframework.util.StreamUtils; import java.io.IOException; import java.nio.charset.Charset; public class RequestResponseLoggingInterceptor implements ClientHttpRequestInterceptor { private final Logger log = LoggerFactory.getLogger(this.getClass()); @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { logRequest(request, body); ClientHttpResponse response = execution.execute(request, body); logResponse(response); //Add optional additional headers response.getHeaders().add("headerName", "VALUE"); return response; } private void logRequest(HttpRequest request, byte[] body) throws IOException { if (log.isDebugEnabled()) { log.debug("===========================request begin================================================"); log.debug("URI : {}", request.getURI()); log.debug("Method : {}", request.getMethod()); log.debug("Headers : {}", request.getHeaders()); log.debug("Request body: {}", new String(body, "UTF-8")); log.debug("==========================request end================================================"); } } private void logResponse(ClientHttpResponse response) throws IOException { if (log.isDebugEnabled()) { log.debug("============================response begin=========================================="); log.debug("Status code : {}", response.getStatusCode()); log.debug("Status text : {}", response.getStatusText()); log.debug("Headers : {}", response.getHeaders()); log.debug("Response body: {}", StreamUtils.copyToString(response.getBody(), Charset.defaultCharset())); log.debug("=======================response end================================================="); } } } |
@Bean public RestTemplate restTemplate(){ RestTemplate restTemplate = new RestTemplate(); restTemplate.setRequestFactory(newBufferingClientHttpRequestFactory(clientHttpRequestFactory())); restTemplate.setMessageConverters(Collections.singletonList(mappingJacksonHttpMessageConverter())); restTemplate.setInterceptors( Collections.singletonList(newRequestResponseLoggingInterceptor()) ); return restTemplate; } |
private static void getEmployees(){ final String uri = "http://localhost:8080/springrestexample/employees"; RestTemplate restTemplate = new RestTemplate(); String result = restTemplate.getForObject(uri, String.class); System.out.println(result); } |
private static void getEmployees(){ final String uri = "http://localhost:8080/springrestexample/employees"; RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); HttpEntity<String> entity = new HttpEntity<String>("parameters", headers); ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class); System.out.println(result); } |
private static void getEmployees(){ final String uri = "http://localhost:8080/springrestexample/employees"; RestTemplate restTemplate = new RestTemplate(); EmployeeListVO result = restTemplate.getForObject(uri, EmployeeListVO.class); System.out.println(result); } |
private static void getEmployeeById(){ final String uri = "http://localhost:8080/springrestexample/employees/{id}"; Map<String, String> params = new HashMap<String, String>(); params.put("id", "1"); RestTemplate restTemplate = new RestTemplate(); EmployeeVO result = restTemplate.getForObject(uri, EmployeeVO.class, params); System.out.println(result); } |
private static void createEmployee(){ final String uri = "http://localhost:8080/springrestexample/employees"; EmployeeVO newEmployee = new EmployeeVO(-1, "Adam", "Gilly", "test@email.com"); RestTemplate restTemplate = new RestTemplate(); EmployeeVO result = restTemplate.postForObject( uri, newEmployee, EmployeeVO.class); System.out.println(result); } |
HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); MultiValueMap<String, String> map= new LinkedMultiValueMap<>(); map.add("id", "1"); HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers); RestTemplate restTemplate = new RestTemplate(); EmployeeVO result = restTemplate.postForObject( uri, request, EmployeeVO.class); System.out.println(result); |
private static void updateEmployee(){ final String uri = "http://localhost:8080/springrestexample/employees/{id}"; Map<String, String> params = new HashMap<String, String>(); params.put("id", "2"); EmployeeVO updatedEmployee = new EmployeeVO(2, "New Name", "Gilly", "test@email.com"); RestTemplate restTemplate = new RestTemplate(); restTemplate.put ( uri, updatedEmployee, params); } |
Foo updatedInstance = new Foo("newName"); updatedInstance.setId(createResponse.getBody().getId()); String resourceUrl = fooResourceUrl + '/' + createResponse.getBody().getId(); HttpEntity<Foo> requestUpdate = new HttpEntity<>(updatedInstance, headers); template.exchange(resourceUrl, HttpMethod.PUT, requestUpdate, Void.class); |
RequestCallback requestCallback(final Foo updatedInstance) { return clientHttpRequest -> { ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(clientHttpRequest.getBody(), updatedInstance); clientHttpRequest.getHeaders().add( HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); clientHttpRequest.getHeaders().add( HttpHeaders.AUTHORIZATION, "Basic " + getBase64EncodedLogPass()); }; } |
private static void deleteEmployee(){ final String uri = "http://localhost:8080/springrestexample/employees/{id}"; Map<String, String> params = new HashMap<String, String>(); params.put("id", "2"); RestTemplate restTemplate = new RestTemplate(); restTemplate.delete ( uri, params ); } |
https://howtodoinjava.com/spring-restful/spring-restful-client-resttemplate-example/框架
https://www.xncoding.com/2017/07/06/spring/sb-restclient.htmlide