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 

は、ソースコードである:あなたがEntityUtils#consume(HttpEntity)を呼び出すと

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

、あなたは完全に応答の内容を消費し、基になるストリームを閉じています。しかし、コードでアクセス可能な変数に実際にレスポンスデータを読み込んだわけではありません。そのため、レスポンスデータを見る機会がなくなりました。

代わりに、応答データを取得するメソッドの1つを呼び出します。このオプションには、応答本体にInputStreamまたはEntityUtils#toString(HttpEntity, Charset)としてアクセスするためのHttpEntity#getContent()が含まれ、応答本体全体をStringとして読み取ることができます。 (後者の場合は、応答本体全体を一度にStringとして読むことは、応答本体が大きければプロセスのメモリフットプリントに影響を与えることに注意してください)。いずれか1つを呼び出した後、取得したコンテンツをJSONパーサー"token"を取得するための選択肢です。

完了したら、EntityUtils#consume(HttpEntity)に電話して、エンティティによってカプセル化されたすべての基本リソース(ストリームなど)のクリーンアップを保証することをお勧めします。

関連する問題