如何使用Apache HttpClient 4.3处理Cookies

24

我需要在Java中实现一系列HTTP请求,并决定使用Apaches HttpClient 4.3版本(最新版本)。

问题是所有这些请求都使用cookie进行会话管理,但我似乎找不到一种方法来访问并传递从一个请求到另一个请求的cookie。我的curl命令大致如下:

# 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"

它们工作得非常好。但是使用HttpClient似乎不起作用。我尝试过的是:

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

最后一行的输出始终是一个空列表。我认为它应该包含我的Cookie,我对吗?

有人能给我一个使用Apache HttpClient 4.3处理cookie的小例子吗?

谢谢


UriBuilder是什么?在Apache Commons中,我看到了URIBuilder(大写的R和I)。 - Line
这是6年前的事了。我已经不记得当时用这个做什么了。如果URIBuilder对你有用,就直接使用它吧。 - ali
可能是指javax.ws.rs.core.UriBuilder - eltabo
1个回答

8

除了没有释放资源(但我认为出于简洁起见省略了异常处理),您的代码看起来还不错。cookie存储为空的原因可能是目标服务器违反了实际的cookie策略(在您的情况下是BEST_MATCH)。因此,服务器发送的cookie被拒绝为无效。您可以通过按这里所述打开上下文/线路记录来找出是否存在这种情况(以及其他有用的上下文详细信息)。


1
谢谢。那非常有帮助。我想我已经发现了凭据实际上是使用POST请求和POST参数传输的。 - ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接