Confluence WIki 页面未通过 API 更新
Confluence WIki Page Not Updating Through API
我尝试使用 Rest API 来更新我们的维基页面,但似乎没有任何反应,尽管我收到了 200 个代码。
我已尝试通过 postman 和 Python 来完成此操作,并且在这两种情况下我都收到相同的服务器响应,但无济于事。
这是我的 Python 代码 -
curl = 'curl -u user:pass -X POST -H \'Content-Type: application/json\' ' \
'-d \'{0}\' https://wiki.myCompany.com:8444/confluence/rest/api/content/'\
.format(json.dumps(new))
output = subprocess.check_output(['bash', '-c', curl])
print(output`)
我试过同时使用 POST 和 PUT
这是回复 -
PUT https://wiki.myCompany.com:8444/confluence/rest/api/content/
200 OK 26.47 kB 655 ms
View Request View Response
HEADERS
Content-Encoding: gzip
Content-Length: 6578
Content-Security-Policy: frame-ancestors 'self'
Content-Type: text/html;charset=UTF-8
Date: Wed, 15 Feb 2017 20:24:46 GMT
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=DBCAA4C03DC489A720B8A59D755BD22A; Path=/; Secure; HttpOnly
Vary: User-Agent
X-Accel-Buffering: no
X-Asen: SEN-3386858
X-Ausername: username
X-Confluence-Request-Time: 1487190286413
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Seraph-Loginreason: OK
X-Xss-Protection: 1; mode=block
BODYview raw
<!DOCTYPE html>
<html>
<head>
<title>Dashboard - myCompany Wiki</title>
<meta http-equiv="X-UA-Compatible" content="IE=EDGE,chrome=IE7">
<meta charset="UTF-8">
<meta id="confluence-context-path" name="confluence-context-path" content="">
<meta id="confluence-base-url" name="confluence-base-url" content="https://wiki.myCompany.com:8444">
<meta id="atlassian-token" name="atlassian-token" content="abcd227f923fa6d5cce068a25de3bb4a3a3ceca4">
<script type="text/javascript">
var contextPath = '';
</script>
..... A lot more html .... but nothing relating to Body or Body.Storage...
我的 JSON 格式正确并包含页面 ID - 这是它的开头....
{"id":"28870287","type":"page","status":"current","title":"Automated QA Results - Android","body":{"storage":{"value":"<p>These are the results of every git merge...}}
有谁知道为什么什么都没有发生?
我之前已经通过请求库尝试过这个 - 我得到了相同的 200 响应代码。我只是想看看你们是否注意到调用本身而不是实现有问题
# output = requests.post('https://{0}/confluence/rest/api/content'.format(jirasite),
# data=(json.dumps(new)),
# auth=('user', 'pass'),
# headers=({'Content-Type': 'application/json'}))
**** 新更新 ****
我正在尝试从 Confluence API 页面上给出的库存卷曲值
'{"id":"28870287","type":"page","title":"new page","space":{"key":"TST"},"body":{"storage":{"value":"<p>This is the updated text for the new page</p>","representation":"storage"}},"version":{"number":2}}'
还是没有用...我完全不知所措....
****** 再次更新******
我正要post我目前正在使用的代码
r = requests.get('{0}/rest/api/content/28870287?expand=body.storage,version'.format(conflu_site),
auth=(test_user, test_pass)).text
print(r) # This works as expected
new = '{\"id\":\"28870287\",\"type\":\"page",\"title":\"Automated QA Results - Android\",\"space\":{\"key\":\"TST\"},' \
'\"body\":{\"storage\":{\"value\":\"<p>This is the updated text for the new page</p>\",' \
'\"representation\":\"storage\"}},\"version\":{\"number\":2}}'
update_response = requests.put('{0}/confluence/rest/api/content/28870287/'.format(conflu_site),
data=new,
auth=(test_user, test_pass),
headers=({'Content-Type': 'application/json'}))
print("Update Confluence Response: " + str(update_response))
首先,请检查您的 Confluence 实例的基础 url,因为默认情况下它看起来像 xxx.xxx.xxx.xxx:1990/confluence
,但可以去掉上下文 confluence
。在您的示例中,您使用 wiki.myCompany.com:8444
作为名为 jirasite
的东西,并且仍然在 REST API url rest/api
之前添加 confluence
。如果您使用正确的 API 端点,您应该 永远不会 得到 HTML 响应。
然后,请决定您要使用哪种API方法。要 create a new content, you have to send a POST request to rest/api/content
, but to update 现有内容,您必须向 rest/api/content/{contentId}
.
发送 PUT 请求
我刚刚注意到,您正在使用 curl 中的 -u
选项和请求库的 auth
方法进行身份验证。我不太确定,但我认为无法通过这些技术进行身份验证。 Atlassian 在他们的文档中列出 the possibilities,我认为,您必须自己实施他们的 基本身份验证。
一些额外的故障排除提示:
Atlassian 提供了一个REST API Browser Plugin to test API requests. If you cannot install plugins in your Confluence instance, you can use a browser extension (e.g. YARC)。这样,您就可以将请求发送到您的 Confluence 而无需关心身份验证。
我接受了 lukegv 的回答,因为它最终给了我一些错误消息,我可以使用这些消息来获得最终解决方案。更重要的是,我发布了我的脚本,以防万一有人遇到这个问题,并对缺乏汇合文档感到愤怒 API。
@lukegv 是对的——尽管更新 confluence 的文档说要使用这个:
http://localhost:8080/confluence/rest/api/content/3604482
如果您正在使用 wiki 站点,您应该使用这个
http://localhost:8080/rest/api/content/3604482
第二个问题是您需要增加页面的版本号才能更新。为此,您需要像这样调用 expand=version。
get_json = json.loads(requests.get('{0}/rest/api/content/28870287?expand=body.storage,version'.format(conflu_site),
auth=(test_user, test_pass)).text)
以下是我最终实现代码以使其正常工作的方式。
# This is the bare minimum that it takes to update a wiki page
update_templete = json.loads('{"id":"28870287","type":"page","body":{"storage":' \
'{"value":"Test","representation":"storage"}},"version":{"number":2}}')
# This is used to get the current body of the wiki page
get_json = json.loads(requests.get('{0}/rest/api/content/28870287?expand=body.storage,version'.format(conflu_site),
auth=(test_user, test_pass)).text)
# This increments the version number by one
update_templete["version"]["number"] = get_json["version"]["number"] + 1
# This saves the current page's body as a string
body = str(get_json["body"]["storage"]["value"])
# Use this to change the body however you see fit
new_body = do_Stuff(body)
# Update the templete's body json with the new body
update_templete["body"]["storage"]["value"] = new_body
# updates the confluence wiki site with the page body
update_response = requests.put('{0}/rest/api/content/28870287/'.format(conflu_site),
data=json.dumps(update_templete),
auth=(test_user, test_pass),
headers=({'Content-Type': 'application/json'}))
我尝试使用 Rest API 来更新我们的维基页面,但似乎没有任何反应,尽管我收到了 200 个代码。
我已尝试通过 postman 和 Python 来完成此操作,并且在这两种情况下我都收到相同的服务器响应,但无济于事。 这是我的 Python 代码 -
curl = 'curl -u user:pass -X POST -H \'Content-Type: application/json\' ' \
'-d \'{0}\' https://wiki.myCompany.com:8444/confluence/rest/api/content/'\
.format(json.dumps(new))
output = subprocess.check_output(['bash', '-c', curl])
print(output`)
我试过同时使用 POST 和 PUT
这是回复 -
PUT https://wiki.myCompany.com:8444/confluence/rest/api/content/
200 OK 26.47 kB 655 ms
View Request View Response
HEADERS
Content-Encoding: gzip
Content-Length: 6578
Content-Security-Policy: frame-ancestors 'self'
Content-Type: text/html;charset=UTF-8
Date: Wed, 15 Feb 2017 20:24:46 GMT
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=DBCAA4C03DC489A720B8A59D755BD22A; Path=/; Secure; HttpOnly
Vary: User-Agent
X-Accel-Buffering: no
X-Asen: SEN-3386858
X-Ausername: username
X-Confluence-Request-Time: 1487190286413
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Seraph-Loginreason: OK
X-Xss-Protection: 1; mode=block
BODYview raw
<!DOCTYPE html>
<html>
<head>
<title>Dashboard - myCompany Wiki</title>
<meta http-equiv="X-UA-Compatible" content="IE=EDGE,chrome=IE7">
<meta charset="UTF-8">
<meta id="confluence-context-path" name="confluence-context-path" content="">
<meta id="confluence-base-url" name="confluence-base-url" content="https://wiki.myCompany.com:8444">
<meta id="atlassian-token" name="atlassian-token" content="abcd227f923fa6d5cce068a25de3bb4a3a3ceca4">
<script type="text/javascript">
var contextPath = '';
</script>
..... A lot more html .... but nothing relating to Body or Body.Storage...
我的 JSON 格式正确并包含页面 ID - 这是它的开头....
{"id":"28870287","type":"page","status":"current","title":"Automated QA Results - Android","body":{"storage":{"value":"<p>These are the results of every git merge...}}
有谁知道为什么什么都没有发生?
我之前已经通过请求库尝试过这个 - 我得到了相同的 200 响应代码。我只是想看看你们是否注意到调用本身而不是实现有问题
# output = requests.post('https://{0}/confluence/rest/api/content'.format(jirasite),
# data=(json.dumps(new)),
# auth=('user', 'pass'),
# headers=({'Content-Type': 'application/json'}))
**** 新更新 ****
我正在尝试从 Confluence API 页面上给出的库存卷曲值
'{"id":"28870287","type":"page","title":"new page","space":{"key":"TST"},"body":{"storage":{"value":"<p>This is the updated text for the new page</p>","representation":"storage"}},"version":{"number":2}}'
还是没有用...我完全不知所措....
****** 再次更新******
我正要post我目前正在使用的代码
r = requests.get('{0}/rest/api/content/28870287?expand=body.storage,version'.format(conflu_site),
auth=(test_user, test_pass)).text
print(r) # This works as expected
new = '{\"id\":\"28870287\",\"type\":\"page",\"title":\"Automated QA Results - Android\",\"space\":{\"key\":\"TST\"},' \
'\"body\":{\"storage\":{\"value\":\"<p>This is the updated text for the new page</p>\",' \
'\"representation\":\"storage\"}},\"version\":{\"number\":2}}'
update_response = requests.put('{0}/confluence/rest/api/content/28870287/'.format(conflu_site),
data=new,
auth=(test_user, test_pass),
headers=({'Content-Type': 'application/json'}))
print("Update Confluence Response: " + str(update_response))
首先,请检查您的 Confluence 实例的基础 url,因为默认情况下它看起来像 xxx.xxx.xxx.xxx:1990/confluence
,但可以去掉上下文 confluence
。在您的示例中,您使用 wiki.myCompany.com:8444
作为名为 jirasite
的东西,并且仍然在 REST API url rest/api
之前添加 confluence
。如果您使用正确的 API 端点,您应该 永远不会 得到 HTML 响应。
然后,请决定您要使用哪种API方法。要 create a new content, you have to send a POST request to rest/api/content
, but to update 现有内容,您必须向 rest/api/content/{contentId}
.
我刚刚注意到,您正在使用 curl 中的 -u
选项和请求库的 auth
方法进行身份验证。我不太确定,但我认为无法通过这些技术进行身份验证。 Atlassian 在他们的文档中列出 the possibilities,我认为,您必须自己实施他们的 基本身份验证。
一些额外的故障排除提示:
Atlassian 提供了一个REST API Browser Plugin to test API requests. If you cannot install plugins in your Confluence instance, you can use a browser extension (e.g. YARC)。这样,您就可以将请求发送到您的 Confluence 而无需关心身份验证。
我接受了 lukegv 的回答,因为它最终给了我一些错误消息,我可以使用这些消息来获得最终解决方案。更重要的是,我发布了我的脚本,以防万一有人遇到这个问题,并对缺乏汇合文档感到愤怒 API。
@lukegv 是对的——尽管更新 confluence 的文档说要使用这个:
http://localhost:8080/confluence/rest/api/content/3604482
如果您正在使用 wiki 站点,您应该使用这个
http://localhost:8080/rest/api/content/3604482
第二个问题是您需要增加页面的版本号才能更新。为此,您需要像这样调用 expand=version。
get_json = json.loads(requests.get('{0}/rest/api/content/28870287?expand=body.storage,version'.format(conflu_site),
auth=(test_user, test_pass)).text)
以下是我最终实现代码以使其正常工作的方式。
# This is the bare minimum that it takes to update a wiki page
update_templete = json.loads('{"id":"28870287","type":"page","body":{"storage":' \
'{"value":"Test","representation":"storage"}},"version":{"number":2}}')
# This is used to get the current body of the wiki page
get_json = json.loads(requests.get('{0}/rest/api/content/28870287?expand=body.storage,version'.format(conflu_site),
auth=(test_user, test_pass)).text)
# This increments the version number by one
update_templete["version"]["number"] = get_json["version"]["number"] + 1
# This saves the current page's body as a string
body = str(get_json["body"]["storage"]["value"])
# Use this to change the body however you see fit
new_body = do_Stuff(body)
# Update the templete's body json with the new body
update_templete["body"]["storage"]["value"] = new_body
# updates the confluence wiki site with the page body
update_response = requests.put('{0}/rest/api/content/28870287/'.format(conflu_site),
data=json.dumps(update_templete),
auth=(test_user, test_pass),
headers=({'Content-Type': 'application/json'}))