2017-09-11 15 views
6

Tôi đang cố gắng đăng nhập yêu cầu tôi đang thực hiện bằng cách sử dụng Spring 5 WebClient, bất kỳ ý tưởng nào về cách tôi có thể đạt được điều đó?cách đăng nhập Spring 5 Cuộc gọi WebClient

(Tôi đang sử dụng Spring 5 và Spring boot 2)

mã trông giống như hiện tại.

try { 
      return webClient.get().uri(url, urlParams).exchange().flatMap(response -> response.bodyToMono(Test.class)) 
        .map(test -> xxx.set(test)); 

     } catch (RestClientException e) { 
      log.error("Cannot get counter from opus", e); 
      throw e; 
     } 
+0

Bạn có thể chia sẻ đoạn mã bạn đã có ngay bây giờ không? –

+0

@BrianClozel tại đây là – Seb

+0

Cảm ơn! Bạn có thể đưa ra ví dụ về những gì bạn muốn đăng nhập không? URI yêu cầu? –

Trả lời

4

Bạn có thể dễ dàng làm điều đó bằng ExchangeFilterFunction

Chỉ cần thêm tùy chỉnh logRequest lọc khi bạn tạo WebClient bạn sử dụng WebClient.Builder.

Dưới đây là ví dụ về bộ lọc như vậy và cách thêm bộ lọc vào WebClient.

@Slf4j 
@Component 
public class MyClient { 

    private final WebClient webClient; 

    // Create WebClient instance using builder. 
    // If you use spring-boot 2.0, the builder will be autoconfigured for you 
    // with the "prototype" scope, meaning each injection point will receive 
    // a newly cloned instance of the builder. 
    public MyClient(WebClient.Builder webClientBuilder) { 
     webClient = webClientBuilder // you can also just use WebClient.builder() 
       .baseUrl("https://httpbin.org") 
       .filter(logRequest()) // here is the magic 
       .build(); 
    } 

    // Just example of sending request 
    public void send(String path) { 
     ClientResponse clientResponse = webClient 
       .get().uri(uriBuilder -> uriBuilder.path(path) 
         .queryParam("param", "value") 
         .build()) 
       .exchange() 
       .block(); 
     log.info("Response: {}", clientResponse.toEntity(String.class).block()); 
    } 

    // This method returns filter function which will log request data 
    private static ExchangeFilterFunction logRequest() { 
     return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { 
      log.info("Request: {} {}", clientRequest.method(), clientRequest.url()); 
      clientRequest.headers().forEach((name, values) -> values.forEach(value -> log.info("{}={}", name, value))); 
      return Mono.just(clientRequest); 
     }); 
    } 

} 

Sau đó, chỉ cần gọi myClient.send("get"); và thông điệp tường trình phải có ở đó.

Output dụ:

Request: GET https://httpbin.org/get?param=value 
header1=value1 
header2=value2 
+0

giải pháp hoàn hảo !! – Seb

+0

IMO, gọi 'block()' đánh bại mục đích của việc sử dụng webclient. Chúng tôi có thể đăng nhập yêu cầu bằng cách sử dụng một bộ lọc, nhưng không chắc chắn làm thế nào để đăng nhập các phản ứng từ một 'Mono ' mà không chặn. –

+0

@PavanKumar Cuộc gọi 'block()' ở đây chỉ nhằm mục đích demo. Bộ lọc ghi nhật ký yêu cầu sẽ vẫn hoạt động. Để ghi lại phản hồi, bạn có thể viết một ['ExchangeFilterFunction'] khác (https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/reactive/function/client/ExchangeFilterFunction.html# ofResponseProcessor-java.util.function.Function-) và ghi lại phản hồi. Nhưng hãy cẩn thận khi bạn đăng nhập nội dung phản hồi - vì bản chất luồng của nó, nó có thể được tiêu thụ chỉ một lần mà không có trình bao bọc. – djxak

2

Bạn không nhất thiết cần phải cuộn logger của riêng bạn, reactor.ipc.netty.channel.ChannelOperationsHandler làm điều đó cho bạn. Chỉ cần cấu hình hệ thống đăng nhập của bạn cho lớp đó để đăng nhập ở cấp DEBUG:

2017-11-23 12:52:04.562 DEBUG 41449 --- [ctor-http-nio-5] r.i.n.channel.ChannelOperationsHandler : [id: 0x9183d6da, L:/127.0.0.1:57681 - R:localhost/127.0.0.1:8000] Writing object DefaultFullHttpRequest(decodeResult: success, version: HTTP/1.1, content: UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 0, widx: 0, cap: 0)) 
GET /api/v1/watch/namespaces/default/events HTTP/1.1 
user-agent: ReactorNetty/0.7.1.RELEASE 
host: localhost:8000 
accept-encoding: gzip 
Accept: application/json 
content-length: 0 

Một cách để có lỗi ít hơn là để không viết mã bất cứ khi nào có thể.

+0

Tôi thích giải pháp này trong môi trường hạn chế và được kiểm soát như là một tùy chọn dễ dàng hơn để gỡ lỗi. Điều này không phải lúc nào cũng được khuyến nghị vì nó có thể phơi bày một số thông tin nhạy cảm trong tiêu đề, v.v. Nếu bộ lọc tùy chỉnh được cắm, bộ lọc có tùy chọn phân tích và ẩn thông tin nhạy cảm đó. –

+0

@PavanKumar Bất kỳ loại truyền dẫn đăng nhập nào có thể làm lộ các tiêu đề nhạy cảm như 'Ủy quyền'. OP không yêu cầu ẩn chúng, nhưng * nếu * đó là yêu cầu, * sau đó * mã có thể được viết. Thông thường, có thể chấp nhận đăng nhập các tiêu đề như vậy ở mức DEBUG. –

Các vấn đề liên quan