Spring WebClient | Java Development Journal

0
Spring WebClient |  Java Development Journal

Σε αυτό το άρθρο, θα συζητήσουμε το Spring WebClient. Το Spring WebClient είναι ένα reactive web-client που παρουσιάστηκε ως μέρος του Spring 5.

Spring WebClient

Με απλά λόγια, το Spring WebClient είναι ένας μη αποκλειστικός αντιδραστικός πελάτης που βοηθά στην εκτέλεση αιτήματος HTTP. Το παρουσίασαν ως μέρος του Spring 5. Τα WebClient API παρουσιάζονται ως μέρος της αντικατάστασης του υπάρχοντος Spring RestTemplate. Ας δούμε μερικά από τα σημαντικά χαρακτηριστικά του νέου πελάτη.

  1. Υποστήριξη Spring WebClient τόσο για σύγχρονη όσο και για ασύγχρονη.
  2. Υποστηρίζει ροή πάνω και κάτω.
  3. Λειτουργεί με HTTP/1.1
  4. Υποστηρίζει εξαιρετικά ταυτόχρονο, αντιδραστικό, μη αποκλειστικό πλαίσιο με λιγότερο απαιτητικό πλαίσιο πόρων.
  5. Υποστήριξη τόσο παραδοσιακής όσο και Spring reactive module.
  6. Παρέχει ένα λειτουργικό API που εκμεταλλεύεται τα Java 8 lambdas.

Από το 5.0, το μη αποκλειστικό, αντιδραστικό WebClient προσφέρει μια σύγχρονη εναλλακτική στην RestTemplate με αποτελεσματική υποστήριξη τόσο για συγχρονισμό όσο και για ασυγχρονισμό, καθώς και για σενάρια ροής. ο RestTemplate θα καταργηθεί σε μελλοντική έκδοση και δεν θα έχει σημαντικές νέες δυνατότητες από εδώ και στο εξής. Το συνιστώ ανεπιφύλακτα για την εκκίνηση του WebClient.

Σε αυτό το άρθρο, θα δούμε πώς να ρυθμίσετε το Spring WebClient και πώς να το χρησιμοποιήσετε για την πραγματοποίηση GET, POST ή οποιουδήποτε άλλου αιτήματος HTTP. Θα μάθουμε επίσης πώς να διαμορφώνουμε τον πελάτη για να χειρίζεται το χρονικό όριο λήξης και άλλες διαμορφώσεις που σχετίζονται με το HTTP.

1. Ρύθμιση εφαρμογής

Θα χρησιμοποιήσουμε το Spring Boot για διαχείριση εξαρτήσεων και αυτόματη διαμόρφωση ελατηρίου εκκίνησης. Ο WebClient είναι μέρος του spring-webflux μονάδα και θα την προσθέσουμε όπως απαιτείται για την υποστήριξη Spring Reactive.

<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

Λάβετε υπόψη ότι το Spring WebClient θα χρησιμοποιηθεί πάνω από μια υπάρχουσα ασύγχρονη βιβλιοθήκη πελατών HTTP. Έχουμε τις εξής επιλογές:

  • Reactor Netty.
  • Jetty Reactive Httpclient.
  • Apache HttpComponent.

Εάν χρησιμοποιείτε το Spring Boot, αυτό λαμβάνεται αυτόματα από την αυτόματη διαμόρφωση Spring Boot.

2. Εργασία με το Spring WebClient

Θα καλύψουμε τις ακόλουθες πτυχές σε αυτήν την ενότητα:

  1. Δημιουργήστε το Spring WebClient.
  2. Κλήση HTTP GET/POST με χρήση του WebClient.
  3. Πρόσθετη διαμόρφωση.

χρησιμοποιώ https://reqres.in για την προσομοίωση της κλήσης μας HTTP REST. Είναι ένα φιλοξενούμενο REST-API έτοιμο να ανταποκριθεί στις κλήσεις API σας. Αυτό διευκολύνει την εργασία στο REST API.

2.1. Δημιουργία WebClient

Το WebClient παρέχει create() μέθοδο για τη δημιουργία μιας προεπιλεγμένης παρουσίας. Αυτά είναι τα πιο βασικά βήματα για τη δημιουργία του πελάτη. Το λειτουργικό API παρέχει πιο ευέλικτο και ισχυρό τρόπο δημιουργίας του πελάτη, ο οποίος περιλαμβάνει:

  1. Εκκίνηση του πελάτη με βασικό URI.
  2. Ρύθμιση cookie.
  3. Διαμορφώσεις κεφαλίδας HTTP.
