我正在学习如何使用HP Quality Center的REST api来查询和操作数据。与REST标准不同,此API不是完全无状态的。它使用cookie来存储身份验证会话。
我尝试使用Jersey Client库实现一个非常简单的测试。我可以通过发送凭据成功验证我的用户身份。 API参考声称这将设置一个cookie,我很高兴进一步调用REST api。但是,一个简单的“已验证”调用将返回401,验证失败。
我感觉cookie编写或阅读工作不正常,因为其他一切似乎都应该正常工作。但是,当没有涉及浏览器时,我无法确定是否或如何设置和读取cookie。那么当从Java VM调用cookie设置REST服务时,cookie如何工作?它有用吗?它们存放在哪里?
我正在使用Eclipse Kepler作为我的IDE,如果这很重要,那么32位java 1.6 JDK和JRE。
以下代码和响应字符串:
1。登录:
Client client = ClientBuilder.newClient();
Response response = client
.target("http://[host]:[port]").path("qcbin/authentication-
point/alm-authenticate")
.request().post(Entity.entity("<alm-authentication>
<user>username</user>
<password>secret</password></alm-authentication>",
MediaType.TEXT_XML_TYPE));
System.out.println(response.toString());
输出:
InboundJaxrsResponse{ClientResponse{method=POST,
uri=http://[host]:[port]/qcbin/authentication-point/alm-authenticate,
status=200, reason=OK}}
API返回说明:
其中一个:
HTTP代码200并设置LWSSO cookie(LWSSO_COOKIE_KEY)。
用于未经身份验证的请求的HTTP代码401。发送标题 WWW-Authenticate:ALMAUTH
的 2。验证已登录:
response = client.target("http://[host]:[port]")
.path("qcbin/rest/is-authenticated")
.request().get();
System.out.println(response.toString());
输出:
InboundJaxrsResponse{ClientResponse{method=GET,
uri=http://[host]:[port]/rest/is-authenticated, status=401,
reason=Authentication failed. Browser based integrations - to login append
'?login-form-required=y to the url you tried to access.}}
PS:将?login-form-required=y
添加到网址,会在浏览器中调用时显示登录窗口,但不在此处。将该行附加到URL实际上仍会提供相同的错误消息,并建议再次附加它。此外,在浏览器中调用时,即使没有登录表单,is-authenticated也会返回200,即使没有登录表单。
答案 0 :(得分:1)
当您登录时,您将获得一个名称加值的cookie。
REST服务器希望您在请求标头中将其与您发出的每个请求一起传递。
查看client.request()
获得的对象;应该有一种方法来指定要发送到服务器的其他标头。标头名称必须为Cookie
,标头值必须为name=value
。
因此,如果服务器使用名为sessionID
且值为1234
的Cookie进行响应,那么您需要以下内容:
client.request().header("Cookie", "sessionID=1234")
相关: