REST API (OData): как за один ХТТП-запрос обновить объект БД, не зная его ГУИД?

1. Cyberhawk 135 19.01.17 21:35 Сейчас в теме
Обновление объекта ПУТ-/ПАТЧ-запросом, зная его ГУИД, проверил - работает: https://its.1c.ru/db/v838doc#bookmark:dev:TI000001374

А как за один ХТТП-запрос обновить объект, используя поиск по значению реквизита объекта?
Сделал ПАТЧ-запрос для объекта с поиском не по ГУИДу, добавив в "заголовок" (а вернее в URL) параметры $filter и $top.
По итогу ГЕТ-запрос с такими параметрами возвращает мне несколько или один элемент <entry> (объект, удовлетворяющий отбору).

А вот в ПАТЧ-запросе вываливается ошибка с кодом 19: "Использованный HTTP метод запрещен в данном контексте" https://its.1c.ru/db/v839doc#bookmark:dev:TI000001367

Пока делаю вывод, что за один ХТТП-запрос нельзя обновить объект БД, не зная его ГУИДа: нужно сначала ГЕТ-запросом получить ГУИД объекта, а затем уже изменять его ПАТЧ-/ПУТ-запросом.
Если кто-то достиг результата за один ХТТП-запрос - поделитесь.
+
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. starik-2005 3036 19.01.17 23:14 Сейчас в теме +3 $m
(1) на сколько мне известно, PATCH используется для частичной модификации существующего объекта, на который указывает некий Request-URI. Если он, типа, ни на что не указывает, то может быть создан новый документ - это приведено в спецификации HTTP 1.1 тут: https://tools.ietf.org/html/rfc5789

Фактически, на сколько я могу понять из приведенного по сцылке документа, PATCH частично модифицирует очень конкретный документ, а не их группу.
omut; +1
4. Cyberhawk 135 22.01.17 19:27 Сейчас в теме
(2)
PATCH частично модифицирует очень конкретный документ, а не их группу
Ну, Я тоже хочу модифицировать очень конкретный объект (пусть будет документ). ГЕТ-запрос, ищущий по значению реквизита ($filter), возвращает мне один конкретный объект БД - проверено.
+
3. ture 606 20.01.17 09:34 Сейчас в теме
(1) надо в начале получить его гуйд через что-то
+
5. Cyberhawk 135 22.01.17 19:29 Сейчас в теме
(3)
надо в начале получить его гуйд через что-то
Есть идеи, как сделать получение ГУИДа (поиск по значению реквизита / реквизитов) и изменение объекта БД в рамках одного ХТТП-запроса?
+
7. ture 606 23.01.17 08:56 Сейчас в теме
(5) ну получи какой-нибудь "служебный" объект (ну скажем, помеченный на удаление), а из него найди и поменяй нужный перед записью что ли.
+
10. Cyberhawk 135 23.01.17 10:02 Сейчас в теме
(7) Не понял, как все это можно сделать через стандартный интерфейс ОДата инфобазы 1С. Вероятно, все-таки речь идет о создании своего ХТТП-сервиса, о чем намекает и (8)?
+
12. ture 606 23.01.17 10:06 Сейчас в теме
(10) тебе не хватает гуйда, ну так возьми произвольный (чтоб ему соответствовал не нужный элемент или док), оказавшись в этом "служебном" найди нужный и перенеси действие на него в процедуре передзаписью.
+
8. starik-2005 3036 23.01.17 09:59 Сейчас в теме
(5) написать свой HTTP-сервис и не парить моск окружаюшчим.
+
11. Cyberhawk 135 23.01.17 10:05 Сейчас в теме
(8) Не хотелось бы заниматься какими-либо манипуляциями с целевой инфобазой (снимать ее с замка или подсовывать ей расширение конфигурации)
+
13. ture 606 23.01.17 10:07 Сейчас в теме +3 $m
(11) а, так она на поддержке значит.... ух, придется заменить механизм тогда.
+
6. spacecraft 22.01.17 20:32 Сейчас в теме
(1) это невозможно в принципе. Иначе будет нарушен стандарт OData.
Operations allow the execution of custom logic on parts of a data model. Functions do not allow side effects and are composable. Actions allow side effects and are not composable. Actions and functions are global to the service and MAY be used as members of entities and collections of entities.


А в чем смысл одновременного получения и обновления?
+
9. Cyberhawk 135 23.01.17 10:00 Сейчас в теме
(6)
в чем смысл одновременного получения и обновления?
Ну, не одновременного, а последовательного, но в рамках одного ХТТП-запроса. Просто мне кажется, что один ХТТП-запрос лучше двух: как в плане нагрузки на инфобазу и веб-сервер, так и в плане удобства для источника ХТТП-запроса, ведь выполняется конретная "точечная" задача (обновления первого попавшегося объекта БД, найденного по реквизитам поиска) и разбивать ее на две (сначала поиск и получение ключа, затем обновление по ключу) просто кажется излишним...
+
14. zoomzd1234 23.01.17 18:13 Сейчас в теме +4 $m
Кратко: POST — создание, PUT — обновление
Авторитетного источника применительно к REST не будет, так как REST, строго говоря, не определяет ни POST, ни PUT. REST просто допускает использование HTTP. Следовательно наиболее авторитетный источник по поводу POST/PUT — это спецификация HTTP 1.1:

The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line.

The PUT method requests that the enclosed entity be stored under the supplied Request-URI.

То есть POST используется для создания подчиненной сущности, а PUT для сохранения сущности.
POST в случае успеха всегда должен возвращать статус 201 (Created) и Location на новый ресурс.
PUT же может возвращать как 201 (если ресурс не найден), так и 204 (No Content) — если ресурс обновлялся.
+
15. ture 606 24.01.17 12:18 Сейчас в теме
(14)
HTTP 1.1

GET — получение ресурса
POST — создание ресурса
PUT — обновление ресурса
DELETE — удаление ресурса

WebDAV - расширение к http содержит еще больше методов для совместной работы над объектом.
+
16. zoomzd1234 24.01.17 13:51 Сейчас в теме
(15)The PUT method requests that the enclosed entity be stored under the supplied Request-URI.

То есть POST используется для создания подчиненной сущности, а PUT для сохранения сущности.
POST в случае успеха всегда должен возвращать статус 201 (Created) и Location на новый ресурс.
PUT же может возвращать как 201 (если ресурс не найден), так и 204 (No Content) — если ресурс обновлялся.
+
17. ture 606 24.01.17 13:58 Сейчас в теме
(16) Верно. И есть еще больше команд в WebDAV.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот