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 调用的变体:
在URL
的末尾添加?os_authType=basic
添加尽可能多的参数(全部为空值)例如:
status: current
operations: []
metadata: {}
更改 API 调用以在 Confluence space 的顶层创建页面(省略 ancestors
字段)。
添加此 header:Accept: application/json
将 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');
});
我似乎无法通过 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 调用的变体:
在URL
的末尾添加添加尽可能多的参数(全部为空值)例如:
status: current
operations: []
metadata: {}
更改 API 调用以在 Confluence space 的顶层创建页面(省略
ancestors
字段)。添加此 header:
Accept: application/json
将
view
选项添加到调用的body
部分,然后将其附加到 URL 的末尾:&expand=body.view
。我发现将它添加到 Python 代码会得到相同的结果,但将它添加到 cURL 调用会打印出类似[1] 42999
的内容(后一部分随每次调用而变化);然后在一个新命令或简单地按下Return
时,它会打印[1]+ Done
后跟一大块白色 space,然后是我刚刚进行的 cURL 调用。
?os_authType=basic
我在 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');
});