亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

spring5 webclient使用指南詳解

2024-07-13 10:17:04
字體:
來源:轉載
供稿:網友

之前寫了一篇restTemplate使用實例,由于50.html">spring 5全面引入reactive,同時也有了restTemplate的reactive版webclient,本文就來對應展示下webclient的基本使用。

請求攜帶header

攜帶cookie

@Test  public void testWithCookie(){    Mono<String> resp = WebClient.create()        .method(HttpMethod.GET)        .uri("http://baidu.com")        .cookie("token","xxxx")        .cookie("JSESSIONID","XXXX")        .retrieve()        .bodyToMono(String.class);    LOGGER.info("result:{}",resp.block());  }

攜帶basic auth

@Test  public void testWithBasicAuth(){    String basicAuth = "Basic "+ 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("result:{}",resp.block());  }

設置全局user-agent

@Test  public void testWithHeaderFilter(){    WebClient webClient = WebClient.builder()        .defaultHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")        .filter(ExchangeFilterFunctions            .basicAuthentication("user","password"))        .filter((clientRequest, next) -> {          LOGGER.info("Request: {} {}", clientRequest.method(), clientRequest.url());          clientRequest.headers()              .forEach((name, values) -> values.forEach(value -> LOGGER.info("{}={}", name, value)));          return next.exchange(clientRequest);        })        .build();    Mono<String> resp = webClient.get()        .uri("https://baidu.com")        .retrieve()        .bodyToMono(String.class);    LOGGER.info("result:{}",resp.block());  }

get請求

使用placeholder傳遞參數

@Test  public void testUrlPlaceholder(){    Mono<String> resp = WebClient.create()        .get()        //多個參數也可以直接放到map中,參數名與placeholder對應上即可        .uri("http://www.baidu.com/s?wd={key}&other={another}","北京天氣","test") //使用占位符        .retrieve()        .bodyToMono(String.class);    LOGGER.info("result:{}",resp.block());  }

使用uriBuilder傳遞參數

@Test  public void testUrlBiulder(){    Mono<String> resp = WebClient.create()        .get()        .uri(uriBuilder -> uriBuilder            .scheme("http")            .host("www.baidu.com")            .path("/s")            .queryParam("wd", "北京天氣")            .queryParam("other", "test")            .build())        .retrieve()        .bodyToMono(String.class);    LOGGER.info("result:{}",resp.block());  }

post表單

@Test  public void testFormParam(){    MultiValueMap<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(formData))        .retrieve().bodyToMono(String.class);    LOGGER.info("result:{}",resp.block());  }

post json

使用bean來post

static class Book {    String name;    String title;    public String getName() {      return name;    }    public void setName(String name) {      this.name = name;    }    public String getTitle() {      return title;    }    public void setTitle(String title) {      this.title = title;    }  }  @Test  public void testPostJson(){    Book book = new Book();    book.setName("name");    book.setTitle("this is title");    Mono<String> resp = WebClient.create().post()        .uri("http://localhost:8080/demo/json")        .contentType(MediaType.APPLICATION_JSON_UTF8)        .body(Mono.just(book),Book.class)        .retrieve().bodyToMono(String.class);    LOGGER.info("result:{}",resp.block());  }

直接post raw json

@Test  public void testPostRawJson(){    Mono<String> resp = WebClient.create().post()        .uri("http://localhost:8080/demo/json")        .contentType(MediaType.APPLICATION_JSON_UTF8)        .body(BodyInserters.fromObject("{/n" +            " /"title/" : /"this is title/",/n" +            " /"author/" : /"this is author/"/n" +            "}"))        .retrieve().bodyToMono(String.class);    LOGGER.info("result:{}",resp.block());  }

post二進制--上傳文件

@Test  public void testUploadFile(){    HttpHeaders headers = new HttpHeaders();    headers.setContentType(MediaType.IMAGE_PNG);    HttpEntity<ClassPathResource> entity = new HttpEntity<>(new ClassPathResource("parallel.png"), headers);    MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();    parts.add("file", entity);    Mono<String> resp = WebClient.create().post()        .uri("http://localhost:8080/upload")        .contentType(MediaType.MULTIPART_FORM_DATA)        .body(BodyInserters.fromMultipartData(parts))        .retrieve().bodyToMono(String.class);    LOGGER.info("result:{}",resp.block());  }

下載二進制

下載圖片

@Test  public void testDownloadImage() throws IOException {    Mono<Resource> resp = WebClient.create().get()        .uri("http://www.toolip.gr/captcha?complexity=99&size=60&length=9")        .accept(MediaType.IMAGE_PNG)        .retrieve().bodyToMono(Resource.class);    Resource resource = resp.block();    BufferedImage bufferedImage = ImageIO.read(resource.getInputStream());    ImageIO.write(bufferedImage, "png", new File("captcha.png"));  }

下載文件

@Test  public void testDownloadFile() throws IOException {    Mono<ClientResponse> resp = WebClient.create().get()        .uri("http://localhost:8080/file/download")        .accept(MediaType.APPLICATION_OCTET_STREAM)        .exchange();    ClientResponse response = resp.block();    String disposition = response.headers().asHttpHeaders().getFirst(HttpHeaders.CONTENT_DISPOSITION);    String fileName = disposition.substring(disposition.indexOf("=")+1);    Resource resource = response.bodyToMono(Resource.class).block();    File out = new File(fileName);    FileUtils.copyInputStreamToFile(resource.getInputStream(),out);    LOGGER.info(out.getAbsolutePath());  }

錯誤處理

@Test  public void testRetrieve4xx(){    WebClient webClient = WebClient.builder()        .baseUrl("https://api.github.com")        .defaultHeader(HttpHeaders.CONTENT_TYPE, "application/vnd.github.v3+json")        .defaultHeader(HttpHeaders.USER_AGENT, "Spring 5 WebClient")        .build();    WebClient.ResponseSpec responseSpec = webClient.method(HttpMethod.GET)        .uri("/user/repos?sort={sortField}&direction={sortDirection}",            "updated", "desc")        .retrieve();    Mono<String> mono = responseSpec        .onStatus(e -> e.is4xxClientError(),resp -> {          LOGGER.error("error:{},msg:{}",resp.statusCode().value(),resp.statusCode().getReasonPhrase());          return Mono.error(new RuntimeException(resp.statusCode().value() + " : " + resp.statusCode().getReasonPhrase()));        })        .bodyToMono(String.class)        .doOnError(WebClientResponseException.class, err -> {          LOGGER.info("ERROR status:{},msg:{}",err.getRawStatusCode(),err.getResponseBodyAsString());          throw new RuntimeException(err.getMessage());        })        .onErrorReturn("fallback");    String result = mono.block();    LOGGER.info("result:{}",result);  }
  1. 可以使用onStatus根據status code進行異常適配
  2. 可以使用doOnError異常適配
  3. 可以使用onErrorReturn返回默認值

小結

webclient是新一代的async rest template,api也相對簡潔,而且是reactive的,非常值得使用。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线中文字幕| 国产精品第一页在线| 精品色蜜蜜精品视频在线观看| 97精品国产aⅴ7777| 日韩在线视频线视频免费网站| 精品人伦一区二区三区蜜桃网站| 国产69精品99久久久久久宅男| 国产成人在线视频| 最近2019中文字幕一页二页| 国产精品吹潮在线观看| 国产精品扒开腿做爽爽爽的视频| 欧美另类精品xxxx孕妇| 精品日本美女福利在线观看| 欧美成人黄色小视频| 欧美极品欧美精品欧美视频| 91九色国产社区在线观看| 精品视频在线播放免| 亚洲伊人成综合成人网| 亚洲国产天堂久久综合网| 一区二区三区动漫| 国产精品久久久久久久久粉嫩av| 永久免费精品影视网站| 亚洲第一福利在线观看| 欧美三级欧美成人高清www| 欧洲美女免费图片一区| 日韩中文在线不卡| 国产日产亚洲精品| 免费不卡欧美自拍视频| 亚洲精品videossex少妇| 国产拍精品一二三| 国产亚洲欧美日韩一区二区| 亚洲图片在区色| 久久韩国免费视频| 久久亚洲一区二区三区四区五区高| 亚洲一区二区三区sesese| 亚洲激情国产精品| 国产精品91免费在线| 黑人巨大精品欧美一区二区一视频| 欧美成人免费播放| 青青草国产精品一区二区| 亚洲第一区中文字幕| 日韩免费中文字幕| 国产精品一区二区av影院萌芽| 亚洲第一精品夜夜躁人人躁| 国产精品老女人精品视频| 在线电影欧美日韩一区二区私密| 日韩欧美亚洲综合| 亚洲精品美女在线观看播放| 成人写真福利网| 亚洲va电影大全| 日韩电影免费观看中文字幕| 2021国产精品视频| 91精品国产高清久久久久久久久| 欧美电影免费看| 久久久亚洲精品视频| 亚洲人成77777在线观看网| 亚洲free性xxxx护士白浆| 亚洲色图第一页| 一区二区三区在线播放欧美| 91sa在线看| 欧美视频在线免费看| www日韩中文字幕在线看| 日本午夜在线亚洲.国产| 日韩第一页在线| 久久精品91久久香蕉加勒比| 中文字幕在线国产精品| 不卡av电影在线观看| 国产精品老牛影院在线观看| 亚洲欧美国产精品| 欧美精品videossex性护士| 欧美一级大胆视频| 欧洲成人在线观看| 成人有码在线视频| 欧美在线日韩在线| 亚洲电影中文字幕| 欧美疯狂性受xxxxx另类| 成人伊人精品色xxxx视频| 欧美日本亚洲视频| 国产精品扒开腿爽爽爽视频| 亚洲精品日韩激情在线电影| 亚洲最大成人网色| 亚洲精品国产综合区久久久久久久| 国产噜噜噜噜噜久久久久久久久| 精品视频—区二区三区免费| 91在线高清视频| 亚洲色图35p| 国产精品久久久久久久久久小说| 亚洲欧洲av一区二区| 一区二区三区久久精品| 亚洲天堂成人在线视频| 日韩在线高清视频| 欧美日韩国产123| 亚洲第一二三四五区| 成人久久一区二区| 97在线观看视频国产| 欧美精品成人91久久久久久久| 国产大片精品免费永久看nba| 亚洲天天在线日亚洲洲精| 另类美女黄大片| 欧美黄色www| 久久久国产91| 久久中文久久字幕| 久热99视频在线观看| 精品久久香蕉国产线看观看亚洲| 91社区国产高清| 国产亚洲福利一区| 欧美精品中文字幕一区| 91精品久久久久久综合乱菊| 亚洲精品美女久久久久| 亚洲深夜福利网站| 亚洲人成电影网站色| 欧美性20hd另类| 91干在线观看| 亚洲国产欧美在线成人app| 欧美性xxxx极品高清hd直播| 欧美日韩国产丝袜美女| 欧美性极品少妇精品网站| 国产女人18毛片水18精品| 国产一区二区成人| 日韩欧美亚洲一二三区| 欧美午夜无遮挡| 成人激情av在线| 国产亚洲欧美日韩美女| 亚洲成人国产精品| 国产精品入口尤物| 狠狠躁夜夜躁久久躁别揉| 麻豆乱码国产一区二区三区| 久久久精品视频在线观看| 国产极品jizzhd欧美| 久久精品99国产精品酒店日本| 国产成人激情视频| 日韩免费黄色av| 欧美激情va永久在线播放| 中文字幕日韩有码| 精品久久香蕉国产线看观看gif| 久久好看免费视频| zzijzzij亚洲日本成熟少妇| 国产精品老女人精品视频| 成人有码在线播放| 欧美大片网站在线观看| 日av在线播放中文不卡| 性色av一区二区三区在线观看| 伊人久久男人天堂| 欧美野外wwwxxx| 久久久久久69| 欧美大片第1页| 高清日韩电视剧大全免费播放在线观看| 久久久久久久国产精品| 96精品视频在线| 久久成人精品视频| 国产精品久久久久久久久免费看| 91精品久久久久久久久久久| 国产在线一区二区三区| 色与欲影视天天看综合网| 日本高清不卡的在线| 精品国产一区二区三区久久久| 日韩欧美在线免费观看| 丝袜美腿精品国产二区| 日本精品中文字幕| 91在线观看免费网站| 性欧美在线看片a免费观看| 日韩性生活视频| 一本色道久久88亚洲综合88| 国产精品96久久久久久|