Страница Conflicence WIki не обновляется через API

Я пытаюсь использовать Rest API для обновления нашей вики-страницы, но, похоже, ничего не происходит, хотя я получаю 200 кодов.

Я пытался сделать это с помощью как почтальона, так и 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":"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'}))

**** Новое обновление ****

Я пытаюсь сделать это буквально из значения скручивания запаса, которое дано на странице 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}}'

до сих пор безрезультатно... я в полной растерянности....

****** Обновить снова ******

Я просто собираюсь опубликовать код, с которым я сейчас работаю

    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))

2 ответа

Решение

Прежде всего, проверьте базовый URL вашего экземпляра Confluence, потому что по умолчанию он выглядит xxx.xxx.xxx.xxx:1990/confluence, но можно избавиться от контекста confluence, В вашем примере вы используете wiki.myCompany.com:8444 как-то называется jirasite и еще добавить confluence перед URL REST API rest/api, Если вы используете правильную конечную точку API, вы никогда не получите ответ HTML.

Затем, пожалуйста, решите, какой метод API вы хотите использовать. Чтобы создать новый контент, вы должны отправить запрос POST rest/api/content, но чтобы обновить существующий контент, вы должны отправить запрос PUT rest/api/content/{contentId},

Я только что заметил, что вы используете -u вариант в скручиваемости и тому auth метод запроса библиотеки для аутентификации. Я не совсем уверен, но я думаю, что невозможно аутентифицироваться с помощью этих методов. Atlassian перечисляет возможности в их документации, и я думаю, что вы должны реализовать их базовую аутентификацию самостоятельно.

Некоторые дополнительные советы по устранению неполадок:

Atlassian предоставляет плагин REST API Browser для тестирования запросов API. Если вы не можете установить плагины в своем экземпляре Confluence, вы можете использовать расширение браузера (например, YARC). Таким образом, вы можете отправлять запросы вашему Confluence, не заботясь об аутентификации.

Я принял ответ lukegv, так как он, наконец, дал мне несколько сообщений об ошибках, с которыми я мог бы работать, чтобы получить окончательное решение. Что еще более важно, я публикую свой сценарий на случай, если кто-нибудь сталкивался с этим и был взбешен отсутствием документации API слияния.

@lukegv прав - даже несмотря на то, что документация по обновлению слияния гласит:

http://localhost:8080/confluence/rest/api/content/3604482

Если вы используете вики-сайт, вы должны использовать это

http://localhost:8080/rest/api/content/3604482

Вторая проблема заключается в том, что вам нужно увеличить номер версии страницы для обновления. Чтобы сделать это, вам нужно позвонить по расширению = версия, как это.

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'}))
Другие вопросы по тегам