@Bean
public WebClient getWebClient(WebClient.Builder webClientBuilder) {
    return webClientBuilder
        .baseUrl("https://reqres.in/api")
        .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
        .build();
}

Το Spring Boot το κάνει πολύ εύκολο με την ένεση WebClient.Builder. Αυτό είναι μέρος του DefaultWebClientBuilder τάξη. Μπορούμε να χρησιμοποιήσουμε το πρόγραμμα δημιουργίας για να προσαρμόσουμε τη συμπεριφορά του πελάτη. Μια άλλη επιλογή είναι να δημιουργήσετε το WebClient χρησιμοποιώντας WebClient.create() και ρυθμίστε το ανάλογα.

WebClient client = WebClient.create("https://reqres.in/api");

2.2. Αποστολή Αίτησης

Η αποστολή αιτήματος χρησιμοποιώντας το Spring WebClient μοιάζει με αυτό που κάναμε με το RestTemplate, εκτός από το ότι παρέχει πιο άπταιστα API και έλεγχο στις κλήσεις API. Ας ρίξουμε μια ματιά σε μερικά από τα σημαντικά σημεία κατά τη χρήση του WebClient για την αποστολή αιτήματος.

  1. ο RequestHeadersUriSpec παρέχει την επιλογή χρήσης της μεθόδου HTTP (π.χ. GET ή POST κ.λπ.) κατά την κλήση του API.
  2. Προσθέστε λεπτομέρειες κεφαλίδας, cookie ή ελέγχου ταυτότητας (αν απαιτείται).
  3. Ορισμός URI αιτήματος.
  4. Σώμα αιτήματος εγκατάστασης (π.χ. αποστολή αιτήματος POST).
  5. Καλέστε το retrieve() ή exchange() μέθοδος.
  6. Χειριστείτε την απόκριση API.
 WebClient webClient = webClientBuilder
     .clientConnector(new ReactorClientHttpConnector(getHttpClient()))
     .baseUrl("https://reqres.in/api")
     .build();

 Customer customer = webClient.get()
     .uri("/users/{id}", id)
     .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
     .retrieve()
     .bodyToMono(Customer.class);

2.3. Απάντηση

Μπορούμε να χρησιμοποιήσουμε retrieve() και μετά bodyToFlux() και bodyToMono()μέθοδος σε περίπτωση που μας ενδιαφέρει μόνο η απάντηση API. Μπορούμε να χρησιμοποιήσουμε το exhange() μέθοδος σε περίπτωση που χρειαζόμαστε περισσότερες λεπτομέρειες από την απάντηση.

3. WebClient – ​​GET Request

Ας δούμε την κλήση HTTP GET χρησιμοποιώντας το Spring WebClient. Χρησιμοποιούμε τη μέθοδο GET όποτε θέλουμε να πάρουμε/ανακτήσουμε τους πόρους. Θα χρησιμοποιήσουμε τη μέθοδο GET για:

  • Ένας χρήστης GET /customers/{id}
  • Λίστα πελατών GET /customers
@RestController
public class CustomWebClientController {

    @Resource
    private WebClient webClient;

    @GetMapping("/customers/{id}")
    public Mono < Customer > getCustomer(@PathVariable String id) {

        return webClient.get()
            .uri("/users/{id}", id)
            .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
            .retrieve()
            .bodyToMono(Customer.class);
    }

    @GetMapping("/customers")
    public Mono < String > getCustomers() {

        return webClient.get()
            .uri("/users/")
            .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
            .retrieve()
            .bodyToMono(String.class);
    }
}

4. WebClient – ​​Αίτημα POST

@RestController
public class CustomWebClientController {

    @PostMapping("/customers")
    public Mono < String > createCustomer(final Data data) {

        return webClient.post()
            .uri("/users/")
            .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
            .body(Mono.just(data), Data.class)
            .retrieve()
            .bodyToMono(String.class);
    }
}

Εάν εκτελέσουμε τον παραπάνω κώδικα, η έξοδος θα μοιάζει με αυτό:

