CodeGym /Cursos Java /Módulo 3 /Adicionando corpo ao HttpRequest

Adicionando corpo ao HttpRequest

Módulo 3
Nível 10 , Lição 2
Disponível

3.1 Editores Corporais

Espero que você não tenha esquecido que além das requisições GET , existem também as requisições PUT e POST , quando você também precisa adicionar à requisição request body, ou seja, o corpo da requisição.

HttpRequestA classe tem uma classe interna especial para isso BodyPublisher. Embora seja tecnicamente uma interface que possui múltiplas implementações, que discutiremos a seguir

E começaremos com o mais simples - a ausência de um corpo de solicitação. Sim, isso acontece.


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .POST(HttpRequest.BodyPublishers.noBody())
   .build();

Simples e bonito.

3.2 deString()

A segunda opção mais comum é passar alguma string como corpo da solicitação. Isso é feito de forma muito simples:


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "text/plain;charset=UTF-8")
   .POST(HttpRequest.BodyPublishers.ofString("Hello"))
   .build();

A propósito, você pode definir a codificação da string transmitida. Pode ser muito útil se o servidor http para o qual a solicitação é enviada não funcionar em UTF8.


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .POST(HttpRequest.BodyPublishers.ofString("Hello", Charset. US-ASCII)))
   .build();

3.3 deArquivo()

Por fim, você pode querer anexar um arquivo à solicitação POST . É assim que seus avatares geralmente são carregados no servidor. Para fazer isso, você precisa chamar o método ofFile(), para onde transferir Patho arquivo local:


Path avatar = Path.of("c://avatar.jpeg");
 
HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "image/jpeg")
   .POST(HttpRequest.BodyPublishers.ofFile(avatar))
   .build();

3.4 ofByteArray()

Outro cenário comum é enviar um conjunto de bytes para o servidor. Por exemplo, você serializou algum objeto como um conjunto de bytes, criptografou algo ou apenas deseja enviar algum buffer de dados. Isso requer um método .ofByteArray().

Esse método usa uma matriz de bytes como parâmetro. Exemplo:


byte[] data = "My Secret Message".getBytes();
byte[] dataEncripted = SuperEncriptor.encript(data);
 
HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "application/octet-stream")
   .POST(HttpRequest.BodyPublishers.ofByteArray(dataEncripted))
   .build();

3.5 deInputStream()

Por fim, o último, mas não menos interessante, cenário é anexar InputStreama uma solicitação POST .

Existe uma função especial para isso ofInputStream(). E ela é muito esperta. Ele permite que você organize a transferência de dados de fluxo para fluxo, anexe um fluxo de dados a uma solicitação de PDV que ainda não foi aberta.

Você precisa passar uma função para a função ofInputStream(), que retornará um fluxo como resultado InputStream.

Exemplo:


byte[] data = "My Secret Message".getBytes();
//wrapping an array of bytes into a stream.
InputStream is = new ByteArrayInputStream(data);
 
HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "application/octet-stream")
   .POST(HttpRequest.BodyPublishers.ofInputStream (() -> is;))
   .build();

Não me preocupei em cercar o jardim aqui, mas acho que você entende o princípio. Por que eles fizeram isso? Você quase sempre pode usar o arquivo ofByteArray(). Mas se você deseja enviar dados de forma assíncrona ou precisa implementar algum cenário particularmente complexo, pode usar este método.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION