5

Tôi đang thử số mới WebClient từ Spring 5 (5.0.0.RC2) trong một codebase sử dụng lập trình phản hồi và tôi đã lập bản đồ thành công phản hồi JSON từ điểm cuối tới DTO trong ứng dụng của tôi, hoạt động rất đẹp:Cách tốt nhất có được một mảng byte từ ClientResponse từ Spring WebClient?

WebClient client = WebClient.create(baseURI); 
Mono<DTO> dto = client.get() 
     .uri(uri) 
     .accept(MediaType.APPLICATION_JSON) 
     .exchange() 
     .flatMap(response -> response.bodyToMono(DTO.class)); 

Tuy nhiên, bây giờ tôi đang cố gắng để cơ thể phản hồi từ một thiết bị đầu cuối trong đó sử dụng giao thức Buffers (dữ liệu nhị phân từng là application/octet-stream), vì vậy tôi muốn lấy raw bytes từ phản ứng, mà Sau đó tôi sẽ tự bản đồ đối tượng.

tôi đã nhận nó làm việc như thế này sử dụng Bytes từ Google Ổi:

Mono<byte[]> bytes = client.get() 
     .uri(uri) 
     .accept(MediaType.APPLICATION_OCTET_STREAM) 
     .exchange() 
     .flatMapMany(response -> response.body(BodyExtractors.toDataBuffers())) 
     .map(dataBuffer -> { 
      ByteBuffer byteBuffer = dataBuffer.asByteBuffer(); 
      byte[] byteArray = new byte[byteBuffer.remaining()]; 
      byteBuffer.get(byteArray, 0, bytes.length); 
      return byteArray; 
     }) 
     .reduce(Bytes::concat) 

này hoạt động, nhưng có một cách thanh lịch dễ dàng hơn để có được các byte?

Trả lời

8

ClientResponse.bodyToMono() cuối cùng sử dụng một số org.springframework.core.codec.Decoder tuyên bố hỗ trợ lớp được chỉ định.

Vì vậy, chúng tôi nên kiểm tra thứ bậc lớp học của Decoder, cụ thể ở đâu và cách thức phương pháp decodeToMono() được triển khai.

Có một StringDecoder hỗ trợ giải mã thành String, một loạt các bộ giải mã liên quan đến Jackson (được sử dụng trong ví dụ DTO của bạn dưới mui xe) và cũng có một số ResourceDecoder.

ResourceDecoder hỗ trợ org.springframework.core.io.InputStreamResourceorg.springframework.core.io.ByteArrayResource. ByteArrayResource về bản chất là một trình bao bọc xung quanh byte[], vì vậy mã sau sẽ cung cấp quyền truy cập vào nội dung phản hồi dưới dạng mảng byte:

Mono<byte[]> mono = client.get() 
      ... 
      .exchange() 
      .flatMap(response -> response.bodyToMono(ByteArrayResource.class)) 
      .map(ByteArrayResource::getByteArray); 
Các vấn đề liên quan