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.
HttpRequest
A 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 Path
o 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 InputStream
a 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.
GO TO FULL VERSION