He escrito un ejemplo de uso de RestTemplate. Dado que Spring 5 presenta completamente Reactive y también tiene una versión reactiva de WebClient de RestTemplate, este artículo mostrará el uso básico de WebClient.
Solicitud de llevar encabezado
Llevar galletas
@Test public void testwithcookie () {mono <string> resp = webclient.create () .method (httpmethod.get) .uri ("http://baidu.com") .cookie ("token", "xxxx") .cookie ("jsessionID", "xxxx") .etriedrieve ().) .BodyTomono (String.Class); Logger.info ("resultado: {}", resp.block ()); } Llevar autores básicos
@Test public void testWithBasicauth () {String basicauth = "básico"+ base64.getEncoder (). EncodeToString ("user: pwd" .getBytes (StandardCharSets.utf_8)); Logger.info (Basicauth); Mono <String> resp = webclient.create () .get () .uri ("http://baidu.com") .header (httpheaders.authorization, basicauth) .retrieve () .bodytomono (string.class); Logger.info ("resultado: {}", resp.block ()); } Establecer agente de usuario global
@Test public void testWithHheaderFilter () {WebClient WebClient = WebClient.Builder () .defaulTheader (httpheaders.user_agent, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebkit/537.36 (Khtml, como Gecko) Chrome/63.139.139.139.139.139.139. Safari/537.36 ") .filter (ExchangeFilterFunctions .Basicauthentication (" Usuario "," Passwase ")) .Filter ((ClientRequest, Next) -> {logger.info (" request: {} {} ", ClientRequest.method (), ClientRequest.url ()); Cliente de clientC. -> valores.forEach (valor -> logger.info ("{} = {}", nombre, valor))); Mono <String> resp = webclient.get () .uri ("https://baidu.com") .retrieve () .BodyTomono (string.class); Logger.info ("resultado: {}", resp.block ()); }Obtener solicitud
Pase los parámetros utilizando el marcador de posición
@Test public void testUrlplaceholder () {mono <string> resp = webclient.create () .get () // múltiples parámetros también se pueden colocar directamente en el mapa, y el nombre del parámetro corresponde al posteholder.uri ("http://www.baidu.com/s?wd={key}", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", "," ",", "," ",", "," ". Defirectora de posición.retrieve () .BodyTomono (string.class); Logger.info ("resultado: {}", resp.block ()); } Pase los parámetros usando UriBuilder
@Test public void testUrlBiUlder () {mono <string> resp = webclient.create () .get () .uri (uriBuilder -> uriBuilder .scheme ("http") .host ("www.baidu.com") .path ("/s") .queryparam ("wd", "beijing clima"). "Test") .Build ()) .retrieve () .BodyTomono (String.Class); Logger.info ("resultado: {}", resp.block ()); }Formulario
@Test public void testFormParam () {multivaluMap <string, string> formData = new LinkedMultivalUeMap <> (); formdata.add ("name1", "value1"); formdata.add ("name2", "value2"); Mono <String> resp = webClient.Create (). Post () .uri ("http://www.w3school.com.cn/test/demo_form.asp") .ContentType (Mediatype.application_form_urlencoded) .Body (BodyInserters.fromformdata)) .retrieve (). BodyTomono (String.Class); Logger.info ("resultado: {}", resp.block ()); }Post JSON
Usa los frijoles para publicar
Libro de clase estática {nombre de cadena; Título de cadena; public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } public String gettitle () {Título de retorno; } public void settitle (título de cadena) {this.title = title; }} @Test public void testPostjson () {book book = new Book (); book.setName ("nombre"); book.settitle ("Este es el título"); Mono <String> resp = webClient.Create (). Post () .uri ("http: // localhost: 8080/demo/json") .contentType (mediatype.application_json_utf8) .body (mono.just (libro), book.class) .criprieve (). Logger.info ("resultado: {}", resp.block ()); } Publicación directa RAW JSON
@Test public void testPoStrawjson () {mono <string> resp = webclient.create (). Post () .uri ("http: // localhost: 8080/demo/json") .contentType (mediAtype.applation_json_utf8) .BodyinSerters.fromobangeN title/",/n" + "/" autor/":/" Esto es autor/"/n" + "}")) .retrieve (). BodyTomono (string.class); Logger.info ("resultado: {}", resp.block ()); }Post Binary-Supload File
@Test public void testUploadFile () {httpheaders encabezados = new httpheaders (); Headers.setContentType (Mediatype.image_png); Httpentity <classpathResource> entity = new httpentity <> (new ClassPathResource ("Parallel.png"), encabezados); MultivaluEmap <string, object> Parts = new LinkedMultivalUeMap <> (); parts.Add ("archivo", entidad); Mono <String> resp = webClient.Create (). Post () .uri ("http: // localhost: 8080/upload") .contentType (mediatype.multipart_form_data) .body (bodyInserters.frommultipartData (partes)). Logger.info ("resultado: {}", resp.block ()); }Descargar binario
Descargar la imagen
@Test public void testdowDloadIgage () lanza IOException {mono <conseurce> resp = webclient.create (). Get () .uri ("http://www.toolip.gr/captcha?complexity=99&size=60&length=9") .accept (mediatype.image_pngng) .retrieve (). BodyTomono (Resource.Class); Recursos recursos = resp.block (); BufferedImage BufferedImage = ImageIO.Read (Resource.GetInputStream ()); ImageIO.Write (BufferedImage, "PNG", nuevo archivo ("Captcha.png")); } Descargar el archivo
@Test public void testdownloadfile () lanza ioexception {mono <clientResponse> resp = webclient.create (). Get () .uri ("http: // localhost: 8080/file/descargar") .accete (mediatype.applation_octet_stream) .exchange ();; ClientResponse Response = resp.block (); String Disposition = Response.headers (). AshttTpheaders (). GetFirst (httpheaders.content_disposition); Cadena filename = disposition.substring (disposition.IndexOf ("=")+1); Recursos recursos = respuesta.bodytomono (recurse.class) .block (); Archivo out = nuevo archivo (nombre de archivo); FileUtils.CopyInputStreamToFile (resource.getInputStream (), out); Logger.info (out.getabsolutePath ()); }Manejo de errores
@Test public void testRetrieve4xx () {WebClient WebClient = WebClient.Builder () .Baseurl ("https://api.github.com") .defaultheader (httpheaders.content_type, aplicación/vnd.github.v3+json ") .defaultheader (httteaders. "Spring 5 WebClient") .Build (); WebClient.ResponseSpec ResponsesPec = WebClient.Method (httpmethod.get) .uri ("/user/repos? Sort = {sortfield} & direction = {sortDirection}", "actualizado", "desc") .retrieve (); Mono <String> mono = ResponsesPec .onstatus (e -> e.is4xxClienterRor (), resp -> {logger.error ("Error: {}, msg: {}", resp.statuscode (). Value (), resp.statuscode (). GetRase (); return Mono.Error (new Runtimexception (respectexception (resp.). + ":" + resp.statuscode (). getRasonPhrase ())); RuntimeException (err.getMessage ()); Resultado de cadena = mono.block (); Logger.info ("resultado: {}", resultado); }resumen
WebClient es una nueva generación de plantilla de descanso asíncrata, y la API es relativamente simple y reactiva, lo que vale la pena usar.
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.