Confluence REST API:HTTP 200 w / Empty Response

问题描述 投票:2回答:3

我似乎无法通过Rest API在Confluence Cloud v1000.957.0上创建新页面。我已经尝试过使用cURL和Python都无济于事:我所有回来的都是HTTP 200,每次都有一个空的JSON响应。如果我更改凭据不正确,我会得到HTTP 401

curl -u ******@******.com:****** -X POST -H 'Content-Type: application/json' -d'{"type":"page","title":"TESTING123", "ancestors":[{"id":123456}], "space":{"key":"AA"},"body":{"storage":{"value":"<p>This is a new page</p>","representation":"storage"}}}' https://********.atlassian.net/wiki/rest/api/content/

为了匿名,我已经更改了cURL调用的一些细节,但我知道凭据,祖先ID,空格键和API URL是正确的。我还验证了此帐户在Confluence中具有正确的权限,可以在此空间中创建页面,并且启用了Confluence的API访问权限。

我尝试过的API调用的变体:

  1. ?os_authType=basic添加到URL的末尾
  2. 添加尽可能多的参数(全部为空值),例如: status: current operations: [] metadata: {}
  3. 更改API调用以在Confluence空间中的顶级创建页面(省略ancestors字段)。
  4. 添加此标头:Accept: application/json
  5. view选项添加到调用的body部分,然后将其附加到URL的末尾:&expand=body.view。我发现将它添加到Python代码会产生相同的结果,但是将它添加到cURL调用会打印出类似[1] 42999的内容(后一部分随每次调用而变化);然后在一个新的命令或只是按下Return,它打印[1]+ Done后跟一大块空白,然后我刚刚制作的cURL调用。

我在Atlassian的JIRA中发现了一个非常类似的JIRA软件错误,所以很明显这也发生在JIRA上,但间歇性地发生了。 https://jira.atlassian.com/browse/JRA-41559

我对HTTP协议并不十分熟悉,所以我可能会忽略一些东西,所以我真的想要更多的选择(尽管解决方案当然是理想的)。

curl response confluence confluence-rest-api
3个回答
3
投票

问题是您使用域名作为凭据(******) @ ******。com :******)

您可以通过询问主要维基内容来检查这是否有效。 尝试:curl -u <user>:<pass> https://<domain>.atlassian.net/wiki/rest/api/content/

您也可以省略密码。 Curl会要求它 - 从安全角度来看它更安全。 尝试:curl -u <user> https://<domain>.atlassian.net/wiki/rest/api/content/


1
投票

对于其他任何人来到这里...我有一个确切的问题,其中一个r = requests.get(URL, auth=(USER, PASSWORD)到一个wiki页面的URL ... / wiki / rest / api / content / 123454将有一个200 r.status_code和r.text空了。

修复是使用requests.session()并进行两次调用。一个(我假设)建立会话,第二个获取内容。

s = requests.session()
s.auth = (USER, PASSWORD)
r = s.get(url_base) # url_base = '.../wiki/rest/api'
r = s.get(url) # url = '.../wiki/rest/api/content/123453'

然后r.text将有内容。


0
投票

这也让我疯狂。最终通过创建会话找到了我的解决方案。不确定如何使用cURL完成此操作。可能必须使用PHP或其他东西。我用过NodeJS

这里发生的事情是,当您提出第一个请求时,CSRF令牌将被发送出去。您需要一个会话来存储这些。存储后,必须将它们与所有后续请求一起发送出去。

我的应用程序是用NodeJS编写的。 YMMV用其他语言,但以下为我工作:

var request = require('request');

/* GET home page. */
router.get('/', function(req, res, next) {
  var cookieJar = request.jar(); // <-- THIS IS THE IMPORTANT PART

  var options = { method: 'GET',
  url: 'https://test.atlassian.net/wiki/rest/api/content',
  jar: cookieJar,
  headers:
   {'cache-control': 'no-cache',
     authorization: 'Basic yourBase64AuthToken' } };

  // You'll need to make two requests, one to get the tokens,
  // and another to actually get your query to work
  request(options, function (error, response, body) {
    if (error) throw new Error(error);
    request(options, function (error, response, body) {
      if (error) throw new Error(error);
      console.log(body);
    });
  });

res.send('hello');
});
© www.soinside.com 2019 - 2024. All rights reserved.