1

我有以下实现从表单身份验证获取令牌。如何在java中获取令牌

预期输出如下:

​​

然而,当我跑我的实现,我得到如下。在响应对象中,我没有看到token。我不是Java的专家,我想知道我错过了什么。

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 

这里是源代码:

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()); 
} 

回答

2

当调用EntityUtils#consume(HttpEntity),你完全消耗响应的内容和关闭基础流。但是,您实际上没有将响应数据读入您的代码可访问的任何变量中,因此您再也没有机会查看它了。

相反,请调用其中一种获取响应数据的方法。对此的选项包括HttpEntity#getContent()以访问响应主体作为原始InputStreamEntityUtils#toString(HttpEntity, Charset)以读取整个响应主体为String。 (在后一种情况下,请注意,如果响应主体很大,立即读取整个响应主体为String将影响进程的内存占用量。)调用其中一个之后,可以通过JSON解析器传递检索到的内容选择检索"token"

完成之后,调用EntityUtils#consume(HttpEntity)以保证清除由实体封装的任何底层资源(如流)仍然是一个好习惯。

相关问题