Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Вопрос к знатокам HTTP сервисов

Вопрос к знатокам HTTP сервисов
Я
   andryscha1c
 
26.08.21 - 10:27
Есть произвольный http сервис и реализован следующий обработчик для регистрации платежей // плательщиком
Опишите что бы вы изменили в коде ниже? Корректно ли все?

Функция paymentsPOST(Запрос) // Запрос - HTTPЗапрос
    Токен = Запрос.Заголовки.Получить("Token");
    Если Токен = Неопределено Тогда
        Возврат Новый HTTPСервисОтвет(400);    
    КонецЕсли;    
    Плательщик = Справочники.Плательщики.НайтиПоРеквизиту("Токен", Токен);
    Если Плательщик.Пустая() Тогда
        Возврат Новый HTTPСервисОтвет(403);    
    КонецЕсли;    
    ЧтениеJSONДанных = Новый ЧтениеJSON;
    РезультатHTTPЗапроса = Запрос.ПолучитьТелоКакСтроку();
    ЧтениеJSONДанных.УстановитьСтроку(РезультатHTTPЗапроса); //Запрос.ПолучитьТелоКакСтроку());
    Структура = ПрочитатьJSON(ЧтениеJSONДанных);
    ЧтениеJSONДанных.Закрыть();     
    Если Структура.Свойство("amount")  = Неопределено Тогда
        Возврат Новый HTTPСервисОтвет(400);    
    КонецЕсли;    
    Попытка
        НовыйПлатеж = Документы.Платеж.СоздатьДокумент();
        НовыйПлатеж.Дата        = ТекущаяДата();
        НовыйПлатеж.Плательщик    = Плательщик;
        НовыйПлатеж.Сумма        = Структура.amount;
        // ...
        НовыйПлатеж.Записать(РежимЗаписиДокумента.Проведение);
    Исключение
        НовыйПлатеж.Записать(РежимЗаписиДокумента.Запись);
        Ответ = Новый HTTPСервисОтвет(400);
        Ответ.УстановитьТелоИзСтроки(ОписаниеОшибки(),КодировкаТекста.UTF8);
        Возврат Ответ;
    КонецПопытки;
    Возврат Новый HTTPСервисОтвет(201);
КонецФункции
   ДенисЧ
 
1 - 26.08.21 - 10:29
Ответ = Новый HTTPСервисОтвет(400);
Ответ.УстановитьТелоИзСтроки(ОписаниеОшибки(),КодировкаТекста.UTF8);

Тут не по феншую. Надо понимать, почему ошибка. И возвращать правильный код. От 403, 404 до 500.
   Ёпрст
 
2 - 26.08.21 - 10:30
(0)

вот это за гранью добра

 Попытка
        НовыйПлатеж = Документы.Платеж.СоздатьДокумент();
        НовыйПлатеж.Дата        = ТекущаяДата();
        НовыйПлатеж.Плательщик    = Плательщик;
        НовыйПлатеж.Сумма        = Структура.amount;
        // ...

        НовыйПлатеж.Записать(РежимЗаписиДокумента.Проведение);
    Исключение

   Ёпрст
 
3 - 26.08.21 - 10:30
запустил значится это изделие N-раз, слепили N-документов
   Ёпрст
 
4 - 26.08.21 - 10:31
В ответе, может быть и не json, и
 Структура = ПрочитатьJSON(ЧтениеJSONДанных); эта шляпа может в исключение вылететь
   Галахад
 
5 - 26.08.21 - 10:38
Разделить логику передачи данных и работы с объектами.
   maxx079
 
6 - 26.08.21 - 10:39
(0) Коды ошибок надо согласовать с разработчиками этого hhtp-сервиса - возвращать те коды, что они могут и будут обрабатывать.
Добавить описание ошибки, опять же при условии, будут ли они эти ошибки анализировать
Как уже упомянули - добавить проверку, что нужный документ уже был загружен ранее. В этом случае либо ничего не менять, либо сделать перезаполнение существующего документа, а не создавать новый.

(4) Проверку на json делать не обязательно. Если запрос сюда пробился, значит, он уже соответствует API.
А вот завернуть весь обработчик в Попытку-Исключение следует. Чтобы в случае любой нештатной ситуации вернуть ошибку.
   Garykom
 
7 - 26.08.21 - 10:46
(0) переписать нафуй нормально
лапшекод же, неужели сам не видишь

получение данных, обработка данных и отправка/возврат должны быть отделены
   PROGRAM1S
 
8 - 26.08.21 - 10:57
(0)
1. Если Токен = Неопределено Тогда
        Возврат Новый HTTPСервисОтвет(400);    
    КонецЕсли; 

