web-dev-qa-db-fra.com

Comment gérer les cookies avec Apache HttpClient 4.3

J'ai besoin d'implémenter une série de requêtes HTTP en Java et j'ai décidé d'utiliser Apaches HttpClient dans la version 4.3 (la plus récente).

Le problème est que toutes ces demandes utilisent un cookie pour la gestion de session et je semble incapable de trouver un moyen d'accéder à ce cookie et de le transmettre de demande en demande. Mes commandes en utilisant curl ressemblent à quelque chose comme:

# Login
curl -c cookies -d "UserName=username&Password=password" "https://example.com/Login"

# Upload a file
curl -b cookies -F fileUpload=@IMG_0013.JPG "https://example.com/File"

# Get results of server processing file
curl -b cookies "https://example.com/File/1234/Content"

Ils fonctionnent parfaitement. Cependant, avec HttpClient, cela ne semble pas fonctionner. J'ai essayé:

    URI serverAddress = new URI("https://example.com/");

    URI loginUri = UriBuilder.fromUri(serverAddress).segment("Login").queryParam("UserName", "username")
            .queryParam("Password", "password").build();

    RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.BEST_MATCH).build();
    CookieStore cookieStore = new BasicCookieStore();
    HttpClientContext context = HttpClientContext.create();
    context.setCookieStore(cookieStore);

    CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(globalConfig).setDefaultCookieStore(cookieStore).build();
    HttpGet httpGet = new HttpGet(loginUri);
    CloseableHttpResponse loginResponse = httpClient.execute(httpGet,context);

    System.out.println(context.getCookieStore().getCookies());

La sortie de la dernière ligne est toujours une liste vide. Je pense qu'il devrait contenir mon cookie, ai-je raison?

Quelqu'un peut-il me donner un petit exemple sur la façon de gérer le cookie à l'aide d'Apache HttpClient 4.3?

Merci

23
ali

Votre code me semble correct (à part le fait de ne pas libérer de ressources, mais je suppose que la gestion des exceptions a été omise par souci de concision). La raison pour laquelle le magasin de cookies est vide peut être une violation de la politique de cookies réelle (qui est BEST_MATCH dans votre cas) par le serveur cible. Ainsi, les cookies envoyés par le serveur sont rejetés comme non valides. Vous pouvez savoir si c'est le cas (et d'autres détails contextuels utiles) en activant la journalisation contextuelle/câblée comme décrit ici

8
ok2c