Class DefaultHttpClient

java.lang.Object
io.micronaut.http.client.netty.DefaultHttpClient
All Implemented Interfaces:
io.micronaut.context.LifeCycle<io.micronaut.http.client.HttpClient>, io.micronaut.http.client.HttpClient, io.micronaut.http.client.ProxyHttpClient, io.micronaut.http.client.sse.SseClient, io.micronaut.http.client.StreamingHttpClient, io.micronaut.websocket.WebSocketClient, Closeable, AutoCloseable

@Internal public class DefaultHttpClient extends Object implements io.micronaut.websocket.WebSocketClient, io.micronaut.http.client.HttpClient, io.micronaut.http.client.StreamingHttpClient, io.micronaut.http.client.sse.SseClient, io.micronaut.http.client.ProxyHttpClient, Closeable, AutoCloseable
Default implementation of the HttpClient interface based on Netty.
Since:
1.0
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static final class 
    Key used for connection pooling and determining host/port.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected io.micronaut.core.io.buffer.ByteBufferFactory<io.netty.buffer.ByteBufAllocator,io.netty.buffer.ByteBuf>
     
    protected io.micronaut.http.codec.MediaTypeCodecRegistry
     

    Fields inherited from interface io.micronaut.http.client.HttpClient

    DEFAULT_ERROR_TYPE

    Fields inherited from interface io.micronaut.websocket.WebSocketClient

    SCHEME_WS, SCHEME_WSS
  • Constructor Summary

    Constructors
    Constructor
    Description
     
    DefaultHttpClient(@Nullable io.micronaut.http.client.LoadBalancer loadBalancer, @NonNull io.micronaut.http.client.HttpClientConfiguration configuration, @Nullable String contextPath, @Nullable ThreadFactory threadFactory, ClientSslBuilder nettyClientSslBuilder, @NonNull io.micronaut.http.codec.MediaTypeCodecRegistry codecRegistry, @NonNull io.micronaut.http.body.MessageBodyHandlerRegistry handlerRegistry, @Nullable io.micronaut.core.annotation.AnnotationMetadataResolver annotationMetadataResolver, io.micronaut.core.convert.ConversionService conversionService, io.micronaut.http.filter.HttpClientFilter... filters)
    Construct a client for the given arguments.
    DefaultHttpClient(@Nullable io.micronaut.http.client.LoadBalancer loadBalancer, @Nullable io.micronaut.http.client.HttpVersionSelection explicitHttpVersion, @NonNull io.micronaut.http.client.HttpClientConfiguration configuration, @Nullable String contextPath, @NonNull io.micronaut.http.filter.HttpClientFilterResolver<io.micronaut.http.client.filter.ClientFilterResolutionContext> filterResolver, @NonNull List<io.micronaut.http.filter.HttpFilterResolver.FilterEntry> clientFilterEntries, @Nullable ThreadFactory threadFactory, @NonNull ClientSslBuilder nettyClientSslBuilder, @NonNull io.micronaut.http.codec.MediaTypeCodecRegistry codecRegistry, @NonNull io.micronaut.http.body.MessageBodyHandlerRegistry handlerRegistry, @NonNull io.micronaut.websocket.context.WebSocketBeanRegistry webSocketBeanRegistry, @NonNull io.micronaut.http.bind.RequestBinderRegistry requestBinderRegistry, @Nullable io.netty.channel.EventLoopGroup eventLoopGroup, @NonNull io.netty.channel.ChannelFactory<? extends io.netty.channel.socket.SocketChannel> socketChannelFactory, @NonNull io.netty.channel.ChannelFactory<? extends io.netty.channel.socket.DatagramChannel> udpChannelFactory, NettyClientCustomizer clientCustomizer, @Nullable String informationalServiceId, io.micronaut.core.convert.ConversionService conversionService)
    Construct a client for the given arguments.
    DefaultHttpClient(@Nullable io.micronaut.http.client.LoadBalancer loadBalancer, io.micronaut.http.client.HttpClientConfiguration configuration)
     
    DefaultHttpClient(@Nullable URI uri)
     
    DefaultHttpClient(@Nullable URI uri, @NonNull io.micronaut.http.client.HttpClientConfiguration configuration)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    protected io.micronaut.http.client.netty.DefaultHttpClient.NettyRequestWriter
    buildNettyRequest(io.micronaut.http.MutableHttpRequest request, URI requestURI, io.micronaut.http.MediaType requestContentType, boolean permitsBody, @Nullable io.micronaut.core.type.Argument<?> bodyType, Consumer<? super Throwable> onError)
     
    void
     
    <T extends AutoCloseable>
    org.reactivestreams.Publisher<T>
    connect(Class<T> clientEndpointType, io.micronaut.http.MutableHttpRequest<?> request)
     
    <T extends AutoCloseable>
    org.reactivestreams.Publisher<T>
    connect(Class<T> clientEndpointType, Map<String,Object> parameters)
     
    Access to the connection manager, for micronaut-oracle-cloud.
    <I> org.reactivestreams.Publisher<io.micronaut.core.io.buffer.ByteBuffer<?>>
    dataStream(io.micronaut.http.HttpRequest<I> request)
     
    <I> org.reactivestreams.Publisher<io.micronaut.core.io.buffer.ByteBuffer<?>>
    dataStream(io.micronaut.http.HttpRequest<I> request, @NonNull io.micronaut.core.type.Argument<?> errorType)
     
    <I> org.reactivestreams.Publisher<io.micronaut.http.sse.Event<io.micronaut.core.io.buffer.ByteBuffer<?>>>
    eventStream(io.micronaut.http.HttpRequest<I> request)
     
    <I, B> org.reactivestreams.Publisher<io.micronaut.http.sse.Event<B>>
    eventStream(io.micronaut.http.HttpRequest<I> request, @NonNull io.micronaut.core.type.Argument<B> eventType)
     
    <I, B> org.reactivestreams.Publisher<io.micronaut.http.sse.Event<B>>
    eventStream(io.micronaut.http.HttpRequest<I> request, @NonNull io.micronaut.core.type.Argument<B> eventType, @NonNull io.micronaut.core.type.Argument<?> errorType)
     
    <I, O, E> org.reactivestreams.Publisher<io.micronaut.http.HttpResponse<O>>
    exchange(io.micronaut.http.HttpRequest<I> request, @NonNull io.micronaut.core.type.Argument<O> bodyType, @NonNull io.micronaut.core.type.Argument<E> errorType)
     
    <I> org.reactivestreams.Publisher<io.micronaut.http.HttpResponse<io.micronaut.core.io.buffer.ByteBuffer<?>>>
    exchangeStream(io.micronaut.http.HttpRequest<I> request)
     
    <I> org.reactivestreams.Publisher<io.micronaut.http.HttpResponse<io.micronaut.core.io.buffer.ByteBuffer<?>>>
    exchangeStream(io.micronaut.http.HttpRequest<I> request, @NonNull io.micronaut.core.type.Argument<?> errorType)
     
    io.micronaut.http.client.HttpClientConfiguration
     
    final @NonNull io.micronaut.http.body.MessageBodyHandlerRegistry
    Get the handler registry for this client.
    protected Object
     
    org.slf4j.Logger
     
    io.micronaut.http.codec.MediaTypeCodecRegistry
     
    boolean
     
    <I> org.reactivestreams.Publisher<Map<String,Object>>
    jsonStream(io.micronaut.http.HttpRequest<I> request)
     
    <I, O> org.reactivestreams.Publisher<O>
    jsonStream(io.micronaut.http.HttpRequest<I> request, @NonNull io.micronaut.core.type.Argument<O> type)
     
    <I, O> org.reactivestreams.Publisher<O>
    jsonStream(io.micronaut.http.HttpRequest<I> request, @NonNull io.micronaut.core.type.Argument<O> type, @NonNull io.micronaut.core.type.Argument<?> errorType)
     
    <I, O> org.reactivestreams.Publisher<O>
    jsonStream(io.micronaut.http.HttpRequest<I> request, @NonNull Class<O> type)
     
    org.reactivestreams.Publisher<io.micronaut.http.MutableHttpResponse<?>>
    proxy(io.micronaut.http.HttpRequest<?> request)
     
    org.reactivestreams.Publisher<io.micronaut.http.MutableHttpResponse<?>>
    proxy(io.micronaut.http.HttpRequest<?> request, @NonNull io.micronaut.http.client.ProxyRequestOptions options)
     
    protected <I> org.reactivestreams.Publisher<URI>
    resolveRedirectURI(io.micronaut.http.HttpRequest<?> parentRequest, io.micronaut.http.HttpRequest<I> request)
     
    protected <I> org.reactivestreams.Publisher<URI>
    resolveRequestURI(io.micronaut.http.HttpRequest<I> request)
     
    protected <I> org.reactivestreams.Publisher<URI>
    resolveRequestURI(io.micronaut.http.HttpRequest<I> request, boolean includeContextPath)
     
    <I, O, E> org.reactivestreams.Publisher<O>
    retrieve(io.micronaut.http.HttpRequest<I> request, io.micronaut.core.type.Argument<O> bodyType, io.micronaut.core.type.Argument<E> errorType)
     
    final void
    setHandlerRegistry(@NonNull io.micronaut.http.body.MessageBodyHandlerRegistry handlerRegistry)
    Set the handler registry for this client.
    void
    setMediaTypeCodecRegistry(io.micronaut.http.codec.MediaTypeCodecRegistry mediaTypeCodecRegistry)
    Deprecated.
    io.micronaut.http.client.HttpClient
     
    io.micronaut.http.client.HttpClient
     
    io.micronaut.http.client.BlockingHttpClient
     

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface io.micronaut.http.client.HttpClient

    exchange, exchange, exchange, exchange, exchange, refresh, retrieve, retrieve, retrieve, retrieve

    Methods inherited from interface io.micronaut.http.client.sse.SseClient

    eventStream, eventStream, eventStream

    Methods inherited from interface io.micronaut.websocket.WebSocketClient

    connect, connect
  • Field Details

    • mediaTypeCodecRegistry

      protected io.micronaut.http.codec.MediaTypeCodecRegistry mediaTypeCodecRegistry
    • byteBufferFactory

      protected io.micronaut.core.io.buffer.ByteBufferFactory<io.netty.buffer.ByteBufAllocator,io.netty.buffer.ByteBuf> byteBufferFactory
  • Constructor Details

    • DefaultHttpClient

      public DefaultHttpClient(@Nullable @Nullable io.micronaut.http.client.LoadBalancer loadBalancer, @NonNull @NonNull io.micronaut.http.client.HttpClientConfiguration configuration, @Nullable @Nullable String contextPath, @Nullable @Nullable ThreadFactory threadFactory, ClientSslBuilder nettyClientSslBuilder, @NonNull @NonNull io.micronaut.http.codec.MediaTypeCodecRegistry codecRegistry, @NonNull @NonNull io.micronaut.http.body.MessageBodyHandlerRegistry handlerRegistry, @Nullable @Nullable io.micronaut.core.annotation.AnnotationMetadataResolver annotationMetadataResolver, io.micronaut.core.convert.ConversionService conversionService, io.micronaut.http.filter.HttpClientFilter... filters)
      Construct a client for the given arguments.
      Parameters:
      loadBalancer - The LoadBalancer to use for selecting servers
      configuration - The HttpClientConfiguration object
      contextPath - The base URI to prepend to request uris
      threadFactory - The thread factory to use for client threads
      nettyClientSslBuilder - The SSL builder
      codecRegistry - The MediaTypeCodecRegistry to use for encoding and decoding objects
      handlerRegistry - The handler registry for encoding and decoding
      annotationMetadataResolver - The annotation metadata resolver
      conversionService - The conversion service
      filters - The filters to use
    • DefaultHttpClient

      public DefaultHttpClient(@Nullable @Nullable io.micronaut.http.client.LoadBalancer loadBalancer, @Nullable @Nullable io.micronaut.http.client.HttpVersionSelection explicitHttpVersion, @NonNull @NonNull io.micronaut.http.client.HttpClientConfiguration configuration, @Nullable @Nullable String contextPath, @NonNull @NonNull io.micronaut.http.filter.HttpClientFilterResolver<io.micronaut.http.client.filter.ClientFilterResolutionContext> filterResolver, @NonNull @NonNull List<io.micronaut.http.filter.HttpFilterResolver.FilterEntry> clientFilterEntries, @Nullable @Nullable ThreadFactory threadFactory, @NonNull @NonNull ClientSslBuilder nettyClientSslBuilder, @NonNull @NonNull io.micronaut.http.codec.MediaTypeCodecRegistry codecRegistry, @NonNull @NonNull io.micronaut.http.body.MessageBodyHandlerRegistry handlerRegistry, @NonNull @NonNull io.micronaut.websocket.context.WebSocketBeanRegistry webSocketBeanRegistry, @NonNull @NonNull io.micronaut.http.bind.RequestBinderRegistry requestBinderRegistry, @Nullable @Nullable io.netty.channel.EventLoopGroup eventLoopGroup, @NonNull @NonNull io.netty.channel.ChannelFactory<? extends io.netty.channel.socket.SocketChannel> socketChannelFactory, @NonNull @NonNull io.netty.channel.ChannelFactory<? extends io.netty.channel.socket.DatagramChannel> udpChannelFactory, NettyClientCustomizer clientCustomizer, @Nullable @Nullable String informationalServiceId, io.micronaut.core.convert.ConversionService conversionService)
      Construct a client for the given arguments.
      Parameters:
      loadBalancer - The LoadBalancer to use for selecting servers
      explicitHttpVersion - The HTTP version to use. Can be null and defaults to HttpVersion.HTTP_1_1
      configuration - The HttpClientConfiguration object
      contextPath - The base URI to prepend to request uris
      filterResolver - The http client filter resolver
      clientFilterEntries - The client filter entries
      threadFactory - The thread factory to use for client threads
      nettyClientSslBuilder - The SSL builder
      codecRegistry - The MediaTypeCodecRegistry to use for encoding and decoding objects
      handlerRegistry - The handler registry for encoding and decoding
      webSocketBeanRegistry - The websocket bean registry
      requestBinderRegistry - The request binder registry
      eventLoopGroup - The event loop group to use
      socketChannelFactory - The socket channel factory
      udpChannelFactory - The UDP channel factory
      clientCustomizer - The pipeline customizer
      informationalServiceId - Optional service ID that will be passed to exceptions created by this client
      conversionService - The conversion service
    • DefaultHttpClient

      public DefaultHttpClient(@Nullable @Nullable URI uri)
      Parameters:
      uri - The URL
    • DefaultHttpClient

      public DefaultHttpClient()
    • DefaultHttpClient

      public DefaultHttpClient(@Nullable @Nullable URI uri, @NonNull @NonNull io.micronaut.http.client.HttpClientConfiguration configuration)
      Parameters:
      uri - The URI
      configuration - The HttpClientConfiguration object
    • DefaultHttpClient

      public DefaultHttpClient(@Nullable @Nullable io.micronaut.http.client.LoadBalancer loadBalancer, io.micronaut.http.client.HttpClientConfiguration configuration)
      Parameters:
      loadBalancer - The LoadBalancer to use for selecting servers
      configuration - The HttpClientConfiguration object
  • Method Details

    • getConfiguration

      public io.micronaut.http.client.HttpClientConfiguration getConfiguration()
      Returns:
      The configuration used by this client
    • getLog

      public org.slf4j.Logger getLog()
      Returns:
      The client-specific logger name
    • connectionManager

      public ConnectionManager connectionManager()
      Access to the connection manager, for micronaut-oracle-cloud.
      Returns:
      The connection manager of this client
    • start

      public io.micronaut.http.client.HttpClient start()
      Specified by:
      start in interface io.micronaut.context.LifeCycle<io.micronaut.http.client.HttpClient>
    • isRunning

      public boolean isRunning()
      Specified by:
      isRunning in interface io.micronaut.context.LifeCycle<io.micronaut.http.client.HttpClient>
    • stop

      public io.micronaut.http.client.HttpClient stop()
      Specified by:
      stop in interface io.micronaut.context.LifeCycle<io.micronaut.http.client.HttpClient>
    • getMediaTypeCodecRegistry

      public io.micronaut.http.codec.MediaTypeCodecRegistry getMediaTypeCodecRegistry()
      Returns:
      The MediaTypeCodecRegistry used by this client
    • setMediaTypeCodecRegistry

      @Deprecated public void setMediaTypeCodecRegistry(io.micronaut.http.codec.MediaTypeCodecRegistry mediaTypeCodecRegistry)
      Deprecated.
      Sets the MediaTypeCodecRegistry used by this client.
      Parameters:
      mediaTypeCodecRegistry - The registry to use. Should not be null
    • getHandlerRegistry

      @NonNull public final @NonNull io.micronaut.http.body.MessageBodyHandlerRegistry getHandlerRegistry()
      Get the handler registry for this client.
      Returns:
      The handler registry
    • setHandlerRegistry

      public final void setHandlerRegistry(@NonNull @NonNull io.micronaut.http.body.MessageBodyHandlerRegistry handlerRegistry)
      Set the handler registry for this client.
      Parameters:
      handlerRegistry - The handler registry
    • toBlocking

      public io.micronaut.http.client.BlockingHttpClient toBlocking()
      Specified by:
      toBlocking in interface io.micronaut.http.client.HttpClient
    • eventStream

      public <I> org.reactivestreams.Publisher<io.micronaut.http.sse.Event<io.micronaut.core.io.buffer.ByteBuffer<?>>> eventStream(@NonNull io.micronaut.http.HttpRequest<I> request)
      Specified by:
      eventStream in interface io.micronaut.http.client.sse.SseClient
    • eventStream

      public <I, B> org.reactivestreams.Publisher<io.micronaut.http.sse.Event<B>> eventStream(@NonNull io.micronaut.http.HttpRequest<I> request, @NonNull @NonNull io.micronaut.core.type.Argument<B> eventType)
      Specified by:
      eventStream in interface io.micronaut.http.client.sse.SseClient
    • eventStream

      public <I, B> org.reactivestreams.Publisher<io.micronaut.http.sse.Event<B>> eventStream(@NonNull io.micronaut.http.HttpRequest<I> request, @NonNull @NonNull io.micronaut.core.type.Argument<B> eventType, @NonNull @NonNull io.micronaut.core.type.Argument<?> errorType)
      Specified by:
      eventStream in interface io.micronaut.http.client.sse.SseClient
    • dataStream

      public <I> org.reactivestreams.Publisher<io.micronaut.core.io.buffer.ByteBuffer<?>> dataStream(@NonNull io.micronaut.http.HttpRequest<I> request)
      Specified by:
      dataStream in interface io.micronaut.http.client.StreamingHttpClient
    • dataStream

      public <I> org.reactivestreams.Publisher<io.micronaut.core.io.buffer.ByteBuffer<?>> dataStream(@NonNull io.micronaut.http.HttpRequest<I> request, @NonNull @NonNull io.micronaut.core.type.Argument<?> errorType)
      Specified by:
      dataStream in interface io.micronaut.http.client.StreamingHttpClient
    • exchangeStream

      public <I> org.reactivestreams.Publisher<io.micronaut.http.HttpResponse<io.micronaut.core.io.buffer.ByteBuffer<?>>> exchangeStream(@NonNull io.micronaut.http.HttpRequest<I> request)
      Specified by:
      exchangeStream in interface io.micronaut.http.client.StreamingHttpClient
    • exchangeStream

      public <I> org.reactivestreams.Publisher<io.micronaut.http.HttpResponse<io.micronaut.core.io.buffer.ByteBuffer<?>>> exchangeStream(@NonNull io.micronaut.http.HttpRequest<I> request, @NonNull @NonNull io.micronaut.core.type.Argument<?> errorType)
      Specified by:
      exchangeStream in interface io.micronaut.http.client.StreamingHttpClient
    • jsonStream

      public <I, O> org.reactivestreams.Publisher<O> jsonStream(@NonNull io.micronaut.http.HttpRequest<I> request, @NonNull @NonNull io.micronaut.core.type.Argument<O> type)
      Specified by:
      jsonStream in interface io.micronaut.http.client.StreamingHttpClient
    • jsonStream

      public <I, O> org.reactivestreams.Publisher<O> jsonStream(@NonNull io.micronaut.http.HttpRequest<I> request, @NonNull @NonNull io.micronaut.core.type.Argument<O> type, @NonNull @NonNull io.micronaut.core.type.Argument<?> errorType)
      Specified by:
      jsonStream in interface io.micronaut.http.client.StreamingHttpClient
    • jsonStream

      public <I> org.reactivestreams.Publisher<Map<String,Object>> jsonStream(@NonNull io.micronaut.http.HttpRequest<I> request)
      Specified by:
      jsonStream in interface io.micronaut.http.client.StreamingHttpClient
    • jsonStream

      public <I, O> org.reactivestreams.Publisher<O> jsonStream(@NonNull io.micronaut.http.HttpRequest<I> request, @NonNull @NonNull Class<O> type)
      Specified by:
      jsonStream in interface io.micronaut.http.client.StreamingHttpClient
    • exchange

      public <I, O, E> org.reactivestreams.Publisher<io.micronaut.http.HttpResponse<O>> exchange(@NonNull io.micronaut.http.HttpRequest<I> request, @NonNull @NonNull io.micronaut.core.type.Argument<O> bodyType, @NonNull @NonNull io.micronaut.core.type.Argument<E> errorType)
      Specified by:
      exchange in interface io.micronaut.http.client.HttpClient
    • retrieve

      public <I, O, E> org.reactivestreams.Publisher<O> retrieve(io.micronaut.http.HttpRequest<I> request, io.micronaut.core.type.Argument<O> bodyType, io.micronaut.core.type.Argument<E> errorType)
      Specified by:
      retrieve in interface io.micronaut.http.client.HttpClient
    • connect

      public <T extends AutoCloseable> org.reactivestreams.Publisher<T> connect(Class<T> clientEndpointType, io.micronaut.http.MutableHttpRequest<?> request)
      Specified by:
      connect in interface io.micronaut.websocket.WebSocketClient
    • connect

      public <T extends AutoCloseable> org.reactivestreams.Publisher<T> connect(Class<T> clientEndpointType, Map<String,Object> parameters)
      Specified by:
      connect in interface io.micronaut.websocket.WebSocketClient
    • close

      public void close()
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Specified by:
      close in interface io.micronaut.context.LifeCycle<io.micronaut.http.client.HttpClient>
      Specified by:
      close in interface io.micronaut.websocket.WebSocketClient
    • proxy

      public org.reactivestreams.Publisher<io.micronaut.http.MutableHttpResponse<?>> proxy(@NonNull io.micronaut.http.HttpRequest<?> request)
      Specified by:
      proxy in interface io.micronaut.http.client.ProxyHttpClient
    • proxy

      public org.reactivestreams.Publisher<io.micronaut.http.MutableHttpResponse<?>> proxy(@NonNull io.micronaut.http.HttpRequest<?> request, @NonNull @NonNull io.micronaut.http.client.ProxyRequestOptions options)
      Specified by:
      proxy in interface io.micronaut.http.client.ProxyHttpClient
    • resolveRequestURI

      protected <I> org.reactivestreams.Publisher<URI> resolveRequestURI(io.micronaut.http.HttpRequest<I> request)
      Type Parameters:
      I - The input type
      Parameters:
      request - The request
      Returns:
      A Publisher with the resolved URI
    • resolveRequestURI

      protected <I> org.reactivestreams.Publisher<URI> resolveRequestURI(io.micronaut.http.HttpRequest<I> request, boolean includeContextPath)
      Type Parameters:
      I - The input type
      Parameters:
      request - The request
      includeContextPath - Whether to prepend the client context path
      Returns:
      A Publisher with the resolved URI
    • resolveRedirectURI

      protected <I> org.reactivestreams.Publisher<URI> resolveRedirectURI(io.micronaut.http.HttpRequest<?> parentRequest, io.micronaut.http.HttpRequest<I> request)
      Type Parameters:
      I - The input type
      Parameters:
      parentRequest - The parent request
      request - The redirect location request
      Returns:
      A Publisher with the resolved URI
    • getLoadBalancerDiscriminator

      protected Object getLoadBalancerDiscriminator()
      Returns:
      The discriminator to use when selecting a server for the purposes of load balancing (defaults to null)
    • buildNettyRequest

      protected io.micronaut.http.client.netty.DefaultHttpClient.NettyRequestWriter buildNettyRequest(io.micronaut.http.MutableHttpRequest request, URI requestURI, io.micronaut.http.MediaType requestContentType, boolean permitsBody, @Nullable @Nullable io.micronaut.core.type.Argument<?> bodyType, Consumer<? super Throwable> onError) throws io.netty.handler.codec.http.multipart.HttpPostRequestEncoder.ErrorDataEncoderException
      Parameters:
      request - The request
      requestURI - The URI of the request
      requestContentType - The request content type
      permitsBody - Whether permits body
      bodyType - The body type
      onError - Called when the body publisher encounters an error
      Returns:
      A DefaultHttpClient.NettyRequestWriter
      Throws:
      io.netty.handler.codec.http.multipart.HttpPostRequestEncoder.ErrorDataEncoderException - if there is an encoder exception