1

J'ai l'implémentation suivante pour obtenir un jeton à partir de l'authentification de formulaire.Comment obtenir un jeton dans java

Le résultat attendu est la suivante:

enter image description here

Cependant, quand je lance mon application, je reçois comme suit. Dans l'objet de réponse, je ne vois pas token. Je ne suis pas un expert en Java, je me demande ce qui me manque.

Login form get: HTTP/1.1 200 OK 
response: HttpResponseProxy{HTTP/1.1 200 OK [Cache-Control: max-age=0, Content-Type: application/json, Date: Fri, 04 Aug 2017 21:05:04 GMT, transaction_id: 729097fd-69ac-b813-26c7-015daf10ddfd, X-Powered-By: Express, Content-Length: 684, Connection: keep-alive] ResponseEntityProxy{[Content-Type: application/json,Content-Length: 684,Chunked: false]}} 
Post logon cookies: 
None 

Voici le code source:

BasicCookieStore cookieStore = new BasicCookieStore(); 
CloseableHttpClient httpclient = HttpClients.custom() 
      .setDefaultCookieStore(cookieStore) 
      .build(); 

HttpHost proxy = new HttpHost("xxx.xxx.xxx.com", 80, "http"); 
RequestConfig config = RequestConfig.custom() 
     .setProxy(proxy) 
     .build(); 

HttpUriRequest login = RequestBuilder.post() 
    .setUri(new URI("https://api.xxx.com:443/tokens")) 
    .addParameter("username", "stackoverflow") 
    .addParameter("password", "isbest!") 
    .setConfig(config) 
    .build(); 

CloseableHttpResponse response2 = httpclient.execute(login); 
HttpEntity entity = response2.getEntity(); 
System.out.println("Login form get: " + response2.getStatusLine()); 

EntityUtils.consume(entity); 
System.out.println("response: " + response2); 

System.out.println("Post logon cookies:"); 
List<Cookie> cookies = cookieStore.getCookies(); 
if (cookies.isEmpty()) { 
    System.out.println("None"); 
} else { 
    for (int i = 0; i < cookies.size(); i++) { 
    System.out.println("- " + cookies.get(i).toString()); 
} 

Répondre

2

Lorsque vous appelez EntityUtils#consume(HttpEntity), vous consommez pleinement le contenu de la réponse et la fermeture du flux sous-jacent. Cependant, vous n'avez pas réellement lu les données de réponse dans une variable accessible par votre code, vous n'avez donc plus aucune possibilité de les consulter.

Appelez plutôt l'une des méthodes qui récupère les données de réponse. Les options pour cela incluent HttpEntity#getContent() pour accéder au corps de la réponse en tant que InputStream ou EntityUtils#toString(HttpEntity, Charset) brut pour lire le corps entier de la réponse en tant que String. (Dans ce dernier cas, sachez que lire tout le corps de la réponse en tant que String aura un impact sur l'empreinte mémoire de votre processus si le corps de la réponse est grand.) Après avoir appelé l'un d'entre eux, vous pouvez transmettre le contenu récupéré via votre analyseur JSON de choix pour récupérer le "token".

Une fois que vous avez terminé, il est toujours recommandé d'appeler le EntityUtils#consume(HttpEntity) pour garantir le nettoyage des ressources sous-jacentes encapsulées par l'entité, telles que les flux.