Обработка сложных POST/PATCH запросов в RESTful API
-
Upload
fightmaster -
Category
Documents
-
view
941 -
download
0
description
Transcript of Обработка сложных POST/PATCH запросов в RESTful API
![Page 2: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/2.jpg)
ProFIT
Dmitry Petrov
Система управления производственными
процессами типографии
Product Fulfillment and Information Tracking
![Page 3: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/3.jpg)
ProFIT
Dmitry Petrov
Ежедневно:~ 1 000 заказов~1 000 000 печатной продукции1 час простоя ~ 25 000$
Product Fulfillment and Information Tracking
![Page 4: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/4.jpg)
RESTful API
Dmitry Petrov
~ 60 entity~100 API endpointsСложная бизнес логика
RESTful API для ProFIT
![Page 5: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/5.jpg)
Dmitry Petrov
GET /api/orders/12/items/fg45sf54Ответ сервера:{
"id": "fg45sf54",
"url": "http://localhost/api/orders/12/items/fg45sf54",
"product": "business cards",
"quantity": 1000,
"previews": {
"front": {
"large": "http://localhost/large/front.jpg",
"medium": "http://localhost/medium/front.jpg",
"small": "http://localhost/small/front.jpg",
},
"back": {
"large": "http://localhost/large/back.jpg",
"medium": "http://localhost/medium/back.jpg",
"small": "http://localhost/small/back.jpg",
}
}
}
GET /api/orders/12Ответ сервера:{
"id": 12,
"url": "http://localhost/api/orders/12",
"client": {
"firstname": "Dmitry",
"lastname": "Petrov",
"email": "",
"phone": null,
"address": {
"country": "Russia",
"city": "Saratov",
"zip": 123456,
"street": "Vavilova",
"residentional": false
}
}
}
RESTful API, примеры GET
![Page 6: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/6.jpg)
Dmitry Petrov
GET /api/product-box-types/12-type/associationsОтвет сервера:[
{
"id": 1,
"product": "business_cards",
"quantity": 1000
},
......
]
GET /api/machines/KARAT+1/hot-foldersОтвет сервера:[
{
"path":"/home/somepath/",
"types": [
"34-f-Type",
"33-S-Type",
......
]
},
......
]
GET /api/press-sheets/134/labelОтвет сервера:{
"label": "epl string"
}
RESTful API, примеры GET
![Page 7: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/7.jpg)
Dmitry Petrov
POST http://localhost/api/press-sheets/12/transitionТело запроса:{
"transition": "start:printing:front",
"note": null
}
POST http://localhost/api/orders,PUT http://localhost/api/orders/12Тело запроса:{
"id": 12,
"client": {
"firstname": "Dmitry",
"lastname": "Petrov",
"email": "",
"phone": null,
"address": {
"country": "Russia",
"city": "Saratov",
"zip": 123456,
"street": "Vavilova",
"residentional": false
}
}
}
RESTful API, примеры POST / PUT
![Page 8: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/8.jpg)
Dmitry Petrov
PATCH http://localhost/api/orders/12Тело запроса:{
"client": {
"email": "",
"phone": null
}
}
PATCH http://localhost/api/orders/12Тело запроса:{
"client": {
"email": ""
},
"address": {
"street": "Vavilova",
"residentional": true
}
}
Объект:{
"id": 12,
"client": {
"firstname": "Dmitry",
"lastname": "Petrov",
"email": "[email protected]",
"phone": "8-888-999",
"address": {
"country": "Russia",
"city": "Saratov",
"zip": 123456,
"street": "Vavilova",
"residentional": false
}
}
}
RESTful API, примеры PATCH
![Page 10: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/10.jpg)
DTO
Dmitry Petrov
Data Transfer Object
DTO
attribute1: String
attribute2: String
Assembler
createDTO
updateDomainObjectserialize
deserialize
DomainObject1
attribute1: String
DomainObject2
attribute2: String
![Page 11: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/11.jpg)
Dmitry Petrov
GET /api/orders/12Ответ сервера:{
"id": 12,
"url": "http://localhost/orders/12",
"client": {
"firstname": "Dmitry",
"lastname": "Petrov",
"email": "",
"phone": null,
"address": {
"country": "Russia",
"city": "Saratov",
"zip": 123456,
"street": "Vavilova",
"residentional": false
}
}
}
Примеры DTO
![Page 12: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/12.jpg)
Dmitry Petrov
{
"transition": "start:printing:front",
"note": null
}
{
"label": "epl string"
}
[
{
"path":"/home/somepath/",
"types": [
"34-f-Type",
......
]
},
......
]
Примеры DTO
![Page 13: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/13.jpg)
Dmitry Petrov
Уменьшение количества запросовНезависимость от API"Заставляет думать"
Преимущества паттерна DTO
![Page 14: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/14.jpg)
Dmitry Petrov
FOSRestBundleJMSSerializerBundle LiipHelloBundleFOSCommentBundle
Популярные бандлы и примеры
![Page 15: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/15.jpg)
Dmitry Petrov
GET /api/orders/12Ответ сервера:{
"id": 12,
"url": "http://localhost/api/orders/12",
"client": {
"firstname": "Dmitry",
"lastname": "Petrov",
"email": "",
"phone": null, "address": {
"country": "Russia",
"city": "Saratov",
"zip": 123456,
"street": "Vavilova",
"residentional": false
}
}
}
JMSSerializerBundle & GET метод
![Page 16: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/16.jpg)
Dmitry Petrov
POST /api/orders,Тело запроса:{
"id": 12,
"client": {
"firstname": "Dmitry",
"lastname": "Petrov",
"email": "",
"phone": null,
"address": {
"country": "Russia",
"city": "Saratov",
"zip": 123456,
"street": "Vavilova",
"residentional": false
}
}
}
JMSSerializerBundle & POST метод
![Page 18: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/18.jpg)
Dmitry Petrov
$this->deserialize($request, 'Rest\OrderDTO', 'json');
JMSSerializerBundle
![Page 21: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/21.jpg)
Dmitry Petrov
PATCH /api/orders/12Request:{
"client": {
"email": "",
"phone": null }
}
JMSSerializerBundle & PATCH метод
![Page 22: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/22.jpg)
Проблемы / Минусы
Dmitry Petrov
GET - сериализация null значенийPATCH - десериализация в объектPATCH - merge null значенийMERGE - много бесполезного кода
RESTful API, JMSSerializerBundle
![Page 23: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/23.jpg)
Dmitry Petrov
SimpleThingsFormSerializerBundle
15 июля 2012
SimpleThingsFormSerializerBundle
![Page 25: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/25.jpg)
Dmitry Petrov
GET /api/orders/12Ответ сервера:{
"id": "12",
"url": "http://localhost/orders/12",
"client": {
"firstname": "Dmitry",
"lastname": "Petrov",
"email": "",
"phone": "",
"address": {
"country": "Russia",
"city": "Saratov",
"zip": "123456",
"street": "Vavilova",
"residentional": "false"
}
}
}
SimpleThingsFormSerializerBundle
![Page 26: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/26.jpg)
Проблемы / Минусы
Dmitry Petrov
Конвертирование данных в stringОтсутствие поддержки PATCH (v. 2.0)
Идеологическая неприязньГрязная смесь *Type и *DTO
SimpleThingsFormSerializerBundle
![Page 30: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/30.jpg)
Требования
Dmitry Petrov
(Де)Сериализация объектовСохранение типа у данныхКеширование метаданных
Изобретаем велосипед
![Page 31: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/31.jpg)
Допущения
Dmitry Petrov
Выходной формат jsonМетадата хранится в ymlВсегда есть get/set методы
Изобретаем велосипед
![Page 32: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/32.jpg)
Через 36 часов...поезд Саратов - Киев идет 30 часов
Dmitry Petrov
SimpleSerializerSimpleSerializerBundle
Подробности можно прочитать на хабре
Изобретаем велосипед
![Page 33: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/33.jpg)
Преимущества
Dmitry Petrov
БиблиотекаРазделение правил сериализации от форматаОтсутствие озвученных минусов"Интеллектуальная" десериализация
SimpleSerializer
![Page 36: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/36.jpg)
Что? Где? Когда?
Dmitry Petrov
Параметры запросовОбъекты передачи данныхБизнес-логика
RESTful API, валидация
![Page 37: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/37.jpg)
Параметры запросов
Dmitry Petrov
/api/orders/12/api/boxes/BOX-1-1/api/orders?valid=true
RESTful API, валидация
![Page 43: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/43.jpg)
Dmitry Petrov
PATCH /api/orders/12Тело запроса:{
"client": {
"email": "",
"comment": "I'm hacker" }
}
Объект:{
"id": 12,
"client": {
"firstname": "Dmitry",
"lastname": "Petrov",
"email": "[email protected]",
"phone": "8-888-999",
"address": {
"country": "Russia",
"city": "Saratov",
"zip": 123456,
"street": "Vavilova",
"residentional": false
}
}
}
RESTful API, валидация
![Page 44: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/44.jpg)
Dmitry Petrov
POST /api/press-sheets/12/transitionТело запроса:{
"transition": "start:printing:front",
"note": null,
"comment": "I'm hacker"}
POST /api/press-sheets/12/transitionТело запроса:{
"transition": "start:printing:front",
"comment": "I'm hacker"}
Объект:{
"transition": "start:printing:front",
"note": null
}
RESTful API, валидация
![Page 45: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/45.jpg)
Dmitry Petrov
Как, где и когда обрабатывать эти ситуации?
RESTful API, валидация
![Page 46: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/46.jpg)
Dmitry Petrov
REST APIs with Symfony2: The Right Way
![Page 47: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/47.jpg)
Dmitry Petrov
Недостатки
РутиностьДублирование кода Работает лишь как фильтр
REST APIs with Symfony2: The Right Way
![Page 48: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/48.jpg)
Dmitry Petrov
"Интеллектуальная"
десериализация3 режима десериализации:
Strict, Medium strict, Non-strict+
Поддержка групп
SimpleSerializer
![Page 51: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/51.jpg)
Behat, PHPUnit
Dmitry Petrov
Контроллеры
Data access layerService layer
RESTful API, тестирование
![Page 53: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/53.jpg)
Проблемы
Dmitry Petrov
Время выполнения:Behat ~ 90 минутPHPUnit ~ 5 минут
RESTful API, тестирование
![Page 54: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/54.jpg)
WSSE
Dmitry Petrov
Atom AuthenticationHow to create a custom Authentication ProviderEscapeWSSEAuthenticationBundle (v. 2.0)
MopaWSSEAuthenticationBundle (v. 2.1)
RESTful API, аутентификация
![Page 55: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/55.jpg)
WSSE Header
Dmitry Petrov
X-WSSE: UsernameToken Username="bob",
PasswordDigest="quR/EWLAV4xLf9Zqyw4pDmfV9OY=",
Nonce="d36e316282959a9ed4c89851497a717f",
Created="2003-12-15T14:43:07Z"
RESTful API, аутентификация
![Page 56: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/56.jpg)
Password digest
Dmitry Petrov
Base64 (SHA1 (Nonce + CreationTimestamp + Password))
RESTful API, аутентификация
![Page 58: Обработка сложных POST/PATCH запросов в RESTful API](https://reader034.fdocuments.net/reader034/viewer/2022052622/558e923a1a28abbd758b4638/html5/thumbnails/58.jpg)
Вопросы?
Dmitry Petrov
@old_fightmaster
RESTful API
https://github.com/opensofthttps://github.com/fightmaster
Отдельное спасибо команде ProFIT