Страница Confluence 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'}))

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

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

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

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

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

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

person Nefariis    schedule 15.02.2017    source источник
comment
Во-первых, то, как вы это делаете, немного сбивает с толку. Не используйте python для вызова двоичного файла curl, вы также можете вообще не использовать python. По возможности используйте модуль requests, чтобы вы могли очистить свой код и сохранить его в чистом виде. Затем попробуйте еще раз и сообщите нам полученный ответ. Вероятно, в Интернете больше ресурсов для использования requests, чем почти для любой другой библиотеки Python, поэтому у вас не должно возникнуть проблем с поиском того, что вам нужно.   -  person daveruinseverything    schedule 16.02.2017
comment
отредактировано / обновлено.   -  person Nefariis    schedule 16.02.2017


Ответы (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 в curl и метод auth библиотеки запросов для аутентификации. Я не совсем уверен, но думаю, что с помощью этих методов невозможно пройти аутентификацию. Atlassian перечисляет возможности в их документации, и я думаю, что вы должны реализовать их базовую аутентификацию самостоятельно.

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

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

person Lukas Körfer    schedule 16.02.2017
comment
Я принял это как ответ, потому что очень ценил помощь - я бы никогда не догадался, что слияния не должно быть в вызове запроса. Как всегда, я опубликовал окончательное решение на случай, если кто-нибудь столкнется с этим и ему понадобится помощь. - person Nefariis; 17.02.2017

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

@lukegv прав - хотя в документации по обновлению слияния сказано использовать это:

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

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

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'}))
person Nefariis    schedule 16.02.2017