如何在 java 中获取令牌
How to get token in 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", "Whosebug")
.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());
}
当您调用 EntityUtils#consume(HttpEntity)
时,您将完全使用响应的内容并关闭基础流。但是,您实际上并没有将响应数据读入您的代码可访问的任何变量,因此您不再有任何机会查看它。
而是调用获取响应数据的方法之一。此选项包括 HttpEntity#getContent()
to access the response body as a raw InputStream
or EntityUtils#toString(HttpEntity, Charset)
将整个响应正文读取为 String
。 (在后一种情况下,请注意,如果响应主体很大,将整个响应主体作为 String
一次读取会影响进程的内存占用。)调用其中任何一个后,您可以传递检索到的内容通过您选择的 JSON 解析器检索 "token"
.
完成所有操作后,调用 EntityUtils#consume(HttpEntity)
以保证清除实体封装的任何底层资源(例如流)仍然是一个好习惯。
我有以下实现从表单身份验证中获取令牌。
预期输出如下:
但是,当我 运行 我的实施时,我得到如下结果。在响应对象中,我没有看到 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", "Whosebug")
.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());
}
当您调用 EntityUtils#consume(HttpEntity)
时,您将完全使用响应的内容并关闭基础流。但是,您实际上并没有将响应数据读入您的代码可访问的任何变量,因此您不再有任何机会查看它。
而是调用获取响应数据的方法之一。此选项包括 HttpEntity#getContent()
to access the response body as a raw InputStream
or EntityUtils#toString(HttpEntity, Charset)
将整个响应正文读取为 String
。 (在后一种情况下,请注意,如果响应主体很大,将整个响应主体作为 String
一次读取会影响进程的内存占用。)调用其中任何一个后,您可以传递检索到的内容通过您选择的 JSON 解析器检索 "token"
.
完成所有操作后,调用 EntityUtils#consume(HttpEntity)
以保证清除实体封装的任何底层资源(例如流)仍然是一个好习惯。