let body = OperationBodyRequest()body.customer = .init( email: "<Email>", mobilePhone: "<Мобильный телефон>", ids: ["websiteid": "<Идентификатор на сайте>"], subscriptions: [ .init( brand: "<Системное имя бренда подписки клиента>", pointOfContact: .sms, topic: "<Внешний идентификатор тематики подписки>", isSubscribed: true ) ])Mindbox.shared.executeAsyncOperation( operationSystemName: "Mobile.AuthorizeCustomer", operationBody:body)
Передача и получение данных через синхронное выполнение операций
Для выполнения синхронных операций можно использовать следующие метод Mindbox.shared.executeSyncOperation
Этот метод принимает:
системное имя операции
тело запроса в Midnbox
коллбек, который надо вызвать, если операция выполнится успешно
колбек, который надо вызвать, если операция выполнится с ошибкой
В колбеки передается типизированный объект, в который парсится ответ от Mindbox.
Если по каким-то причинам ответ от Mindbox не может обработаться структурами, которые заложен в SDK, вы можете реализовать собственный класс для обработки ответа.
Он передается отдельным параметром в вызов функции
Использование готового класса
Описание метода
Описание вызова с использованием готового класса ответа
public func executeSyncOperation<T>( operationSystemName: String, operationBody: T, completion: @escaping (Result<OperationResponse, MindboxError>) -> Void) where T: OperationBodyRequestType {}
В таком случае, для запроса используется параметры operationSystemName и operationBody. Ответом на запрос является сущность Result<OperationResponse, MindboxError>.
Пример
Пример использования готового класса для ответа
// Create bodylet body = OperationBodyRequest()body.productListItems = ... // fill with data// Call methodMindbox.shared.executeSyncOperation( operationSystemName: "OperationName", operationBody: body) { result in switch result { case let .success(response): // Handle response here case let .failure(error): print(error.errorDescription) }}
Используя собственного класс для ответа
В таком случае, для запроса используется параметры operationSystemName и operationBody, а также customResponseType, который должен реализовывать протокол OperationResponseType. Ответом на запрос является сущность Result<P, MindboxError>.
// Create a new struct/class wich implements OperationResponseType struct MyResponse: OperationResponseType { var status: Status // provide custom fields here}...// Create bodylet body = OperationBodyRequest()body.productListItems = ... // fill with data// Call methodMindbox.shared.executeSyncOperation( operationSystemName: "OperationName", operationBody: body, customResponseType: MyResponse.self // type of your custom response model) { result in switch result { case let .success(response): // handle response here // response is type of MyResponse case let .failure(error): print(error.errorDescription) } }
Расшифровка ответа
OperationResponse - модель, которая имеет в себе перечисление всех возможных полей ответа от сервера. Все поля опциональны.
MindboxError - модель ошибки, которую возвращает Mindbox. Возможные вариации ошибок от сервера:
validationError содержит в себе модель ValidationError. Указывает на поля, которые были заполнены неправильно.
protocolError - содержит в себе модель ProtocolError. Возвращается в случае ответа от сервера со статусами 4XX а также некоторые ошибки 5XX.
serverError - возвращается в случае 5ХХ статуса без данных от сервера.
connectionError - ошибка запроса по причине соединения.
invalidResponse - возвращается в случае невалидного ответа от сервера.
internalError - указывает на ошибки конфигурации Mindbox, ошибки декодирования ответа и прочие.
unknown - возвращается в случае непредвиденного поведения со вложенным типом Error.
Для отладки ошибок используйте параметр errorDescription.
Конструктор тела запроса
Для создания тела запроса в Mindbox нужно использовать структуру OperationBodyRequestType
Для упрощения интеграции в SDK есть конструктор тела запроса OperationBodyRequest, который реализует эту структуру и дает возможность заполнить все стандартные поля запроса
Пример использования конструктора
Пример использования конструктора
let body = OperationBodyRequest()body.viewProduct = .init( productGroup: .init(ids: ["website": "test-1"]), customerAction: .init(customFields: ["string": "test"]))
Если в конструкторе тела запроса нет нужных полей, вы можете объявить свой класс-наследник от OperationBodyRequest и сделать override метода encode
Swift
class CustomOperationBodyRequest: OperationBodyRequest { var field: String? // override this method when using inheritance override func encode(to encoder: Encoder) throws { // call super.encode(to:) try super.encode(to: encoder) var container = encoder.container(keyedBy: Keys.self) // encode to container new fields try container.encode(field, forKey: .field) } // provide keys for encoding enum Keys: String, CodingKey { case field }}