Confluence REST API:HTTP 200,响应为空

Confluence REST API: HTTP 200 w/ Empty Response

我似乎无法通过 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、space 密钥和 API URL 是正确的。我还验证了此帐户在 Confluence 中具有正确的权限,可以在此 space 中创建页面,并且已启用对 Confluence 的 API 访问权限。

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

  1. 在URL

  2. 的末尾添加?os_authType=basic
  3. 添加尽可能多的参数(全部为空值)例如:

    • status: current
    • operations: []
    • metadata: {}
  4. 更改 API 调用以在 Confluence space 的顶层创建页面(省略 ancestors 字段)。

  5. 添加此 header:Accept: application/json

  6. view 选项添加到调用的 body 部分,然后将其附加到 URL 的末尾:&expand=body.view。我发现将它添加到 Python 代码会得到相同的结果,但将它添加到 cURL 调用会打印出类似 [1] 42999 的内容(后一部分随每次调用而变化);然后在一个新命令或简单地按下 Return 时,它会打印 [1]+ Done 后跟一大块白色 space,然后是我刚刚进行的 cURL 调用。

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

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

问题是您使用的用户名和域作为凭据 (******@******.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/

对于最终来到这里的任何其他人...我遇到了这个确切的问题,其中 r = requests.get(URL, auth=(USER, PASSWORD) 到 URL 那是一个 wiki 页面.../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就有内容了

这也让我抓狂。我的解决方案最终是通过创建会话找到的。不确定如何使用 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');
});