Valeu, Rinaldo. Excelente explicação, cobriu bastante coisa. Por volta do instante 17:19 vc comenta sobre quão horrível é colocar o try-catch ali. Eu queria saber como seria uma forma mais elegante de lidar com esta situação. Será que se eu criasse um método separado e dentro dele tratar a exceção devolvendo um array de bytes vazio já seria suficiente? Seria algo assim: static byte[] convertToString(InputStream value) { try { return value.readAllBytes(); } catch (IOException e) { return new byte[0]; } } E usaria assim: client .sendAsync(request, BodyHandlers.ofInputStream()) .thenApply(HttpResponse::body) .thenApply(Application::convertToString);
@@rinaldodev trabalho como dev Back-End do Santander e temos que integrar com alguns fornecedores que utilizam essa camada de proteção, ensino e apoio meus devs na integração, mas seria legal ter um conteudo avançado e bem explicado que nem voce consegue fazer! para passar para eles!
Ola Rinaldo primeiramente muito obrigado pela ajuda...gostaria de saber uma coisa essa resposta em json eu consigo colocar ela dentro de atributos de uma classe
Fala, Pedro! Na verdade pode fazer o try-catch, só fica ruim a sintaxe assim, em linha. é melhor criar um método, ou bloco lambda, com esse conteúdo dentro e separado, aí você só chama ele aí nesse ponto.
Fantástico o vídeo, parabéns. Estou com uma dúvida, quando eu preciso usar alguns Headers, como Connection, Content-Length ele me retorna um erro, por exemplo: restricted header name: "Content-Length". Como resolver para usar esses cabeçalhos proibidos? Obrigado, abraço
Teoricamente esses headers não precisam ser aplicados manualmente pelo programador, e por isso são restritos. O cliente HTTP preenche esses headers com os valores corretos. Caso você ainda assim queira sobrescrever esse comportamento (e pode ter erros por conta disso), a partir do Java 12 foi criada uma propriedade que permite isso: jdk.httpclient.allowRestrictedHeaders Você pode definir a propriedade ao executar a aplicação ou programaticamente com: System.setProperty("jdk.httpclient.allowRestrictedHeaders", "Connection,Content-Length");
@@rinaldodev valeu pela resposta. O pior que precise setar mesmo esses headers :( Bom, nesse caso vou ter que testar numa versão mais nova do Java. Abraço!
Muito interessante e realmente é simples até pra quem ver de primeira vez. Achei interessante a introdução de abordagem de manipulação de arquivos, upload e download o que seria um conteúdo bacana de se fazer tendo que é algo mais incomum.
Ótima explicação Rinaldo. Porém essa nova api do http client me deixou na mão quando precisei de um multipart/form-data, precisei implementar na mão o body da requisição enquanto na lib da apache já vem tudo pronto. Achei uma falha gigante deixarem de fora isso, em pleno 2023 ter que reinventar a roda criando template do body na mão é inadmissível.
olhando para o passado, me desculpe o cheiro de naftalina, quando tentei fazer isso no java 7, recebo um erro de java.net.SocketException: Connection reset, em outros endPoint funciona com java 7, quando mudo para java 8 funciona tudo, sabe o que poderia ser do java 7 para o java 8?
Fala, Antônio! Não entendi, é quando vai fazer o que exatamente? Essa API que estou mostrando no vídeo começou no Java 9 e só foi oficializada no Java 11!
@@rinaldodev Usando o código postman , dentro do main(), executando client.newCall(request).execute(). No java 7, resultado Connection reset , só trocando para Java 8 funciona. Connection reset não sei o que tem no java 7 para retornar esse erro
Olá. Como se faz para fazer o submit de uma pagina de login/senha e pegar o conteúdo da proxima página de boas vindas dessa forma via código? Sei que existe o selenium e tal, mas é possível fazer isso com o HttpClient? Abraços
É possível fazer com HttpClient, porém páginas de autenticação sempre contém alguns mecanismos de segurança que tornam isso uma tarefa mais complexa. O ideal é inspecionar as requisições HTTP que são realizadas durante o login usando, por exemplo, o DevTools do Chrome. Depois de entender o fluxo, implentá-lo no HttpClient é mais fácil.
Excelente! Só estou tendo um problema, estou enviando um json no body para uma outra aplicação, eu tenho um arquivo cvs que trato no spark formatando ele para json, se o arquivo for pequeno vai de boa, mas se eu enviar uma massa grande (Que resulta em um mega json) da erro, Caused by: java.nio.channels.ClosedChannelException se puder da uma luz agradeço rs abraço!
@@rinaldodev não, estou usando o de String, a variável dataSetToJson é uma String, ta assim... HttpRequest request = HttpRequest.newBuilder() .POST(HttpRequest.BodyPublishers.ofString(dataSetToJson)) .uri(URI.create("localhost:8088/doc")) .headers("Accept", "application/json") .build(); HttpClient .newBuilder() .build() .send(request, HttpResponse.BodyHandlers.ofString());
Valeu, Rinaldo. Excelente explicação, cobriu bastante coisa.
Por volta do instante 17:19 vc comenta sobre quão horrível é colocar o try-catch ali. Eu queria saber como seria uma forma mais elegante de lidar com esta situação.
Será que se eu criasse um método separado e dentro dele tratar a exceção devolvendo um array de bytes vazio já seria suficiente? Seria algo assim:
static byte[] convertToString(InputStream value) {
try {
return value.readAllBytes();
} catch (IOException e) {
return new byte[0];
}
}
E usaria assim:
client
.sendAsync(request, BodyHandlers.ofInputStream())
.thenApply(HttpResponse::body)
.thenApply(Application::convertToString);
Fala, Wellington! Essa é uma opção boa. Pode estar em uma classe utilitária também, se você acabar fazendo isso demais.
@@rinaldodev Beleza, então. Muito obrigado pela resposta!
Feliz Natal! Poderia fazer um conteudo sobre SSL e Certificados!
Boa sugestão!
@@rinaldodev trabalho como dev Back-End do Santander e temos que integrar com alguns fornecedores que utilizam essa camada de proteção, ensino e apoio meus devs na integração, mas seria legal ter um conteudo avançado e bem explicado que nem voce consegue fazer! para passar para eles!
Show
Sensacional!
Ansiosa para o panorama java 12 à 19☺
Mais 1 inscrito, excelente conteudo!
Ola Rinaldo primeiramente muito obrigado pela ajuda...gostaria de saber uma coisa essa resposta em json eu consigo colocar ela dentro de atributos de uma classe
excelente
Valeu, Marcos!
Rinaldo, em 17:13 você diz que não é indicado colocar esse try catch, então, de que forma o tratamento dessa exceção deveria ser realizado?
Fala, Pedro! Na verdade pode fazer o try-catch, só fica ruim a sintaxe assim, em linha. é melhor criar um método, ou bloco lambda, com esse conteúdo dentro e separado, aí você só chama ele aí nesse ponto.
Fantástico o vídeo, parabéns.
Estou com uma dúvida, quando eu preciso usar alguns Headers, como Connection, Content-Length ele me retorna um erro, por exemplo: restricted header name: "Content-Length". Como resolver para usar esses cabeçalhos proibidos?
Obrigado, abraço
Teoricamente esses headers não precisam ser aplicados manualmente pelo programador, e por isso são restritos. O cliente HTTP preenche esses headers com os valores corretos.
Caso você ainda assim queira sobrescrever esse comportamento (e pode ter erros por conta disso), a partir do Java 12 foi criada uma propriedade que permite isso: jdk.httpclient.allowRestrictedHeaders
Você pode definir a propriedade ao executar a aplicação ou programaticamente com:
System.setProperty("jdk.httpclient.allowRestrictedHeaders", "Connection,Content-Length");
@@rinaldodev valeu pela resposta.
O pior que precise setar mesmo esses headers :(
Bom, nesse caso vou ter que testar numa versão mais nova do Java.
Abraço!
Que conteúdo bom! Muito obrigado pelos videos do seu canal, ajudam muito a aprender Java!
Valeu!
Muito interessante e realmente é simples até pra quem ver de primeira vez. Achei interessante a introdução de abordagem de manipulação de arquivos, upload e download o que seria um conteúdo bacana de se fazer tendo que é algo mais incomum.
E como fazer o retorno da API entrar como um objeto especifico (User, Product, etc)?
Video muito bom, brigadao Rinaldo por esse conteudo master sobre Java, estavamos precisando.
Boa, Paulo!
Como eu pego um valor específico do response? Se eu fizer uma requisição que retorna o nome do produto, como eu pego o valor do campo "nome"?
Muito bom
Valeu, Daniel!
Cara muito obrigado pelo video, muito bom ser membro do seu Canal !!!
Valeu, Renato! Que bom que curtiu!
Ótima explicação Rinaldo. Porém essa nova api do http client me deixou na mão quando precisei de um multipart/form-data, precisei implementar na mão o body da requisição enquanto na lib da apache já vem tudo pronto. Achei uma falha gigante deixarem de fora isso, em pleno 2023 ter que reinventar a roda criando template do body na mão é inadmissível.
Parabéns Rinaldo!
Tenho aprendido muito contigo!
Você tem algum video ou se você poderia fazer um video sobre request em APIs SOAP ?
Valeu! Vou deixar anotada a sugestão, mas não tenho previsão. :)
olhando para o passado, me desculpe o cheiro de naftalina, quando tentei fazer isso no java 7, recebo um erro de java.net.SocketException: Connection reset, em outros endPoint funciona com java 7, quando mudo para java 8 funciona tudo, sabe o que poderia ser do java 7 para o java 8?
Fala, Antônio! Não entendi, é quando vai fazer o que exatamente?
Essa API que estou mostrando no vídeo começou no Java 9 e só foi oficializada no Java 11!
@@rinaldodev Usando o código postman , dentro do main(), executando client.newCall(request).execute().
No java 7, resultado Connection reset , só trocando para Java 8 funciona.
Connection reset não sei o que tem no java 7 para retornar esse erro
como envio o token de uma api que exige autenticação?
Up
Olá. Como se faz para fazer o submit de uma pagina de login/senha e pegar o conteúdo da proxima página de boas vindas dessa forma via código? Sei que existe o selenium e tal, mas é possível fazer isso com o HttpClient? Abraços
É possível fazer com HttpClient, porém páginas de autenticação sempre contém alguns mecanismos de segurança que tornam isso uma tarefa mais complexa. O ideal é inspecionar as requisições HTTP que são realizadas durante o login usando, por exemplo, o DevTools do Chrome. Depois de entender o fluxo, implentá-lo no HttpClient é mais fácil.
@@rinaldodev Bacana, eu varei a internet para ver algo e não encontrei, se possível vc poderia postar algum exemplo? Obrigado!
Excelente!
Só estou tendo um problema, estou enviando um json no body para uma outra aplicação, eu tenho um arquivo cvs que trato no spark formatando ele para json, se o arquivo for pequeno vai de boa, mas se eu enviar uma massa grande (Que resulta em um mega json) da erro, Caused by: java.nio.channels.ClosedChannelException se puder da uma luz agradeço rs abraço!
Tá usando BodyPublisher de InputStream?
@@rinaldodev não, estou usando o de String, a variável dataSetToJson é uma String, ta assim...
HttpRequest request = HttpRequest.newBuilder()
.POST(HttpRequest.BodyPublishers.ofString(dataSetToJson))
.uri(URI.create("localhost:8088/doc"))
.headers("Accept", "application/json")
.build();
HttpClient
.newBuilder()
.build()
.send(request, HttpResponse.BodyHandlers.ofString());