Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Obtendo TOKEN de um servidor REST com Java

Olá!

Tenho pesquisado bastante e ainda não achei um bom material para elucidar minhas dúvidas em relação a como trabalhar com serviços REST que que utilizam autenticação oauth2 e fornecem tokens. Existem muitos exemplos de como se implementar oauth2 e seus tokens, (servidor) mas não achei nenhum satisfatório para usar esses tokens (cliente). Na empresa onde eu trabalho existe uma aplicação, proprietária, que fornece o token (mediante senha e logon), eu sei como obter esse token através do curl, e de posse desse eu uso o postman para executar as consultas normalmente, mas não consegui fazer isso pelo java... Há alguma framework especial para isso? eu pesquisei e cheguei no oltu da Apache, mas sinceramente não tenho certeza se é a melhor forma. Alguém sabe mais sobre esse assunto ou pode me indicar algum livro, curso ou um bom material on-line?

Agradeço desde já!

5 respostas

Oi Welington, tudo bem? Da mesma forma que faz uma requisição com o CURL e recebe uma resposta, você pode fazer no Java. No caso, você recebe a resposta do servidor e nela você encontra o token, não é isso?

Acho que não tenho mesmo um curso para te indicar diretamente.

Você pode fazer isso de várias formas, usando classes nativas do Java ou alguma biblioteca.

Olha esse post que mostra como fazer uma requisição com Java (Inglês) : https://www.baeldung.com/java-http-request

Oi Wanderson! Obrigado pela resposta, eu havia até me esquecido de olhar aqui!

O que eu quero é construir uma requisição colocando o token que já tenho para, ai sim, pegar os dados do servidor.

Vou dar uma olhada no material do link, muito obrigado!

Hm, não deixe de me dar um feedback aqui se foi útil ou não.

solução!

Oi Wanderson!

Mais uma vez, obrigado pela resposta, eu segui o link que você me mandou, deu algumas ideias, mas ao ler o artigo eu já dei de cara com as limitações da biblioteca : "The disadvantages of using this method are that the code can be more cumbersome than other HTTP libraries, and it does not provide more advanced functionalities such as dedicated methods for adding headers or authentication."

Como eu acredito que o token deve ser enviado pelo header (cheguei nessa conclusão observando o postman) eu procurei uma biblioteca similar (aliás, uma das minhas maiores dúvidas era qual biblioteca usar, são muitas!) e escolhi a Apache HttpClient peguei um exemplo no https://www.mkyong.com/java/how-to-send-http-request-getpost-in-java/ e consegui o que queria, abaixo segue o esqueleto do código, óbvio precisa refatorar, não tem nada demais ai, apenas utilizei a biblioteca mencionada, atribui o token no cabeçalho, fiz a consulta e imprimi. Simples demais para muitos até, mas eu estava travado nisso por não ter costume de trabalhar diretamente com chamadas http:

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StringReader; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set;

import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.commons.codec.binary.Base64; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.ParseException; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import org.json.simple.parser.JSONParser; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.InputSource;

public class ConexaoApacheHttpClientTeste {

public static void main(String[] args) {
    consulta();
}

public static void consulta() {
    HttpClient client=new DefaultHttpClient();
    String url="http://xxx.xxx.xxx.xxx:8080/endereco/";
    HttpGet request=new HttpGet(url);

    request.addHeader("Authorization", "Bearer "+token);
    HttpParams params=new BasicHttpParams();
    params.setParameter("parametro_para_o_REST", "valor");
    request.setParams(params);

    try {
        HttpResponse response=client.execute(request);
        System.out.println("Enviando GET request para a url "+url);
        System.out.println("Código de resposta :"+response.getStatusLine().getStatusCode());

        BufferedReader brd=new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        StringBuffer result = new StringBuffer();
        String line="";
        while ((line=brd.readLine())!=null) {
            result.append(line);
        }
        System.out.println("==================Resultado==================");
        System.out.println(result.toString());
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

Opa Welington, parabéns então :)

Fico feliz que tenha dado tudo certo no final. Bons estudos.