java-restify
2.x
2.x
  • Visão geral
  • Início
    • Instalação
    • Início rápido
  • Anotações
    • Anotações padrão
    • Extensões
      • JAX-RS
      • Spring Framework
  • Tipos de conteúdo
    • Serialização e deserialização
    • Formatos
      • wildcard
      • application/json
        • Jackson
        • Gson
        • JSON-B
        • JSON-P
      • application/xml
        • JAX-B
      • application/x-www-form-urlencoded
        • Map
        • Parameters
        • @Form
      • multipart/form-data
        • MultipartFile
        • Map
        • MultipartParameters
        • @MultipartForm
      • text/plain
      • text/html
      • application/octet-stream
  • Tipos de retorno de método
    • Visão geral
    • Objetos suportados
    • Extensões
      • Guava
      • Jsoup
      • Frameworks reativos
      • Vavr
      • Spring Framework
  • Requisições assíncronas
    • Visão geral
    • Extensões
      • Apache Async HTTP Client
      • OkHtp
      • Netty
  • Programação reativa
    • Frameworks suportados
      • RxJava (1.x)
      • RxJava (2.x)
      • Project Reactor
  • Manipulação de erros
    • Manipulação de erros
  • Retry
    • Retry
  • Clientes HTTP
    • Visão geral
      • Requisições assíncronas
    • Extensões
      • Jersey HTTP Client
      • Apache HTTP Client
      • Apache Async HTTP Client
      • OkHtp
      • Netty
  • Netflix OSS
    • Hystrix
    • Ribbon
  • Spring Framework
    • Anotações
    • Retornos de método
    • RestTemplate
    • Spring Boot
  • Autenticação
    • Basic
    • OAuth 2
  • Lista de artefatos
    • Artefatos
Powered by GitBook
On this page
  • Visão geral
  • Client HTTP padrão
  • Buffer request body e streaming mode

Was this helpful?

  1. Clientes HTTP

Visão geral

PreviousRetryNextRequisições assíncronas

Last updated 6 years ago

Was this helpful?

Visão geral

Os objetos que realizam uma requisição HTTP são representados por duas interfaces: EndpointRequestExecutor, que recebe uma requisição construída a partir dos anotações do método e retorna uma resposta completa (com status code, cabeçalhos e corpo); e HttpClientRequestFactory, uma fábrica cuja implementação constrói efetivamente a requisição HTTP propriamente dita, utilizando algum framework, bibiloteca ou conjunto de objetos especializados.

A implementação padrão do EndpointRequestExecutor é responsável pelo processo de serialização/deserialização, e delega a construção da requisição para alguma implementação de HttpClientRequestFactory. Essa composição é bastante flexível pois permite variar entre as várias bibliotecas HTTP suportadas (que são implementações de HttpClientRequestFactory).

Client HTTP padrão

Por padrão, o java-restify utiliza apenas recursos disponíveis na API padrão do Java, e isso também é válido para o client HTTP. A implementação padrão do HttpClientRequestFactory utiliza o .

Esse objeto não possui nenhum suporte especial para requisições assíncronas, portanto, conforme detalhado na , a requisição apenas será realizada em outra thread.

O RestifyProxyBuilder possui algumas opções de configurações que se aplicam somente à implementação padrão:

MyApi myApi = new RestifyProxyBuilder()
    .client()
        .charset() //charset padrão para requisições e respostas (padrão é UTF-8)
        .connectionTimeout(Duration.ofMillis(1000)) // timeout da conexão (padrão é 0 = infinito)
        .readTimeout(Duration.ofMillis(1000)) // timeout de leitura da resposta (padrão é 0 = infinito)
        .followRedirects() // configuração de follow redirects
            .disabled() // padrão é enabled
        .useCaches() // configuração de uso de caches
            .disabled() // padrão é enabled
        .proxy(Proxy.NO_PROXY) // configuração de proxy (padrão é nenhum)
        .ssl() // configurações de ssl (utilizadas apenas se forem configuradas)
            .hostnameVerifier(...)
            .sslSocketFactory(...)
        .and()
    .target(MyApi.class)
        .build();

Buffer request body e streaming mode

Duas configurações que merecem uma explicação em particular são:

MyApi myApi = new RestifyProxyBuilder()
    .client()
        .bufferRequestBody()
            .enabled()
        .outputStreaming()
            .enabled()
            .chunkSize(1024)
            .and()
        .and()
    .target(MyApi.class)
        .build();

Essa estratégia é mais simples e eficiente para requisições com conteúdo relativamente menores, mas pode ser problemática para envio de grandes arquivos, ou payloads de tamanho maior. Nesse cenário, escrever o conteúdo em chunks (ou definindo o tamanho do conteúdo, caso seja conhecido) pode ser mais eficiente.

Se bufferRequestBody for desabilitado, nenhum buffer intermediário do conteúdo será realizado e os dados serão escritos diretamente na conexão HTTP. Para melhorar o desempenho, o ideal é que outros parâmetros relativos ao tamanho do conteúdo estejam adequadamente configurados. Assumindo que bufferRequestBody está desabilitado e outputStreaming está habilitado:

Por padrão as duas configurações acima (bufferRequestBody e outputStreaming) são habilitadas. Quando bufferRequestBody é habilitado, o conteúdo do corpo da requisição é bufferizado em memória (antes de ser enviado); e se outputStreaming também estiver habilitado (sim, por padrão) o tamanho do corpo é explicitamente definido usando o método . Isso permite que o HttpUrlConnection escreva na conexão HTTP sem bufferizar novamente o conteúdo.

se o cabeçalho Content-Length estiver preenchido, assume-se que o tamanho do conteúdo é pré-conhecido e é definido usando o método

se o cabeçalho Content-Length não estiver preenchido, assume-se que o tamanho do conteúdo não é conhecido, e o envio de dados será feito usando . O tamanho do chunk será o tamanho em bytes definido na configuração outputStreaming().chunkSize() (o tamanho padrão é 4kb).

HttpUrlConnection
documentação sobre requisições assíncronas
setFixedLengthStreamingMode
setFixedLengthStreamingMode
chunk transfer encoding