Ранее я рассматривал примеры работы с REST API на примере JIRA. Сегодня рассмотрим API CONFLUENCE.
Построение запроса делается точно также как и и в случае с JIRA, поэтому код повторять не буду.
Примечание: http://localhost:8080/confluence - адрес вашего конфлюенса. У всех он свой, естественно.
1. Поиск страницы по названию
GET
http://localhost:8080/confluence/rest/api/content?title={ lv_parameter_value }&spaceKey={ mv_space_key }&expand=version
2. Получение HTML страницы
GET
http://localhost:8080/confluence/rest/api/content/{ iv_id }?expand=body.storage
3.Создание страницы
POST
1 2 3 4 5 6 7 8 9 10 11 12 |
{ 'type': 'page', 'title': iv_header, 'ancestors': [{'id': iv_parent_page_id}], 'space': {'key': self._comala_space}, 'body': { 'storage': { 'value': iv_page_html, 'representation': 'storage', } } } |
http://localhost:8080/confluence/rest/api/content/
для ABAP(код немножко неполный)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
Тип для создания страницы TYPES: BEGIN OF lty_space_create_data, key TYPE string, END OF lty_space_create_data. TYPES: BEGIN OF lty_ancestors_create_data, id TYPE string, END OF lty_ancestors_create_data. TYPES lty_t_ancestors_create_data TYPE TABLE OF lty_ancestors_create_data WITH DEFAULT KEY. TYPES: BEGIN OF lty_storage_create_data, value TYPE string, representation TYPE string, END OF lty_storage_create_data. TYPES: BEGIN OF lty_body_create_data, storage TYPE lty_storage_create_data, END OF lty_body_create_data. TYPES: BEGIN OF lty_confluence_create_data, type TYPE string, title TYPE string, space TYPE lty_space_create_data, ancestors TYPE lty_t_ancestors_create_data, body TYPE lty_body_create_data, END OF lty_confluence_create_data. lo_rest_client = NEW cl_rest_http_client( io_http_client = mo_http_client ). DATA ls_conf_data TYPE lty_confluence_create_data. ls_conf_data-type = 'page'. ls_conf_data-title = iv_title_page. "Заголовок ls_conf_data-space-key = mv_space_key. “Ключ области ls_conf_data-ancestors = VALUE #( ( id = mv_conf_data_id ) ). “родительская страница ls_conf_data-body-storage-value = iv_body. “данные тела страницы ls_conf_data-body-storage-representation = 'storage'. DATA(lv_json) = /ui2/cl_json=>serialize( EXPORTING pretty_name = /ui2/cl_json=>pretty_mode-camel_case data = ls_conf_data ). mo_rest_client->if_rest_client~set_request_header( iv_name = if_http_header_fields_sap=>request_uri " Header Name iv_value = '/rest/api/content' ). "создаем JSON запрос io_request->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ). io_request->set_string_data( iv_data = lv_json ). TRY. "выполняем запрос mo_rest_client->if_rest_client~post( io_request ). CATCH cx_rest_client_exception." INTO DATA(lo_rest_client). ENDTRY. DATA(lo_status) = mo_rest_client->if_rest_client~get_response_entity( ). |
4. Изменение страницы
PUT
{"id":"ID страницы","type":"page", "title":"new page","space":{"key":"TST"},"body":{"storage":{"value": "NEW DATA","representation":"storage"}}, "version":{"number":N}}
http://localhost:8080/confluence/rest/api/content/Номер страницы
Примечание:
При изменении данных важно подавать новый номер версии страницы. Без нового номера страница не обновится
Для ABAP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
"создаем запрос DATA(io_request) = mo_rest_client->if_rest_client~create_request_entity( ). TYPES: BEGIN OF lty_space_change, key TYPE string, END OF lty_space_change. TYPES: BEGIN OF lty_ancestors_change, id TYPE string, END OF lty_ancestors_change. TYPES lty_t_ancestors_change TYPE TABLE OF lty_ancestors_change WITH DEFAULT KEY. TYPES: BEGIN OF lty_storage_change, value TYPE string, representation TYPE string, END OF lty_storage_change. TYPES: BEGIN OF lty_body_change, storage TYPE lty_storage_change, END OF lty_body_change. TYPES: BEGIN OF lty_version_change, number TYPE string, END OF lty_version_change. TYPES: BEGIN OF lty_confluence_change, type TYPE string, id TYPE string, title TYPE string, space TYPE lty_space_change, ancestors TYPE lty_t_ancestors_change, "lty_ancestors_data, body TYPE lty_body_change, version TYPE lty_version_change, END OF lty_confluence_change. DATA ls_conf_data TYPE lty_confluence_change. ls_conf_data-type = 'page'. ls_conf_data-id = iv_conf_data_id. ls_conf_data-title = iv_title_page. ls_conf_data-space-key = mv_space_key. ls_conf_data-version-number = iv_version + 1. “Версию необходимо инкрементировать иначе будет ошибка ls_conf_data-body-storage-value = iv_body. ls_conf_data-body-storage-representation = 'storage'. DATA(lv_json) = /ui2/cl_json=>serialize( EXPORTING pretty_name = /ui2/cl_json=>pretty_mode-camel_case data = ls_conf_data ). mo_rest_client->if_rest_client~set_request_header( iv_name = if_http_header_fields_sap=>request_uri iv_value = |/rest/api/content/{ iv_conf_data_id }| ). "создаем JSON запрос io_request->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ). io_request->set_string_data( iv_data = lv_json ). TRY. "выполняем запрос mo_rest_client->if_rest_client~put( io_request ). CATCH cx_rest_client_exception. ENDTRY. |
COMALA – плагин к CONFLUENCE. Его данные тоже можно получить через API. Но есть особенность. Когда страница утверждена, список согласующих не возвращается, только статус. Это можно обойти получив файл с историей изменений. Там будет видно кто был добавлен в список согласующих, кто был удален.
API получения файла по номеру id страницы
GET запрос
http://localhost:8080/confluence/plugins/adhocworkflows/exportworkflowpageactivity.action?pageId={IDстранцы}
Можно проследить последовательность включений и исключений согласующих и соответственно таким образом найти тех, кто согласовал документ в самом конце
Получить статус согласования:
GET
http://localhost:8080/confluence/rest/cw/1/content/{IDстранцы}/status&expand=state,approvals