Добавь в тело запроса ошибку, что нет токена в заголовках

2. чтение JSON оберни в попытку с возвратом ошибки 400 в случае исключения

3. Если ошибка возникла при проведении документа, то возвращай ошибку 500

4. Если запрос выполнился, то в теле запроса верни идентификатор созданного документа

5. лучше в модуле сервиса оставить только код по обработке запроса и формированию ответа, а код по созданию документа вынести в общий модуль или в модуль менеджера/объекта.
   acht
 
9 - 26.08.21 - 10:58
(6) > Если запрос сюда пробился, значит, он уже соответствует API.
С фига-ли? Это тебе не SOAP, где схема проверяется.
   acht
 
10 - 26.08.21 - 10:58
(8) Первый случай, это вообще 403 в чистом виде
   PROGRAM1S
 
11 - 26.08.21 - 11:00
(10) можно и 403, но в теле ответа написать, что нет заголовка "Token". Может сам токен есть, просто не туда засунули
   fisher
 
12 - 26.08.21 - 11:03
(8) +1
   Garykom
 
13 - 26.08.21 - 11:06
(8) >3. Если ошибка возникла при проведении документа, то возвращай ошибку 500

проводить онлайн в обработке запроса идеологически неправильно
правильно ставить в очередь и возвращать id задания, затем в фоне проводить и отдельный метод получения статуса задания-проведения
   Garykom
 
14 - 26.08.21 - 11:08
(13)+ как id задания логично использовать уид
   acht
 
15 - 26.08.21 - 11:10
(13) Только в случае тяжелого проведения. Иначе схлопочешь ситуацию, что затраты на два обращения и побочную запись/чтение в регистр превысят затраты на одно обращение.
   Garykom
 
16 - 26.08.21 - 11:18
(15) лучше сразу продумать и сделать правильно
иначе потом будет очень сложно отделить сервис и сделать чтобы в моменты регламентных операций (обновление конфы и прочее) сервис был доступен 24/7
   Галахад
 
17 - 26.08.21 - 11:22
(16) Хм. А как сделать сервис доступным во время "(обновление конфы и прочее)"?
   ДенисЧ
 
18 - 26.08.21 - 11:24
(17) Через прослойку. В виде отдельной 1с-базы. Которая тоже будет обновляться и прочее.
А чтобы от её обновлений защититься - сделать ещё одну.
   Галахад
 
19 - 26.08.21 - 11:26
(18) Ну про микросервис я догадывался. Но все же?
   acht
 
20 - 26.08.21 - 11:28
(19) Две базы и балансер. Обслуживание асинхронное.

Ну ладно, балансер на го, работающий на ардуине.
   Garykom
 
21 - 26.08.21 - 11:31
(20) про nginx не слыхал?
   Галахад
 
22 - 26.08.21 - 11:33
(20) (21) Хм. Примерно так и думал. :-)
   Garykom
 
23 - 26.08.21 - 11:43
(22) вторая база может быть как РИБ копией, так и "микросервисом" накопительным
   BeerHelpsMeWin
 
24 - 26.08.21 - 11:49
(16) Если база недоступна в моменты регламентных операций - то это проблемы того, кто к ней обращается.
   Garykom
 
25 - 26.08.21 - 11:51
(24) Если невозможно обеспечить доступность 24/7 следует с http/веб-сервисов переходить на очереди/брокеры сообщений
   BeerHelpsMeWin
 
26 - 26.08.21 - 11:59
(25) И если недоступен брокер сообщений, то это все равно проблемы того, кто к нему обращается.
   acht
 
27 - 26.08.21 - 12:03
   Дык ё
 
28 - 26.08.21 - 13:32
(0) Если Структура.Свойство("amount")  = Неопределено Тогда

так не бывает
   fisher
 
29 - 26.08.21 - 13:44
(16) > лучше сразу продумать и сделать правильно
Главное, чтобы это "правильно" не было оверинженирингом.
Асинхронность добавляет сложности и добавляет неудобств. Поэтому сразу пихать ее во все дыры на случай когда через сто лет это окупится, если компания в 200 раз вырастет - такое себе.
   fisher
 
30 - 26.08.21 - 13:53
На практике удобно и чаще всего достаточно делать на синхронных, но быстрых операциях. По возможности без блокировок. Тяжелые проведения ессно не очень разумно выполнять синхронно. Но и это может быть допустимо. От ситуации зависит. В качестве компромисса иногда допустимо синхронно писать, а проводить уже очередью.
 
 


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.