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 for JIRA 软件中发现了一个非常相似的错误,所以显然这也发生在 JIRA 上,但是是间歇性的。 https://jira.atlassian.com/browse/JRA-41559

我对 HTTP 协议不是很熟悉,所以我可能忽略了一些东西,所以我真的只是想尝试更多的选择(当然,一个解决方案是理想的)。

4

3 回答 3

4

问题是您使用带有域的用户名作为凭据(****** @******.com :******)

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

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

于 2017-02-17T09:06:08.297 回答
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 将有内容。

于 2017-04-20T20:14:53.973 回答
0

这也让我发疯了。最终通过创建会话找到了我的解决方案。不确定如何使用 cURL 执行此操作。可能要使用 PHP 什么的。我用过 NodeJS

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

我的应用程序是用 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');
});
于 2017-06-23T19:05:16.110 回答