如何使用Confluence的REST API创建新页面?

27

我需要一个能够使用Rest API创建新维基页面的工作示例。我希望新页面能够创建在特定空间和特定页面之下。我看过他们的API文档,并查看了一些他们提供的示例,但仍然欠缺。

这是他们网站上提供的一个示例:

curl -u admin:admin -X POST -H 'Content-Type: application/json' -d'{"type":"page","title":"new page","space":{"key":"TST"},"body":{"storage":{"value":"<p>This is a new page</p>","representation":"storage"}}}' http://localhost:8080/confluence/rest/api/content/ | python -mjson.tool

我尝试使用我的空间名称、新标题和将网址更改为mysite/rest/api/content,返回的内容基本上是一个HTML页面,说明页面不存在或页面存在但您没有权限。 我已确认我可以访问Confluence wiki并可以使用我的凭据创建新的wiki。

另外不清楚的是,在上面的示例中如何调用创建页面的特定API? 这没有意义。

他们的论坛上有类似的问题,但没有合理的答案 https://answers.atlassian.com/questions/149561/simple-confluence-rest-api-usage-what-am-i-missing

(我想最终目标是能够自动在Confluence上创建新的Wiki页面)如果必要的话,我可以放弃使用Confluence REST API的其他解决方案。


古老但仍然有效的问题,这是它们的规范:https://developer.atlassian.com/cloud/confluence/rest/#api-api-content-post 还有一些语言的示例,包括curl、nodejs等。 - frank_108
2个回答

30
我的怀疑是您使用的Confluence版本不够新。创建新页面的REST API在Confluence 5.5中推出(8天前发布)。API文档是有版本的,您应该始终使用与您的Confluence版本对应的版本。 5.5 API文档包含您需要的页面创建API,但旧版本没有。您可以更改上面URL中的版本以获取与您的Confluence版本匹配的API版本。
另外,Confluence 5.4及之前的版本还使用了不同的REST API根前缀(/rest/prototype/1/content),这可能是无法找到页面的原因之一。
Atlassian网站上的示例也令人困惑,因为它在URL中包含了额外的“/confluence”,只有在Confluence设置有上下文路径时才需要这样做。如果您正在使用Confluence 5.5+(尽管您的帖子表明您已经纠正了这一点),这也可能导致找不到页面的错误。
此外,您需要通过
添加特殊的os_authType查询参数告诉Confluence您正在使用基本身份验证方法
以下示例适用于我的Confluence 5.5(不要忘记根据需要更改端口和空间键)。
出于安全考虑,我还在Accept标头中添加了适当的内容类型,尽管这在实践中似乎不需要。
curl -v -u admin:admin -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -d'{"type":"page","title":"new page","space":{"key":"ATTACH"},"body":{"storage":{"value":"<p>This is a new page</p>","representation":"storage"}}}' "http://localhost:8090/rest/api/content/?os_authType=basic"
回答您的最后一个问题,创建页面的特定API由URL本身和请求方法确定。例如,在“/rest/api/content”上执行GET将获取现有页面(如果给定适当的查询参数),而执行POST将创建新页面。
编辑后添加:
另请参阅下面我的评论,了解如何将页面创建为现有页面的子级,而不仅仅是在空间的顶层创建。

1
谢谢您的快速回复。您的答案解决了我很多问题。是的,我使用的是较旧版本的Confluence。我也没有在Confluence上启用远程API设置。启用该选项并使用5.5使您建议的解决方案起作用。现在我可能要求太多了,但是,使用这个新的rest api,我可以使用文件而不是在命令中传递原始html吗?还可以指定父页面id吗?文档没有提供。也许因为它只有8天 :) - DoodleKana
16
启用“Remote API”也是一个好建议。尽管这完全没有文档记录(未来版本可能会有所不同),但你可以通过在5.5版本中的“祖先”属性中指定父页面来实现。以下命令可让我成功创建ID为#1048582的页面的子页面:curl -v -u admin:admin -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -d'{"type":"page","ancestors":[{"type":"page","id":1048582}],"title":"third new child page","space":{"key":"ATTACH"},"body":{"storage":{"value":"<p>This is a new page</p>","representation":"storage"}}}' "http://localhost:8090/rest/api/content/?os_authType=basic" - Scott Dudley
我尝试了上述方法,它可以正常工作。现在我可以在任何其他页面下创建一个新页面。我还微调了curl设置,所以它可以通过使用“-d @filename.json”从文件中读取新页面的内容。当您的新页面包含大量内容时,这将非常有用。 - DoodleKana
我还没有成功地使更新功能正常工作。当更新一个现有的嵌套页面时,它要么会变成孤立的(使用Confluence API文档提供的示例curl),要么会成为空间主页的子页面。已向Atlassian报告了问题[CR-487](https://jira.atlassian.com/browse/CRA-487)。 - Xabs
这个API能否用于在Atlassian托管的Confluence实例上创建页面? - ericpeters0n

1
不是REST API,而是我组合的一种解决方案。 尝试这个: 将页面移动为子页面。
curl -X GET \
'<your-confluence-URL>/pages/movepage.action?pageId=<page-to-be-moved-pageId>&spaceKey=<target-space-key>&targetTitle=<target-title-of-parent-page>&position=append' \
-H 'authorization: Basic <encoded-username-password>' \ 
-H 'x-atlassian-token: no-check'

将页面作为空间中的顶级页面移动
curl -X GET \
'<your-confluence-base-URL>/pages/movepage.action?pageId=<page-to-be-moved-pageId>&spaceKey=<target-space-key>&position=topLevel' \...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接