1

Cookie を HttpClient に設定するのに役立ちます

外部 Web サービスにログインするプログラムを作成しました。ただし、HTTP GET から重要な情報を取得するために、(ログインから生成された) Cookie を渡すことができません。

public class ClientHelper {
    private final static String PROFILE_URL = 
                               "http://externalservice/api/profile.json";
    private final static String LOGIN_URL = "http://externalservice/api/login";

    public static Cookie login(final String username, final String password) {
        DefaultHttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(LOGIN_URL);
        HttpContext localContext = new BasicHttpContext();
        client.getParams().setParameter("http.useragent", "Custom Browser");
        client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, 
                                        HttpVersion.HTTP_1_1);
        List<Cookie> cookies = null;
        BasicClientCookie cookie = null;

        try {
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
            nameValuePairs.add(new BasicNameValuePair("user", username));
            nameValuePairs.add(new BasicNameValuePair("passwd", password));
            UrlEncodedFormEntity entity = 
                    new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8);
            entity.setContentType("application/x-www-form-urlencoded");

            post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = client.execute(post, localContext);
            cookies = client.getCookieStore().getCookies();
            System.out.println(cookies.get(1));

            cookie = new BasicClientCookie(cookies.get(1).getName(), cookies.get(1).getValue());
            cookie.setVersion(cookies.get(1).getVersion());
            cookie.setDomain(cookies.get(1).getDomain());
            cookie.setExpiryDate(cookies.get(1).getExpiryDate());
            cookie.setPath(cookies.get(1).getPath());               
            BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

            String line = "";
            while ((line = rd.readLine()) != null) {
                System.out.println(line);
            }
        } 
        catch (Throwable e) {
            e.printStackTrace();
        }
        return cookie;
   }

   public static void getProfile(Cookie cookie) {
      DefaultHttpClient client = new DefaultHttpClient();
      HttpContext context = new BasicHttpContext();
      CookieStore cookieStore = new BasicCookieStore();
      cookieStore.addCookie(cookie);
      client.setCookieStore(cookieStore);
      context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
      HttpGet get = new HttpGet(PROFILE_URL);
      HttpResponse response;

      try {
          response = client.execute(get, context);
          BufferedReader rd = 
             new BufferedReader(
                    new InputStreamReader(response.getEntity().getContent()));

          String line = "";
          while ((line = rd.readLine()) != null) {
              System.out.println(line);
          }
       } 
       catch (ClientProtocolException e) {
           e.printStackTrace();
       } 
       catch (IOException e) {
           e.printStackTrace();
       }
   }
}

App.java (ClientHelper を使用するクラス):

public class App {
   private static final String USER = "myusername";
   private static final String PASSWD = "mypassword";

   public static void main(String[] args) {
       Cookie cookie = ClientHelper.login(USER, PASSWD);
       ClientHelper.getProfile(cookie);
   }
}

アプリを実行すると、ログインできます (生成された JSON が表示されます) が、getProfile() メソッドは空の JSON オブジェクトを返します。

 {}

コマンドラインからcurlを使用して、これをエミュレートしようとしています:

curl -b Cookie.txt http://externalservice/api/profile.json

これは実際には機能しますが、私の Java プログラムでは機能しません。

4

3 に答える 3

1

コードのこの部分を実行してみてください。

List<Cookie> cookies = client.getCookieStore().getCookies();
        for (Cookie cookie : cookies) {
             singleCookie = cookie;
        }

 HttpResponse response = client.execute(post, localContext);
于 2013-02-22T08:22:29.257 に答える
1

私はそれを理解しました...同じものを使用する代わりに、2つの異なるHTTPクライアントを作成していました。

@Brian Roach と Raunak Agarwal は、助けてくれてありがとう!

修正は次のとおりです。

public static HttpClient login(final String username, final String password) 
{
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost(LOGIN_URL);
    client.getParams().setParameter("http.useragent", "Custom Browser");
    client.getParams().setParameter(
             CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

    try 
    {
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
        nameValuePairs.add(new BasicNameValuePair("user", username));
        nameValuePairs.add(new BasicNameValuePair("passwd", password));
        UrlEncodedFormEntity entity = 
              new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8);
        entity.setContentType("application/x-www-form-urlencoded");

        post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = client.execute(post);

        BufferedReader reader = 
              new BufferedReader(
              new InputStreamReader(response.getEntity().getContent()));

        String line = "";
        while ((line = reader.readLine()) != null) 
        {
            System.out.println(line);
        }
    } 
    catch (Throwable e) { e.printStackTrace(); }
    return client;
}

public static void getProfile(HttpClient client) 
{
    HttpGet get = new HttpGet(PROFILE_URL);
    HttpResponse response;
    try 
    {
        response = client.execute(get);
        BufferedReader reader = 
               new BufferedReader(
               new InputStreamReader(response.getEntity().getContent()));

        String line = "";
        while ((line = reader.readLine()) != null) 
        {
            System.out.println(line);
        }
    } 
    catch (ClientProtocolException e) { e.printStackTrace(); } 
    catch (IOException e) { e.printStackTrace(); }  
}
于 2013-02-25T01:04:15.397 に答える