提问者:小点点

ConfluenceRESTAPI调用总是返回404-未找到(身份验证问题?)


编辑:好的,我发现这绝对是一个身份验证问题:这个简短的Python脚本做得很好:

import requests
from requests.auth import HTTPBasicAuth

URL = "https://wiki.myCompany.corp/confluence-dev/rest/api/content/180158489";

r = requests.get(URL, auth = HTTPBasicAuth('myUser', 'myPass'), verify=False)
r.raise_for_status()
print(r.json())

为什么它对Java不起作用??

初步问题:

我试图使用Apache httpclient/httpcore编写一个简单的Http请求来获取Confluence页面的内容,但我得到的只是状态404。

这是我的代码:

String url = "https://wiki.mycompany.corp/confluence-dev/rest/api/content/180158489";
HttpHost proxy = new HttpHost("proxy.myCompany.at", 57165);

DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
CredentialsProvider provider = new BasicCredentialsProvider();
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("myUsername", "myPassword");

provider.setCredentials(AuthScope.ANY, credentials);

HttpClientBuilder builder = HttpClientBuilder.create();
builder.setDefaultCredentialsProvider(provider);
builder.setRoutePlanner(routePlanner);

HttpClient client = builder.build();
HttpGet get = new HttpGet(url); 

HttpResponse r = client.execute(get);
System.out.println(r.getStatusLine().toString());

输出:HTTP/1.1 404未找到

当我在浏览器中打开URL时,只要我登录,我就会得到正确的合流JSON。当我注销并尝试在浏览器中打开该URL时,我会得到一个JSON

{
"statusCode":404,
"data":
{
"authorized":false,
"valid":true,
"allowedInReadOnlyMode":true,
"errors":[],"successful":false
},
"message":"No content found with id: ContentId{id=180158489}",
"reason":"Not Found"
}

所以对我来说,这看起来像是不知何故,我的代码中的身份验证无法正确工作。

你知道这里会出什么问题吗?


共1个答案

匿名用户

好的,我找到了解决方案(不知何故)。在我的Java代码中,身份验证不起作用(无论出于什么原因,我在多个示例中看到过这样做…)。

不管怎样,如果我手动设置标题,就像这样:

HttpGet request = new HttpGet(url);
String authorizationString = "Basic " + Base64.getEncoder().encodeToString(("myUser:myPass").getBytes()).replace("\n", "");             
request.setHeader(HttpHeaders.AUTHORIZATION, authorizationString);

HttpClient client = HttpClientBuilder.create().build();
HttpResponse response = client.execute(request);

System.out.println(response.getStatusLine().toString());

结果:

HTTP/1.1 200 OK