Честный знак. ИС «Маркировка». МДЛП
Протокол обмена интерфейсного уровня: PDF
Список реализованных методов: TXT
Инструкция по быстрому старту
- Прочитайте эту инструкцию, чтобы настроить окружение для работы с API: PDF
- Регистрация тестовой электронной подписи УКЭП в деталях описана тут.
Как использовать REST API-клиент
- Установить провайдер КриптоПро: http://cryptopro.ru/products/cryptopro-csp
- Запросить в техподдержке «Честного знака» доступ к тестовому стенду API: http://api.stage.mdlp.crpt.ru
- Добавить в hosts строчку с IP-адресом тестового стенда:
185.196.171.27 api.stage.mdlp.crpt.ru
- Добавить в проект Nuget-пакет: https://www.nuget.org/packages/MdlpApiClient
- Завести себе тестовый УКЭП по этой инструкции.
- Проверить вызовы API по документу «Быстрый старт».
Авторизация тестовым участником
Клиент для API называется MdlpClient
(МДЛП — Мониторинг Движения Лекарственных Препаратов).
По умолчанию клиент работает с адресом тестовой системы.
Почти все методы работы с API требуют авторизации. Для авторизации используются классы credentials.
Для авторизации пользователя-нерезидента (логин и пароль) используется NonResidentCredentials
.
Для резидента (авторизация с помощью сертификата ГОСТ) — соответственно, ResidentCredentials
.
При запуске конструктора клиент просто сохраняет указанные credentials, но не устанавливает соединение.
Установка соединения и авторизация происходит при вызове любого метода API:
// клиент пока никуда не коннектится
var client = new MdlpClient(credentials: new NonResidentCredentials
{
ClientID = "01db16f2-9a4e-4d9f-b5e8-c68f12566fd5",
ClientSecret = "9199fe04-42c3-4e81-83b5-120eb5f129f2",
UserID = "starter_resident_1",
Password = "password"
});
// тут будет установлено соединение и выполнен запрошенный метод API:
var doc = client.GetDocumentMetadata("60786bb4-fcb5-4587-b703-d0147e3f9d1c");
Console.WriteLine($"Код документа: {doc.DocumentID}");
Console.WriteLine($"Код запроса: {doc.RequestID}");
Чтобы трассировать все http-запросы и ответы, можно установить свойство Tracer
:
client.Tracer = Console.WriteLine;
При выполнении вышеприведенного кода трассировка выглядит так:
```c
// Authenticate
-> POST http://api.stage.mdlp.crpt.ru/api/v1/auth
headers: {
X-ApiMethodName = Authenticate
Accept = application/json, text/json, text/x-json, text/javascript, application/xml, text/xml
Content-type = application/json
}
body: {
"client_id": "01db16f2-9a4e-4d9f-b5e8-c68f12566fd5",
"client_secret": "9199fe04-42c3-4e81-83b5-120eb5f129f2",
"user_id": "starter_resident_1",
"auth_type": "PASSWORD"
}
<- OK 200 (OK) http://api.stage.mdlp.crpt.ru/api/v1/auth
timings: {
started: 2020-04-22 20:22:12
elapsed: 00:00:00.1971392
}
headers: {
Connection = keep-alive
X-XSS-Protection = 1; mode=block
Pragma = no-cache
X-Frame-Options = DENY
X-Content-Type-Options = nosniff
X-Application-Context = authentication-service-frontend:8095
Strict-Transport-Security = max-age=15768000
Content-Length = 47
Cache-Control = no-cache, no-store, max-age=0, must-revalidate
Content-Type = application/json;charset=UTF-8
Date = Wed, 22 Apr 2020 17:22:12 GMT
Expires = 0
Server = nginx/1.14.0
}
body: {
"code": "7c08d5f3-4a0c-4a71-b123-638533b4612c"
}
// GetToken
-> POST http://api.stage.mdlp.crpt.ru/api/v1/token
headers: {
X-ApiMethodName = GetToken
Accept = application/json, text/json, text/x-json, text/javascript, application/xml, text/xml
Content-type = application/json
}
body: {
"code": "7c08d5f3-4a0c-4a71-b123-638533b4612c",
"password": "password"
}
<- OK 200 (OK) http://api.stage.mdlp.crpt.ru/api/v1/token
timings: {
started: 2020-04-22 20:22:12
elapsed: 00:00:00.2673376
}
headers: {
Connection = keep-alive
X-XSS-Protection = 1; mode=block
Pragma = no-cache
X-Frame-Options = DENY
X-Content-Type-Options = nosniff
X-Application-Context = authentication-service-frontend:8095
Strict-Transport-Security = max-age=15768000
Content-Length = 63
Cache-Control = no-cache, no-store, max-age=0, must-revalidate
Content-Type = application/json;charset=UTF-8
Date = Wed, 22 Apr 2020 17:22:13 GMT
Expires = 0
Server = nginx/1.14.0
}
body: {
"token": "9189625f-2bea-4cf9-a36d-2c827b08d276",
"life_time": 30
}
// GetDocumentMetadata
-> GET http://api.stage.mdlp.crpt.ru/api/v1/documents/60786bb4-fcb5-4587-b703-d0147e3f9d1c
headers: {
X-ApiMethodName = GetDocumentMetadata
Authorization = token 9189625f-2bea-4cf9-a36d-2c827b08d276
Accept = application/json, text/json, text/x-json, text/javascript, application/xml, text/xml
}
<- OK 200 (OK) http://api.stage.mdlp.crpt.ru/api/v1/documents/60786bb4-fcb5-4587-b703-d0147e3f9d1c
timings: {
started: 2020-04-22 20:22:12
elapsed: 00:00:00.5673959
}
headers: {
Transfer-Encoding = chunked
Connection = keep-alive
X-Application-Context = mdlp-api-document-front
X-Content-Type-Options = nosniff
X-XSS-Protection = 1; mode=block
Pragma = no-cache
X-Frame-Options = DENY
Strict-Transport-Security = max-age=15768000
Cache-Control = no-cache, no-store, max-age=0, must-revalidate
Content-Type = application/json;charset=UTF-8
Date = Wed, 22 Apr 2020 17:22:13 GMT
Expires = 0
Server = nginx/1.14.0
}
body: {
"request_id": "528700e0-f967-4ddb-995d-5c6c7b73bcc9",
"document_id": "60786bb4-fcb5-4587-b703-d0147e3f9d1c",
"date": "2020-04-07 07:55:33",
"processed_date": "2020-04-07 07:55:33",
"sender": "00000000100928",
"receiver": "00000000100930",
"sys_id": "9dedee17-e43a-47f1-910e-3a88ff6bc81b",
"doc_type": 607,
"doc_status": "PROCESSED_DOCUMENT",
"file_uploadtype": 2,
"sender_sys_id": "6f6fa779-b637-4234-9117-8ac4c1a9a81c",
"version": "1.34"
}
```