Примеры использования
Подключение к серверу Docsvision
Практически каждый метод веб-сервиса требует идентификатор пользовательской сессии, поэтому первоначальной задачей является создание сессии пользователя. Для этого предназначен метод SessionLogin.
import xml.etree.ElementTree as ElementTree
import requests
from requests_ntlm import HttpNtlmAuth
url = 'http://DOCSVISION_SERVER.COM/DocsVision/StorageServer/StorageServerService.asmx'
username = 'Domain\User.Name'
password = 'User.Password' (1)
session = requests.Session()
session.auth = HttpNtlmAuth(username, password, session)
session.headers['Content-Type'] = 'text/xml; charset=utf-8'
session.headers['SOAPAction'] = 'http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/SessionLogin' (2)
body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SessionLogin xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
<baseName></baseName>
<sessionSettings><Settings><Setting Name="ComputerAddress" Type="string" ReadOnly="1">192.168.0.2</Setting><Setting Name="ComputerName" Type="string">connectedComputer</Setting><Setting Name="LocaleID" Type="int">1049</Setting></Settings></sessionSettings>
</SessionLogin>
</soap:Body>
</soap:Envelope>""" (3)
response = session.post(url, data=body) (4)
responseParsed = ElementTree.fromstring(response.content)
sessionId = responseParsed.findtext('.//{http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/}sessionId') (5)
1 | Адрес и учетные данные пользователя для подключения к Docsvision. |
2 | Устанавливаем цель запроса в заголовке запроса. |
3 | SOAP-сообщение, в котором передаем адрес и сетевое имя клиента. |
4 | Отправляем SOAP-сообщение. |
5 | Разбираем ответ и получаем идентификатор сессии. |
Добавление файла в базу данных
После открытия сессии можно, к примеру, добавить файл (не путать с версионным файлом — карточка файла с версиями) в базу данных.
-
Создать объект-файл в базе данных, используя метод
FileCreate
. -
Открыть созданный объект для записи, используя метод
FileOpen
. -
Записать содержимое файла с файловой системы в открытый объект-файл, используя метод
FileWrite
. -
Закрыть с сохранением открытый объект, используя метод
FileClose
(1)
session.headers['SOAPAction'] = "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/FileCreate" (2)
body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<FileCreate xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
<sessionId>%s</sessionId>
<name>Document_Order.docx</name>
</FileCreate>
</soap:Body>
</soap:Envelope>""" % sessionId (3)
response = session.post(url, data=body) (4)
responseParsed = ElementTree.fromstring(response.content)
fileId = responseParsed.findtext(".//{http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/}fileId") (5)
(6)
session.headers['SOAPAction'] = "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/FileOpen" (7)
body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<FileOpen xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
<sessionId>%s</sessionId>
<fileId>%s</fileId>
<modify>true</modify>
</FileOpen>
</soap:Body>
</soap:Envelope>""" % (sessionId, fileId) (8)
response = session.post(url, data=body) (9)
responseParsed = ElementTree.fromstring(response.content)
fileHandleId = responseParsed.findtext(".//{http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/}fileHandleId") (10)
(11)
session.headers['SOAPAction'] = "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/FileWrite" (12)
with open("Z:\\Order.docx", "rb") as document:
encoded_string = base64.b64encode(document.read()).decode('utf-8')
body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<FileWrite xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
<sessionId>%s</sessionId>
<fileHandleId>%s</fileHandleId>
<compressed>false</compressed>
<fileData>%s</fileData>
</FileWrite>
</soap:Body>
</soap:Envelope>""" % (sessionId, fileHandleId, encoded_string) (13)
session.post(url, data=body) (14)
(15)
session.headers['SOAPAction'] = "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/FileClose" (16)
body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<FileClose xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
<sessionId>%s</sessionId>
<fileHandleId>%s</fileHandleId>
<commitWrite>true</commitWrite>
</FileClose>
</soap:Body>
</soap:Envelope>""" % (sessionId, fileHandleId) (17)
session.post(url, data=body) (18)
print(fileId) (19)
1 | Создаем объект-файл. |
2 | Изменяем цель запроса в заголовке запроса. |
3 | SOAP-сообщение. |
4 | Отправляем SOAP-сообщение. |
5 | Разбираем ответ и получаем идентификатор объект-файла. |
6 | Открываем объект-файл. |
7 | Изменяем цель запроса в заголовке запроса. |
8 | SOAP-сообщение. |
9 | Отправляем SOAP-сообщение. |
10 | Разбираем ответ и выводим идентификатор новой карточки. |
11 | Запись данных в файл. |
12 | Изменяем цель запроса в заголовке запроса. |
13 | SOAP-сообщение. |
14 | Отправляем SOAP-сообщение. |
15 | Сохранение файла. |
16 | Изменяем цель запроса в заголовке запроса. |
17 | SOAP-сообщение. |
18 | Отправляем SOAP-сообщение. |
19 | Выводим идентификатор файла. |
Приведенный пример может быть значительно упрощен, к примеру, с использованием soap-клиента, который может получить описание методов из WSDL.
Создание карточки файла с версиями
-
Создать карточку типа "Файл с версиями", используя метод
CardCreate
. -
Создать строки в секциях "Версии" и "Общая информация", используя метод
RowCreate
. -
Добавить, используя метод
RowSetData
, в строку секции "Версии" значения полей (см. Описание полей стандартной карточки):FileId
(используем идентификатор файла, полученный в предыдущем примере),Version
иVersionNumber
. -
Добавить, используя метод
RowSetData
, в строку секции "Общая информация" значения полей:CheckinDate
,CurrentID
(указывается идентификатор строки версии, созданной ранее),CurrentVersion
,Name
иNextVersion
. -
Изменить описание карточки, используя
CardSetInfo
.
(1)
session.headers['SOAPAction'] = "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/CardCreate" (2)
body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<CardCreate xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
<sessionId>%s</sessionId>
<cardId>6E39AD2B-E930-4D20-AAFA-C2ECF812C2B3</cardId>
<newInstanceId>00000000-0000-0000-0000-000000000000</newInstanceId>
</CardCreate>
</soap:Body>
</soap:Envelope>""" % sessionId (3)
response = session.post(url, data=body) (4)
responseParsed = ElementTree.fromstring(response.content)
newInstanceId = responseParsed.findtext(".//{http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/}newInstanceId") (5)
(6)
versions_row_id = create_row(newInstanceId, 'F831372E-8A76-4ABC-AF15-D86DC5FFBE12')
update_row('F831372E-8A76-4ABC-AF15-D86DC5FFBE12', versions_row_id, '<RowData><row FileID="%s" Version="1" VersionNumber="2"/></RowData>' % fileId) (7)
maininfo_row_id = create_row(newInstanceId, '2FDE03C2-FF87-4E42-A8C2-7CED181977FB')
update_row('2FDE03C2-FF87-4E42-A8C2-7CED181977FB', maininfo_row_id,
'<RowData><row CheckinDate="%s" CurrentID="%s" CurrentVersion="1.1" Name="Document_Order versionedFileCard" NextVersion="2" /></RowData>' %(datetime.datetime.now().isoformat(), versions_row_id) )
(8)
session.headers['SOAPAction'] = "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/CardSetInfo" (9)
body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<CardSetInfo xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
<sessionId>%s</sessionId>
<instanceID>%s</instanceID>
<description>Document_Order versionedFileCard</description>
<template>false</template>
<topic></topic>
</CardSetInfo>
</soap:Body>
</soap:Envelope>""" % (sessionId, newInstanceId) (10)
response = session.post(url, data=body) (11)
print(newInstanceId) (12)
1 | Создаём карточки типа "Файл" с версиями. |
2 | Изменяем цель запроса в заголовке запроса. |
3 | SOAP-сообщение. |
4 | Отправляем SOAP-сообщение. |
5 | Разбираем ответ для получения идентификатора созданной карточки. |
6 | Создаем строки для секций "Общая информация" и "Версии", а также заполняем их поля. |
7 | Для простоты используем дополнительные методы create_row (создание строки) и update_row (запись данных в строку).
Реализация методов create_row и update_row приведена далее. |
8 | Добавляем описание. |
9 | Изменяем цель запроса в заголовке запроса. |
10 | SOAP-сообщение. |
11 | Отправляем SOAP-сообщение. |
12 | Выводим идентификатор созданной карточки. |
Идентификатор полученной карточки версионного файла можно, к примеру, записать в секцию "Файлы" карточки типа "Документ", что соответствует прикрепление файла к документу.
Дополнительные методы, использованные выше, реализованы следующим образом:
def create_row(card_id, section_id):
session.headers['SOAPAction'] = "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/RowCreate" (1)
body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<RowCreate xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
<sessionId>%s</sessionId>
<sectionId>%s</sectionId>
<rowId>00000000-0000-0000-0000-000000000000</rowId>
<instanceID>%s</instanceID>
<parentRowId>00000000-0000-0000-0000-000000000000</parentRowId>
<parentTreeRowId>00000000-0000-0000-0000-000000000000</parentTreeRowId>
</RowCreate>
</soap:Body>
</soap:Envelope>""" % (sessionId, section_id, card_id) (2)
response = session.post(url, data=body) (3)
responseParsed = ElementTree.fromstring(response.content)
newRowId = responseParsed.findtext(".//{http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/}newRowId")
return newRowId (4)
(5)
def update_row(sectionId, rowId, rowData):
session.headers[ 'SOAPAction'] = "http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/RowSetData" (6)
body = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<RowSetData xmlns="http://schemas.docsvision.com/Platform/2009-02-03/StorageServer/">
<sessionId>%s</sessionId>
<sectionId>%s</sectionId>
<rowId>%s</rowId>
<rowData>%s</rowData>
</RowSetData>
</soap:Body>
</soap:Envelope>""" % (sessionId, sectionId, rowId, rowData) (7)
session.post(url, data=body) (8)
1 | Добавление пустой строки в секцию section_id карточки card_id |
2 | SOAP-сообщение. |
3 | Отправляем SOAP-сообщение. |
4 | Разбираем ответ и выводим идентификатор новой строки. |
5 | Запись данных rowData в строку rowId секции sectionId . |
6 | Изменяем цель запроса в заголовке запроса. |
7 | SOAP-сообщение. |
8 | Отправляем SOAP-сообщение. |