Conceptos básicos
Spring RestTemplate es un cliente proporcionado por Spring para acceder a los servicios de descanso. RestTemplate proporciona una variedad de formas convenientes de acceder a los servicios HTTP remotos, lo que puede mejorar enormemente la eficiencia de escritura del cliente. Por lo tanto, muchos clientes como Android o proveedores de servicios de terceros usan RestTemplate para solicitar servicios RESTful.
Resttemplata de Spring-Web es una encapsulación del HTTP subyacente de Java. Los usuarios que usan Resttemplata ya no pueden prestar atención al establecimiento de conexión subyacente. RestTemplata no solo admite la especificación REST, sino que también define el tipo de objeto de valor de retorno.
En uso, puede directamente nuevo un objeto RestTemplate. Habrá algunos convertidores de mensajes que devuelven mensajes en el objeto RestTemplate que creamos. Puede encontrar el convertidor correspondiente basado en la mediatipo de los datos devueltos y realizar la conversión de la mediatype. También puede crear un convertidor de mensajes usted mismo, crear una clase que herede el abstractGenerichttpMessageConverter <t> class o implementa la interfaz httpMessageConverter <t>. Cabe señalar que el método Canread y el método CanWrite deben juzgarse por usted mismo, escribir parámetros en la transmisión en el método WriteNternal o Write, y obtener el resultado devuelto del cuerpo de la transmisión en el método de lectura o lectura de lectura y tipo de mapa.
El objeto RestTemplate crea solicitudes HTTP en la parte inferior utilizando la implementación en el paquete Java.net. Puede especificar diferentes métodos de solicitud HTTP utilizando ClientHTTPRequestFactory.
La interfaz ClientHTTPRequestFactory proporciona principalmente dos métodos de implementación:
RestTemplate usa SimpleClientHTTPRequestFactory de forma predeterminada, y llama internamente httpconnection para llamar a JDK. El tiempo de espera predeterminado es -1. Podemos definir el tiempo de espera nosotros mismos.
SimpleClientHttpRequestFactory Factory = new SimpleClientHttprequestFactory (); // Establezca el tiempo de espera de conexión, la unidad MilliseCond Factory.SetConnectTimeOut (5000); // Establezca el tiempo de espera de lectura, la unidad Millisecond Factory.setTimeOut (10000); RESTTEmplate RestTemplate = new RestTemplate (fábrica);
Use las solicitudes Get:
Cadena url = "http: // localhost: 80/mandy/login.json? Cuenta = 123456 & contraseña = 123456"; resultado res = resttemplate.getforObject (url, resultado.class);
Código fuente de RestTemplate:
@Override public <T> t getForObject (String URL, class <T> ResponseType, objeto ... urlvariables) arroja RestClientException {requestCallback requestCallback = accEppTtheaderRequestCallback (ResponseType); HttpMessageConverterExtractor <T> ResponseExtractor = new httpMessageConverterExtractor <t> (ResponseType, getMessageConverters (), logger); return ejecute (url, httpmethod.get, requestCallback, ResponseExtractor, urlvariables); }Es mejor usar la solicitud GET para empalmar los parámetros directamente a la dirección. No sé por qué. Si usa el tercer parámetro, incluso el tipo multivaluMap no funcionará (algunas personas en Internet dicen que usar el tipo de multivaluMap está bien, pero lo probé pero no funcionará)
Use la solicitud de publicación:
Hashmap <string, object> map = new HashMap <String, Object> (); map.put ("nombre", "prueba"); map.put ("cuenta", "qwer"); map.put ("contraseña", "qwer"); ObjectMapper mapper = new ObjectMapper (); Cadena jsonstr = null; intente {jSonstr = mApper.WriteValueAsString (MAP); } catch (Exception e) {E.PrintStackTrace (); } // Cree la entidad del encabezado HTTP y complete la información del encabezado, como el formato de datos httpheaders httpheaders = new httpheaders (); httpheaders.setContentType (mediatype.application_json_utf8); // crea entidad http, puede usar directamente el constructor para colocar el cuerpo de solicitud y el encabezado de solicitud en httpentity <tring> httpentity = new httpentity <tring> (jsonstr2, httpheaders); string url = "http: // localhost: 80/mandy/user_enable.json"; // llamando al método para solicitar el resultado res2 = resttEmplate.postforObject (URL, httpentity, dult.class);Código fuente de RestTemplate:
@Override public <T> t postforObject (url de cadena, solicitud de objeto, clase <T> ResponseType, objeto ... urivaria) lanza RestClientException {requestCallback requestCallback = httpentityCallback (request, responsableType); HttpMessageConverterExtractor <T> ResponseExtractor = new httpMessageConverterExtractor <t> (ResponseType, getMessageConverters (), logger); return ejecute (url, httpmethod.post, requestCallback, ResponseExtractor, urivariables); }Use solicitudes de 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 = mepper.WriteValueAsString (map);} Catch (jSonProCessing E) E.PrintStackTRace ();} // Crear entidad de encabezado HTTP y completar la información del encabezado, como el formato de datos httpheaders httpheaders = new httpheaders (); httpheaders.setContentType (mediAtype.applation_json_utf8); // http entity, puede usar la construcción de la construcción y la petición de la construcción y la petición de la construcción y la solicitud de la construcción y la petición. Httpentity <String> httpentity = new httpentity <string> (jsonstr, httpheaders); String url = "http: // localhost: 80/mandy/user_enable.json"; RestTemplate.put (url, httpentity);Código fuente de RestTemplate:
@Override public void put (url de cadena, solicitud de objeto, objeto ... urlvariables) lanza RestClientException {requestCallback requestCallback = httpentitycallback (solicitud); ejecutar (url, httpmethod.put, requestcallback, null, urlvariables); }Una pequeña desventaja de este método es que no hay valor de retorno del resultado de la solicitud. Si necesita usar el valor de retorno, no puede usar este método.
Si desea utilizar una solicitud de tipo de eliminación, solo hay los siguientes parámetros en la columna de parámetros del método PUT de RESTTEmplate
@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, nulo, nulo, urlvariables);}@overridePublic void eliminar (uri url) lanza RestClientException {ejecute (url, httpmethod.delete, nulo, nulo);};Estos métodos no nos dan parámetros y nos permiten poner el contenido del cuerpo de la solicitud, por lo que si desea utilizar el método Eliminar proporcionado por RestTemplate directamente, la interfaz debe usar un estilo RESTful, colocar los parámetros en la dirección y obtener los parámetros a través de la anotación @PathVariable (value = "").
Punto clave: de hecho, podemos usar directamente el método de intercambio de RestTemplate, de la siguiente manera
@OverridePublic <T> ResponseEntity <T> Exchange (String Url, Httpmethod Method, HttpEntity <?> Solicitude, class <T> ResponseType, objeto ... urivaria) lanza RestClientException {requestCallback requestCallback = httpentitycallback (requestentEntity, ResponseType); ResponseExtractor <ResponseEntity <T>> ResponseExtractor = ResponseEntityExtractor (ResponseType); return ejecute (url, método, requestCallback, ResponseExtractor, urivariables);}Aquí solo enumeramos un método. Los otros se pueden encontrar en el código fuente. Este método puede hacer todo tipo de solicitudes.
En este método, el parámetro del método se puede obtener a través de la enumeración httpmethod. El parámetro Solicitity es la entidad HTTPentity encapsulada por sí misma, incluido el cuerpo de solicitud y el encabezado de solicitud. El parámetro ResponseType es una clase de mapeo que devuelve el resultado. El parámetro Urivariables me da la impresión de que es inútil (opinión personal). El acceso a la interfaz de retorno de solicitud se puede obtener a través del método getBody () del valor de retorno del método.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.