Διαφημίσεις

Spring WebClient
ΛΗΨΗ Αίτησης χρησιμοποιώντας το WebClient

5. WebClient – ​​ανάκτηση() έναντι ανταλλαγής()

Κατά τη χρήση του Spring WebClient, έχουμε την επιλογή να χρησιμοποιήσουμε retrieve() ή exchange() μέθοδος. Ας δούμε τη διαφορά μεταξύ αυτών των 2 μεθόδων για να κατανοήσουμε τις περιπτώσεις χρήσης τους.

  • ο retrieve() Η μέθοδος θα πρέπει να προτιμάται σε περίπτωση που μας ενδιαφέρει ο φορέας απάντησης.
  • Η μέθοδος ανταλλαγής παρέχει περισσότερο έλεγχο και λεπτομέρειες όπως κατάσταση, κεφαλίδες και σώμα απόκρισης κ.λπ.
  • retrieve() μέθοδος παρέχει αυτόματο σήμα σφάλματος (π.χ. 4xx και 5xx).
  • Δεν υπάρχει διαθέσιμο αυτόματο σήμα σφάλματος για exchange() μέθοδο και πρέπει να ελέγξουμε τον κωδικό κατάστασης και να τον χειριστούμε.

Πρέπει επίσης να καταλάβουμε το Ροή και Μονο τύπους που διατίθενται με τον αντιδραστήρα

6. Διαμόρφωση χρονικού ορίου με το Spring WebClient

Παρόμοια με το Spring RestTemplate, μπορούμε να ρυθμίσουμε το χρονικό όριο σύνδεσης για το WebClient. Χρησιμοποιήστε το HttpClient τάξη για να ρυθμίσετε το χρονικό όριο για τον πελάτη. Ας δούμε πώς να το κάνουμε αυτό:

@Configuration
public class CustomWebClient {

    @Bean
    public WebClient getWebClient(WebClient.Builder webClientBuilder) {

        return webClientBuilder
            .clientConnector(new ReactorClientHttpConnector(getHttpClient()))
            .baseUrl("https://reqres.in/api")
            .build();
    }

    private HttpClient getHttpClient() {
        return HttpClient.create()
            .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10 _000)
            .doOnConnected(conn - > conn
                .addHandlerLast(new ReadTimeoutHandler(10))
                .addHandlerLast(new WriteTimeoutHandler(10)));
    }
}

Ας δούμε μερικά σημαντικά σημεία:

Διαφημίσεις

  • ο ChannelOption.CONNECT_TIMEOUT_MILLIS μας επιτρέπει να δούμε το χρονικό όριο σύνδεσης.
  • Διαμόρφωση χρονικού ορίου ανάγνωσης και εγγραφής χρησιμοποιώντας το ReadTimeoutHandler και WriteTimeoutHandler.
  • Εάν θέλετε, μπορείτε να ορίσετε το χρονικό όριο απόκρισης χρησιμοποιώντας Duration.ofMillis().

6.1. Όριο μνήμης

Το προεπιλεγμένο όριο μνήμης για δεδομένα προσωρινής αποθήκευσης στη μνήμη είναι 256KB. Σε περίπτωση που ξεπεράσει αυτό το όριο, η Άνοιξη θα ρίξει DataBufferLimitException λάθος. Spring παρέχει την επιλογή για την αύξηση του ορίου δεδομένων buffer χρησιμοποιώντας την ιδιότητα max-in-memory-size. Μπορούμε να το ορίσουμε στο αρχείο application.properties.

spring.codec.max-in-memory-size=2MB

Περίληψη

Σε αυτό το άρθρο, εξετάζουμε το Spring WebClient. Είδαμε πώς να ρυθμίσουμε και να ρυθμίσουμε τον πελάτη και να τον χρησιμοποιήσουμε. Είδαμε επίσης πώς να ρυθμίσετε τη διαμόρφωση χρονικού ορίου και το όριο μνήμης για τον πελάτη σας. Στο επόμενο άρθρο μας, θα ρίξουμε μια πιο βαθιά ματιά στη διαφορετική μέθοδο που είναι διαθέσιμη στο WebClient. Όπως πάντα, ο πηγαίος κώδικας για αυτό το άρθρο είναι διαθέσιμος στο Αποθετήριο GitHub.

Schreibe einen Kommentar