HTTP — это не волшебство!

09.01.25

Интеграция - WEB-интеграция

Сегодня попытаемся узнать немного больше о протоколе HTTP и понять, почему он таков, каков есть, и больше никаков.

HTTP-запросы и HTTP-сервисы - вероятно, главные инструменты интеграции 1С с другими системами на сегодняшний день. Однако при встрече с конкретной их реализацией, будь то в рабочих базах или сторонних решениях, зачастую складывается впечатление, будто механизмы для работы с данным протоколом представляют из себя не конкретные стройные функции, а фломастеры для хаотичного закрашивания клеток в "морском бое" против стороннего API или внешнего клиента. Победой же считается запихивание всех известных миру заголовков в свой запрос и перебор всех вариаций формирования тела запроса до тех пор, пока не вернется код 200

В этой статье не будет каких-то особенных срывов покровов, но мы постараемся окунуться немного глубже в понимание этого популярного стандарта, чтобы реализация обмена стала чуть менее хаотичной и чуть более осмысленной

 

Что нужно знать для понимания этой статьи: зачем используются HTTP-запросы и что запрос состоит из метода (GET, POST, PUT и пр.), кода состояния (404), заголовков и тела (необязательно). Подразумевается, что вы уже работали с HTTP в платформе 1С или где-то еще



HTTP — надстройка над TCP


Почему HTTP — это не волшебство? Потому что волшебство — это TCP

TCP (Transmission Control Protocol) — это протокол транспортного уровня, который отвечает за передачу данных между двумя узлами в сети. Его задача — установить соединение, передать данные и гарантировать их доставку в правильном порядке. Когда мы используем нечто вроде HTTPЗапрос и HTTPСоединение.ОтправитьДляОбработки(), то основная работа, а именно передача данных, выполняется на уровне TCP.

Нам не обязательно знать, как он работает в деталях — достаточно того, что это древнее как мир описание порядка действий по установке соединения и обмена пакетами для сетевого взаимодействия с обозначением, какой блок информации где расположен и сколько должен весить. Едва ли кому-то из нас придется погружаться на настолько низкий уровень абстракции и реализовывать его руками

Но что тогда такое HTTP? Это протокол прикладного (более высокого) уровня, который описывает, как клиент и сервер должны взаимодействовать при передаче данных. Т.е. он определяет формат сообщения, которое передается по TCP, а также как и в каком порядке его понимать при получении.

Если рассмотреть весь процесс целиком, то когда вы отправляете HTTP-запрос:

  1. HTTP формирует запрос (заголовки, тело и метод, например, GET /index.html HTTP/1.1).
  2. TCP берет этот запрос и разбивает его на пакеты.
  3. Пакеты отправляются на сервер, где TCP собирает их обратно в единое сообщение.
  4. Сервер обрабатывает HTTP-запрос (исходя из того, что он построен по правилам HTTP) и формирует ответ.
  5. Ответ передается через TCP обратно клиенту.

 

TCP — это курьер, HTTP — посылка с инструкцией. Вариаций таких "посылок с инструкцией" - они же протоколы over TCP, вообще, существует огромное количество: AMQP (у RabbitMQ), FTP, SMTP, SSH, MQTT и пр. Все они отличаются форматом содержимого ("посылкой") и способом его разбора ("инструкцией"), но не способом доставки. Но так как речь у нас идет о работе с HTTP в 1С, а значит с уже реализованными внутри платформы готовыми функциями даже "инструкция" нас не интересует — отличие лишь в содержимом, а разбором занимается платформа 

Важно лишь помнить, что такие понятия как "тело", "код состояния" и "заголовки" - это не более чем абстракции над единым блоком данных в TCP пакете. Просто кто-то подумал (вполне обоснованно), что это удобно иметь отдельно часть произвольных данных, часть, которая всегда ключ-значение и числовой показатель статуса в виде трехзначного числа. Но никакими особенными качествами или самостоятельными действиями они по отдельности не обладают. Но об этом далее


Сервер ждет лишь то, что прописано для него разработчиками

 

К чему нужен сказ про отношение HTTP к TCP? Главная идея заключается в том, что никаких волшебных преобразований в запросе и ответе, при добавлении туда информации или ее отправке не происходит 

Когда вы добавляете в запрос, например, заголовки, то они просто "складываются в стопку" как часть содержимого и переправляются по TCP на принимающую сторону. HTTP-сервер (вроде Apache или IIS) может предварительно разобрать пакет на код состояния, тело и заголовки, так, как это описано в стандарте. Но то, как этот конкретный разобранный набор данных далее обрабатывается, определяется сугубо алгоритмом, написанным бэкендерами для конкретного API: если использование каких-либо данных, отправленных вами, не предусмотрено разработчиками сервиса, то они будут просто проигнорированы. Сам стандарт не обязывает к обязательному поиску и обработке конкретных данных или отдельных наименований заголовков. Есть буквально 2 из них, которые гипотетически считаются обязательными - это Host и Content-Length для запросов с телом, но они, как правило, вообще зашиваются внутрь функции работы c HTTP, а их отсутствие все равно не приводит к 100% ошибке при работе

По идее, требования к наличию тех или иных данных должны быть перечислены в документации к конкретному API. Опять же: все это - лишь соглашение между разработчиками клиента и разработчиками сервера, с поправкой на некоторый усредненный стандарт, чтобы не изобретать каждый раз велосипед. Вы можете использовать любые свои заголовки с любой информацией (при реализации сервера), если другая сторона согласна с ними работать. Однако есть несколько правил, которые, как и многое в HTTP, нестрогие и носят рекомендательный характер, а именно:

  • Не создавать свои заголовки, если уже есть стандартные, подходящие по смыслу
  • Начинать нестандартные заголовки с префикса "X-"
  • Если заголовок не распознан, это не должно приводить к ошибкам

Подытожим к текущему моменту:

  • Данные передаются по TCP, но нас это не волнует, так как это делает платформа
  • Сообщение, которое передается по TCP, имеет формат, соответствующий стандарту HTTP. Сам стандарт HTTP описывает, как информация в сообщении должна быть собрана и как принимающая сторона должна его разобрать обратно в полезную информацию. Это тоже делает платформа, показывая нам лишь уже разобранный "полезный" объект типа HTTPЗапрос, HTTPОтвет или HTTPСервисОтвет
  • Обработка полезных данных не имеет строгих регламентов — лишь соглашения и "правила хорошего тона"

*Неожиданная рекламная пауза*

А множество (19) уже готовых решений для работы с онлайн сервисами вы можете найти в Открытом пакете интеграций! Это расширение для 1С, пакет для OneScript и консольное приложение с кучей готовых методов интеграции с такими сервисами как Bitrix24, Telegram, VK, Viber, Google Drive, Sheet, Yandex Disk, S3 и многими другими. Открыто, бесплатно и с подробной документацией!

Инфостарт Github (поставьте звездочку, пж :Р ) 

*Конец неожиданной рекламной паузы*


 

Соглашения по заголовкам

 

Как уже было рассмотрено, стандарт HTTP довольно мягкий по отношению к конкретным данным и не определяет большого количества строгих правил для разработчика, который работает поверх уже реализованного HTTP-клиента или сервера. Однако есть ряд мягких соглашений (рекомендаций), которые вероятно придется понимать для работы в качестве клиента и крайне желательно знать при реализации сервера, чтобы не причинять неудобства своим будущим пользователям

Во-первых, в стандарте есть перечень стандартных заголовков, которые желательно использовать именно так как это написано в стандарте. Это банально создает меньше путаницы — никто ведь не ожидает, что ему придется передавать пароль через заголовок, предназначенный для передачи размера содержимого

Во-вторых, так как для стандартных заголовков определено их назначение, большинство из них можно отнести к разным логическим категориям: заголовки запроса и заголовки ответа, заголовки клиентские и серверные и пр. Это важно, так как позволяет избежать добавления заголовков, которые априори не могут быть полезны в конкретной ситуации

Для лучшего понимания разберем часть заголовков, которые используются чаще всего и работают почти всегда, если сервис сделан с умом и по стандартам:

  • Accept - это клиентский заголовок, который можно передать серверу для определения MIME типа, ожидаемого в ответе. Например, если сервер может возвращать данные в XML и JSON, то указание в запросе Accept:application/json скажет серверу, что вы хотите JSON. В свою очередь, вы можете реализовать обработку данного заголовка на своем сервере для предоставления подобного функционала
  • Accept-Encoding - клиентский заголовок с указанием доступных алгоритмов сжатия. Если ваш клиент поддерживает прием сжатых данных (Коннектор, например, поддерживает gzip), а сервер может в сжатие данных, то размер трафика можно значительно снизить
  • Authorization - стандартный заголовок запроса для передачи авторизационных данных: логинов:паролей, токенов и пр.
  • Content-Type - универсальный заголовок, обозначающий, какой тип данных содержится в теле запроса или ответа
  • Content-Length - заголовок, обозначающий размер тела запроса или ответа. Некоторые сервера вообще не умеют принимать запросы с телом без этого заголовка. Желательно его указывать вообще всегда (если есть тело)
  • Location - стандартный заголовок ответа, если требуется перенаправление. Если вы обратились "немного не туда", но сервер понял, что вы хотели, то он может вернуть код 3хх и URL в это заголовке

Есть еще пачка популярных заголовков для работы с Web-приложениями, вроде Cookie, но для работы с API они не используются и мы их опустим. Повторюсь лишь еще раз, что описание этих заголовков в стандарте вовсе не означает, что они будут обработаны при работе с конкретным сервером. Также и ваш сервер не будет их обрабатывать, пока вы не пропишите этого в коде или не покрутите в настройках веб-сервера, вроде IIS, Apache, nginx (при наличии соответствующих настроек)

 

MDN ваш лучший друг!

Если в процессе работы с HTTP вы встретились с незнакомым заголовком или вообще попали на что-то непонятное, то попробуйте найти это на MDN Web Docs. Это такой большой справочник от Mozilla по всему Web-у и по HTTP с HTML в частности

Ссылка


 

О реализации сервера

 

В случае с клиентом вам придется подстраиваться под сервер. В случае же с сервером свободы больше, но больше и шанс сделать больно своим потенциальным пользователям. Вот некоторые моменты, учтя которые вы можете реализовать свой API (http-сервис) более прогнозируемым и понятным:

 

  • Код состояния - это важно. Теоретически, вы можете использовать в ответе код 200 на все случаи жизни, описывая ошибки в теле (в JSON например). Однако, как частый пользователь различных API, могу сказать - когда сервер так делает, это очень неудобно. Дело в том, что коды состояния — самые простые данные, получаемые из ответа и не требующие особенной обработки. Если я, например, не жду полезной нагрузки в ответе от сервера, то зачем мне проверять его содержимое при коде 200 (Успех)? Абсолютно незачем и многие HTTP-клиенты также опираются на код состояния как на важный элемент при обработке данных. Если же код не меняется в зависимости от ответа, то вы рискуете получить пользователя, свято уверенного, что все ОК, даже если все не ОК и текст ошибки возвращен в теле запроса или его заголовках
     
  • Старайтесь добавлять общепринятые заголовки в свои ответы. Нет ничего сложного в том, чтобы посчитать и добавить размер ответа в Content-Length или кодировку и тип данных в Content-Type. Однако это сделает работу с вашим API гораздо проще и комфортнее, а также уменьшит шанс появления проблем у клиентов, которые опираются на эти данные при разборе. Например, 1С использует UTF-8 для строк по умолчанию. UTF-8 - популярная кодировка, но это вовсе не означает, что какой-нибудь клиент не может использовать по умолчанию другую. И только заголовок может дать ему понять, что вместо его "родной кодировки" надо использовать конкретно UTF-8
     
  • По возможности избегайте собственных видов заголовков и не используйте заголовки, априори неподходящие под вид запроса. Добавление собственных видов заголовков — дело ответственное, по умолчанию подразумевающее наличие документации, где их смысл будет описан. Неподходящие же по виду запросы (клиентские в серверных ответах, заголовки ответа в запросах и пр.) в принципе не нужны ни для чего и просто являются мертвым грузом в ваших запросах — избегайте их (про виды запросов на MDN)
     
  • Добавьте сжатие. Сжатие помогает сильно уменьшить нагрузку на сеть как для вас, так и для клиента. В 1С вполне реализуем и deflate и gzip, а большинство современных клиентов вполне умеют их распаковывать обратно. В любом случае, заголовки позволяют делать сжатие опциональным: клиент прислал Accept-Encoding — сжимаем, не прислал — не сжимаем
     
  • Используйте JSON. Никто не любит XML

 

 

В заключение

 

HTTP является крайне гибким стандартом в вопросах передаваемых данных: как один из главных прикладных протоколов Интернета, будучи рассчитанным на максимальную универсальность, другим он быть просто не мог. Но обратная сторона подобной гибкости — возможность вольных интерпретаций, неограниченных обязательными условиями. И только соблюдение нестрогих, но рекомендованных решений позволяет создавать удобные и понятные сервисы, не вынуждающие пользователей для каждого нового API проходить все "как в первый раз". Не пренебрегайте ими

Спасибо за внимание!

 

Связанные статьи:

Глоссарий HTTP аутентификации: Basic, Bearer, OAuth и другие непонятные слова 

Рано или поздно каждый 1С разработчик сталкивается с задачей автоматизации работы со сторонним сервисом посредством RestAPI. Одними из основных (а, как правило - и самыми запутанными) элементами любой подобной автоматизации являются процессы авторизации и аутентификации. Токены, подписи, шифрование - как не потеряться во всем этом? Поможет данное краткое руководство

 

TCP-клиент в 1С

Новые методы в составе Открытого пакета интеграций для работы по протоколу TCP (в качестве клиента) на основе Native API компоненты на Rust.

web http обмен интеграция сервисы tcp

См. также

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL, 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    1918    2    0    

9

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Онлайн-заказ - это решение для автоматизации процесса оформления заказов на сайте в торговых организациях. Продукт обеспечивает легкое взаимодействие между компанией и клиентами через веб-интерфейс, интегрированный с 1С:Предприятие. Система позволяет снизить операционные расходы, повысить лояльность клиентов и оптимизировать работу отдела продаж.

57600 руб.

26.11.2024    1632    1    1    

4

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    18615    20    22    

18

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 1C:Бухгалтерия Управленческий учет Платные (руб)

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23): 1С:Управление торговлей, 1С:Управление Нашей фирмой 3, 1С:Комплексная автоматизация 2, Объединенное решение: Модуль 1С:CRM 3 (3.0.21.3) +1С:ERP Управление предприятием 2. При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

7200 руб.

04.05.2021    20764    13    19    

18

WEB-интеграция Программист Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    18409    53    50    

29

WEB-интеграция Программист Бизнес-аналитик Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    521    2    0    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bprogs 268 09.01.25 15:43 Сейчас в теме
По возможности избегайте собственных видов заголовков и не используйте заголовки, априори неподходящие под вид запроса.

однако существуют проблемы при отправке запросов header, c чем могут столкнутся все разработчики, нужно будет тоже как нибудь описать
2. bayselonarrend 2444 09.01.25 15:51 Сейчас в теме
(1) Не очень понял, о чем речь
3. bprogs 268 09.01.25 16:02 Сейчас в теме
(2) Проблема скорее косвенная а не в самом 1с, при работе с fastapi и передаче параметров через заголовок если переменная содержит нижнее подчеркивание my_id , почему то python переделывает ее на несуществующую, поэтому приходится отправлять без нижних подчеркиваний
4. uno-c 267 09.01.25 17:22 Сейчас в теме
главные инструменты интеграции 1С с другими системами на сегодняшний день

Опыт реализаций сотни интеграций с REST-API частных инфосистем показал, что это не волшебство, а квесты. То документация некорректная, то документация неполная, то ответ сервера об ошибке не соответствует содержанию ошибки, то ответ сервера обманывает насчет ожиданий сервера от отправленного ему запроса. А если какой-нибудь частный заграничный REST с ответом техподдержки через пару недель и при этом техподдержка поведет по ложному следу - то сидишь, представляешь себя в роли разработчика REST, и фантазируешь - что бы ты тут мог закодировать на его месте... та-дам, угадал, квест пройден. Самая фишка - когда в веб-интерфейсе функция реализована, а по документации REST типа ее нет, но пробуешь сделать по аналогии с веб-интерфейсом и вуаля - REST оказывается ее тоже умеет, кайф )
tyrgnet; bayselonarrend; +2 Ответить
5. pbelousov 39 09.01.25 17:26 Сейчас в теме
про код состояния 200....
а что ещё можно вернуть при ошибке???
1. далеко не любой код можно вернуть. многое - забреют.
2. кто-то придумал возвращать код 500, или 404 при ошибке,
только это форменный ужас!!!
- вот как его отличить от стандартных ошибок ( таймаут, нет сети...)

вот, например, мне сервис выдаёт код 500 при ошибке,
а я думаю, что это в сети перебои, и начинаю повторные попытки делать....

т.е. про код не 200 - я бы категорически не согласился!
нужно возвращать всегда 200 - значит сервис ЖИВОЙ !
а уже в нём - ответ с флагом ошибки, либо успешный. имхо.
SlavaKron; +1 6 Ответить
6. bayselonarrend 2444 09.01.25 17:31 Сейчас в теме
(5) Коды состояния - это часть стандарта. Если бы было правильно всегда возвращать 200, то никаких кодов состояния не было. 500 - это действительно сбой оборудования, но коды от 400 до 499 - это вполне себе ошибки данных. Любой из них по умолчанию подразумевает, что сервис живой, а ошибка в запросе - и у каждого из них в стандарте конкретно прописано обозначение вида ошибки
7. pbelousov 39 09.01.25 17:46 Сейчас в теме
(6) коды 400-499 могут не доходить до получателя, т.к. обрезаются либо подменяются на любом промежуточном узле транспортного протокола.
это факт!. сам проверял из разных диапазонов, а также табличку стандартных кодов.
очень там всё интересно получается.

где-то в настройках можно что-то подправить, но чем дальше получатель от сервиса - тем больше вероятность, что нужный код не дойдёт.

Имхо, - коды предназначены "не для внутренней логики сервиса", а для транспорта!
так что такое поведение, а также возможная подмена кода на любом узле - вполне приемлемо.

так что в своих сервисах я возвращаю флаг ошибки в теле ответа.
не хочу, чтобы ответ портился транспортными заморочками.
10. bayselonarrend 2444 09.01.25 18:18 Сейчас в теме
(7)> коды 400-499 могут не доходить до получателя, т.к. обрезаются либо подменяются на любом промежуточном узле транспортного протокола.

Не очень понимаю, как на уровне транспортного протокола может что-то меняться, причем не ломать пакеты, а прямо выборочно из payload доставать именно код и подменять другим. Но в таком случае мне даже интересно, какой код приходит

Если же речь о том, что идет обращение к сервису, который внутри вызывает другой сервис, то это проблема логики обработчиков
12. pbelousov 39 09.01.25 20:41 Сейчас в теме
(10)
Не очень понимаю, как на уровне транспортного протокола может что-то меняться


а кто, например, возвращает код 404? ну не клиентская же логика.
может и запрос дошел, и сервис даже что-то хорошее уже ответил, но тут у клиента что-то оборвалось...

вот табличка кодов из википедии, по которой я на практике проверял, какие коды проходят, какие нет.
их буквально несколько штук. 200 и ещё парочка из 2хх - к сожалению, не помню уже сейчас :(

https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D­0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%­D0%B8%D1%8F_HTTP

кстати, несколько раз её внимательно прочитал, и начал осознавать, что нигде не сказано о том,
что коды 4хх и 5хх должна возвращать "собственная логика сервиса".

напротив, - каждый код означает что-то конкретное, и предназначен, аналогично 404, чтобы транспорт ответил кодом - причину неисправности.

иными словами - транспорт (прокси, или кто ещё там....) не получив успешный код (200 и т.д.), - вставляет в ответ свой код неисправности, таким образом затирая код ответа от сервиса.
13. bayselonarrend 2444 09.01.25 20:45 Сейчас в теме
(12)
Прикрепленные файлы:
14. bayselonarrend 2444 09.01.25 20:47 Сейчас в теме
(12) Мы просто в разных терминах обсуждем, называя разные вещи одинаковыми словами
15. bayselonarrend 2444 09.01.25 21:03 Сейчас в теме
(12) Когда я говорю про транспортный уровень, я имею ввиду TCP - т.е. транспортный протокол, потому что сам HTTP вообще за передачу данных по сети не отвечает. HTTP - это, грубо говоря, правила запаковки и распаковки данных: соглашение, что у нас есть всегда сколько-то байт кода статуса, далее заголовки, тело и в каком порядке это все лежит в пакете, чтобы на другой стороне можно было правильно по этим же правилам все разобрать обратно

Если под транспортом подразумевается прокси или веб-сервер принимающие/перенаправляющие трафик - то это тоже является "собственной логикой сервиса", так как особенной разницы между тем, напишите вы этот самый прокси своим кодом или возьмете готовое решение нет - это тоже код, работающий с http (т.е. на прикладном уровне, а не на транспортном). И в таком случае да - код может быть перезаписан. Но опять же: полностью написанный с нуля код или код, написанный другими людьми с вынесенными настройками, которы вы можете крутить - это все равно прикладная логика вашего сервиса

А TCP - тот, который как раз транспорт-транспорт, на коды HTTP (т.е. просто данные в пакете, такие же как тело и заголовки) влиять не может. Для него любые пакеты, собранные по правилам HTTP или там FTP, SMTP и пр. вообще ничем не отличаются и являются просто потоком байтов
dsdred; adwas777; +2 Ответить
45. starik-2005 3098 28.01.25 10:35 Сейчас в теме
(15)
транспортный уровень
Ужас. Что только не прочитаешь на сайте матерых адинэссников...
8. Трактор 1261 09.01.25 18:06 Сейчас в теме
(6)
500 - это действительно сбой оборудования

Схрена ли гости понаехали?

500 Internal Server Error
На сервере произошла ошибка, в результате которой он не может успешно обработать запрос.

Внутренняя ошибка это и ошибка в моём коде. Как её ещё обозначать?
507, 508 самые те коды, которые должен возвращать 1С при внутренней ошибке.
9. bayselonarrend 2444 09.01.25 18:12 Сейчас в теме
(8) Да, я неправильно выразился. Я имел ввиду, что ошибка сервиса это 5хх т.е ошибка, в которой виноват не отправитель запроса. А 4хх это именно проблема в данных запроса. Посыл был в том, что 4хх обозначает то, что сервер живой точно так же, как и 200 и всегда отправлять 200 как «не 500» не обязательно
22. webester 26 20.01.25 13:40 Сейчас в теме
(5) Садишься пишешь, красивый код, который анализирует ответы, грамотно раскладывает логику, подкладываешь аллерты под все варианты. Потом получаешь ошибку, которой быть не может. В том месте в котором ее быть не может. Долгое расследование на обоих сторонах а тебе говорят, ах да наш сервис всегда возвращает 200. У них код от моего запроса падает, но никто не в курсе - все обернуто в исключение которое возвращает 200. Хочется взять палку и больно ударить за такое. Весь мир уже договорился, что должен отвечать сервер. Но не 1сники у нас свой пусть и обязательно не самый прямой.
starik-2005; bayselonarrend; +2 Ответить
23. SlavaKron 20.01.25 13:44 Сейчас в теме
(22) А меня наоборот бесят 1С-ники, которые завязывают логический ответ на коды состояния HTTP.
24. webester 26 20.01.25 13:45 Сейчас в теме
25. SlavaKron 20.01.25 13:47 Сейчас в теме
(24) Потому что коды состояния не для 1С были сделаны. Заминусованный комменатрий в общем-то на это уже ответил. Я хочу получить ответ по "логике", а не техническое состояние.
26. webester 26 20.01.25 13:51 Сейчас в теме
(25)И не для питона и не для с и не для подставьте сюда, любой клиент яп или клиент который вам нравится. Они были придуманы, чтобы понять насколько был успешен запрос. И если в результате запроса код упал, должна быть ошибка 500, чтобы я знал, что мне надо стучать разрабам на ту сторону. А не курить выражение. "Транзакция не может быть завершена" или подобное, думая где ты ошибся с параметрами. Если сообщение имеет код 200, значит уже все хорошо и произошло то, что ожидалось. Для этого и были придуманы коды ответа. А не для браузера там или питона или кого-то еще.
28. SlavaKron 20.01.25 13:56 Сейчас в теме
(26) Не убедительно. 1С-ник не обязан знать коды ответов. Проблема того, что перемешиваются низкоуровневые ответы и ответы 1С была озвучена. Как же часто разработчики из других систем, кичясь своими знаниями сторонних ООП, тащят это барахло в 1С.
30. bayselonarrend 2444 20.01.25 13:57 Сейчас в теме
(28) Стандарт - это стандарт. То, что кто-то не хочет по ним работать это не проблема стандартов
33. webester 26 20.01.25 14:02 Сейчас в теме
(28)
Не убедительно.
1С-ник не обязан знать коды ответов. То есть если какой-нибудь центробанк будет вам возвращать 301, вы не сможете получить курс валют, ибо "не обязан"? А что такое http значит обязан знать? И http не из других систем притащили "кичясь своими знаниями"? То есть про технологию знать не противно, а про стандарты на которых она построена противно? Как то вы избирательно кривитесь. Не совсем понял, причем здесь ООП?
bayselonarrend; +1 Ответить
35. SlavaKron 20.01.25 14:08 Сейчас в теме
(33) Ваш коллега уже задал вопросы про коды. Если сервис вернёт код, отличный от 200, то я отдам проблему админам.
То есть про технологию знать не противно, а про стандарты на которых она построена противно?
Я не знаю как работают http-сервисы на низком уровне, – есть объект 1С в рамках которого я и веду разработку. Мне просто хотелось бы чтобы сервисы не смешивали логический и технический (веб-сервер, сеть, что там ещё бывает?) ответ.
36. webester 26 20.01.25 14:09 Сейчас в теме
(35)
Если сервис вернёт код, отличный от 200, то я отдам проблему админам.

Они посмотрят и скажут - тут написано - временно твои данные находятся по другому адресу - вот тебе код "Перемещено" и ссылка куда в теле письма. Ты, что редирект обработать самостоятельно не можешь?
37. SlavaKron 20.01.25 14:11 Сейчас в теме
(36)
Ты, что редирект обработать самостоятельно не можешь?
Ок, редирект возьму на себя. Что еще?
38. bayselonarrend 2444 20.01.25 14:17 Сейчас в теме
(35) Для проблем с сетью и оборудованием специально сделаны коды 5хх. Если код 5хх - то это либо ошибка сервера (технический сбой), либо необработанное исключение в http-сервисе. Все, все отсальные коды - это коды прикладной логики.

Вот есть самый простой код 400 Bad Request («неправильный, некорректный запрос»). Он означает, что соединение установлено, все нормально, но присланные данные не подходят. Все, он больше, как и остальные коды 4xx, никому не нужен - ни серверу, ни шлюзу, только вашему коду, где вы можете его устанавить, дабы дать клиенту понять - присланная информация тутфта
40. SlavaKron 20.01.25 14:24 Сейчас в теме
(38)
Вот есть самый простой код 400 Bad Request («неправильный, некорректный запрос»). Он означает, что соединение установлено, все нормально, но присланные данные не подходят.
Ну вот это меня бы устроило, наверное. Ну то есть мы понимаем, что коды ответа http не покрывают всю бизнес-логику.
41. bayselonarrend 2444 20.01.25 14:29 Сейчас в теме
(40) Ну, они не покрывают, почему что-то неправильно, но дают просто понять что что-то неправильно и примерно в каком направлении
39. webester 26 20.01.25 14:20 Сейчас в теме
(37)
Ок, редирект возьму на себя.
Каким образом это произойдет? Ты не обязан про это знать.
В этом вся соль и заключается. Что есть заранее установленный протокол и он согласован. Ты сразу пишешь приложение так, чтобы ошибки перенаправления и все остальное обрабатывалось без анализа тела ответа, в котором одни одно напишут а другие другое, ходи каждый раз разбирайся. 200 значит ты точно получил те данные которые ожидал. Все остальное надо анализировать. И сделано очень удобно же
2xx - все нормально
3хх - перенправили
4хх - твой косяк
5xx - косяк сервера
Нет для 1с ника сложная магия здесь какая-то
Трактор; +1 Ответить
42. SlavaKron 20.01.25 14:30 Сейчас в теме
(39)
Каким образом это произойдет?
Есть модуль 1С, который автоматически обрабатывет редиректы.
Нет для 1с ника сложная магия здесь какая-то
Да, сложная. Если я что-то не понимаю на низком уровне, я не беру это в знание.
43. bayselonarrend 2444 20.01.25 14:31 Сейчас в теме
(42) Ну такое, имхо. Если джун не понимает язык запросов, например, то это не значит, что писать через точку и НайтиПоРеквизиту - это правильно
47. starik-2005 3098 28.01.25 10:39 Сейчас в теме
(43) ужас! А за что же джуны будут требовать подписку-то на инфостарт от руководства, если начнут сами изучать запросы?
27. bayselonarrend 2444 20.01.25 13:55 Сейчас в теме
(25) Расскажите тогда смысл кодов

201 Created («создано»)
203 Non-Authoritative Information («информация не авторитетна»)
208 Already Reported («уже сообщалось»)
400 Bad Request («неправильный, некорректный запрос»)
402 Payment Required («необходима оплата»)
403 Forbidden («запрещено (не уполномочен)»)
415 Unsupported Media Type («неподдерживаемый тип данных»)
428 Precondition Required («необходимо предусловие»)
451 Unavailable For Legal Reasons («недоступно по юридическим причинам»)

И какой "технический" инструмент должен их обрабатывать?
29. SlavaKron 20.01.25 13:57 Сейчас в теме
(27) Без понятия. Я не знаю смысл этих кодов.
31. bayselonarrend 2444 20.01.25 13:58 Сейчас в теме
(29) В чем тогда суть рассуждений?
32. SlavaKron 20.01.25 14:01 Сейчас в теме
(31) В том, что HTTP-сервис на 1С имеет право на свою спецификацию ответов, не связанных со стандартом HTTP.
34. bayselonarrend 2444 20.01.25 14:05 Сейчас в теме
(32) А каждый разработчик имеет право на именование переменных 64значным уникальным идентификаторм.

Стандарты нужны для того, чтобы разработчики, работая с одной и той же технологией, не изобретали велосипед каждый раз и не было хаоса, когда каждый новый сервис - это новое испытание для клиента. И если мы работаем с http, то почему бы не написать все так, как поймет большинство?

В любом случае, код ответа это поле HttpСервисОтвет на чтение и запись, так что разработчики 1С с вами не согласны
46. starik-2005 3098 28.01.25 10:36 Сейчас в теме
(22)
Но не 1сники
Вот точно.
11. pbelousov 39 09.01.25 18:23 Сейчас в теме
в-общем моя боль в том, что не 4хх, не 5хх, по факту гарантированно не доставлялись.
вернее, внутри одной сетки все гуд, а в соседней - нет.

админы конечно подшаманили, поднастроили, но осадочек остался...

и зачем мне такая головная боль?

-> Код 200 всегда. значит мой сервис живой. и ответил именно он, а не кто-то за него!
посмотри тело ответа, а там ок, или ошибочка, с комментариями :)
bayselonarrend; +1 Ответить
16. Трактор 1261 09.01.25 22:36 Сейчас в теме
(11)
Код 200 всегда. значит мой сервис живой

Вот не факт! Код 200 на post запрос только если удалось принять данные и они корректны. А если нет, то 200 введёт в заблуждение. На get запрос код 200 только в случае, если мы можем вернуть запрошенные данные. Но данных может не быть, тогда 404, данные могут переехать, тогда код 301. При выборке может случиться ошибка моего кода, тогда 500.

Теперь перечёркиваю всё что написал выше.
Твой подход тоже имеет право на жизнь. в json-rpc есть свои коды ошибок. Можно в http возвращать 200, а в теле ответа возвращать
-32700 - кривой json аналог http 400
-32603 - внутренняя ошибка, аналог http 500.
17. pbelousov 39 12.01.25 20:10 Сейчас в теме
(16) что там может ввести в заблуждение?

в статье есть термин "Курьер" и "Письмо".
и вот пример: письмо плохое - квитанция о штрафе :)
мы это видим, когда открываем письмо.
но курьер - прибежал довольный, с кодом 200. он выполнил доставку письма на отлично!

так что, ещё раз, имхо: код состояния определяет состояние транспорта,
и не предназначен для передачи кодов прикладной логики.

не надо курьеру говорить, что "письмо плохое".

а если их трое было? первый отлично = 200,
второй запнулся = 500,
третий его не дождался = 404.
:)
18. bayselonarrend 2444 12.01.25 21:44 Сейчас в теме
(17)
так что, ещё раз, имхо


Нету никакого имхо - есть спецификация RFC 2068, в которой написано:

Элемент код состояния (Status-Code) - это целочисленный трехразрядный код результата понимания и удовлетворения запроса


А далее куча кодов, большинство из которых прямо относятся к пояснению содержимого тела, вплоть до того что есть разные коды на успех, в зависимости от того, что лежит в ответе

"200" ; OK
"204" ; Нет содержимого
"206" ; Частичное содержимое

Или разные ошибки, как ответ на входящий запрос

"402" ; Требуется оплата
"404" ; Не найден
"412" ; Предусловие неверно
"410" ; Удален
"415" ; Неподдерживаемый тип медиа


в статье есть термин "Курьер" и "Письмо". И вот пример: письмо плохое ... но курьер - прибежал довольный


Это все было бы так, только в статье под "Курьером" рассматривается не HTTP, а TCP. TCP может довольный прибегать - у него вообще кодов состояния нет. А код как раз является частью письма вместе с телом и заголовками
Трактор; +1 Ответить
20. pbelousov 39 13.01.25 12:59 Сейчас в теме
(18)
код результата понимания и удовлетворения запроса


так всё-таки,что это? вы тут же пишете "А код как раз является частью письма"

часть письма, или результат удовлетворения запроса?
вижу, вы сами тут запутались уже!

про спецификацию: а где там сказано про произвольный код прикладного решения?
под словом "сервер" подразумевается также шлюз, или прокси!
в справке от 1С вот эта ссылка: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
там конкретно и про шлюз и про прокси ( я через переводчика читал)

а потом вы удивляетесь, почему это код в дороге изменился...

прикладное решение вообще может не передавать "Код состояния (ответа) HTTP-сервера".
догадайтесь, что тогда придёт получателю. может 200 ?

код состояние формируется/обрабатывается каждым сервером, каждой проксёй, и каждым шлюзом.
по правилам, заложенным в стандарте.

прикладное решение конечно же может передать что-то своё, но оно будет обработано одним или нескольким сервером.

живой пример, с которым я сталкивался: сервис, который возвращал 404 в качестве ответа "документ не найден".
во-первых, никого не смутило, что такой ответ нужно считать сбоем, и писать заявки в тех. поддержку.
ладна, - упёрлись. пишем костыли: читаем тело, и если там осмысленная строка - значит это не сбой, а сервис ответил.
ок. но и тут никого не смутило, что любой шлюз, получив на входе 404 - дальше не обязан передать тело ответа. достаточно кода.

в-общем, я с этого и начал, - что пытаться засунуть код прикладного решения в код состояния ответа сервера - является архитектурной ошибкой.
впрочем, - кто очень хочет иметь с этим грабли - конечно-же так будет делать. удачи!
21. bayselonarrend 2444 13.01.25 13:15 Сейчас в теме
(20)
так всё-таки,что это? вы тут же пишете "А код как раз является частью письма"
часть письма, или результат удовлетворения запроса?
вижу, вы сами тут запутались уже!


Нет не запутался: вам курьер принес письмо из банка, одобрили вам кредит или нет. Одобрили или нет написано в письме

про спецификацию: а где там сказано про произвольный код прикладного решения?


Конкретно вот так нигде не сказано, потому что это термины которые мы тут используем просто в диалоге. Я уже об этом говорил: шлюз и прокси это такие же элементы вашего сервиса, как и программный код. Я могу обработать 404 в коде, прямо написав, а могу в шлюзе настроить - это вообще разницы не имеет. То, что вы разделяете их на отдельные сущности это уже особенности вашего планирования сервиса. Какое клиенту дело, написали вы в коде Ответ.Код = 404 или какой-нибудь установленный веб сервер его вернул автоматически? Да ни какого - для него это все части вашего сервиса и следить, что на промежуточном этапе код теряется - это задача разработчика

прикладное решение вообще может не передавать "Код состояния (ответа) HTTP-сервера".
догадайтесь, что тогда придёт получателю. может 200 ?


Может - это означает что приложение нарушает стандарт вот и все

код состояние формируется/обрабатывается каждым сервером, каждой проксёй, и каждым шлюзом.
по правилам, заложенным в стандарте.


Нет, оно обрабатывает так, как вы заложили в его настройках. Может, наверное, быть такое, что вы заложили 200, а шлюз поломался и вернул 500 - но в этом и нет никакой проблемы, это логично. Если же вы возвращаете 404, а шлюз меняет его на 200 - то это просто криво настроенный шлюз

живой пример, с которым я сталкивался: сервис, который возвращал 404 в качестве ответа "документ не найден".
во-первых, никого не смутило, что такой ответ нужно считать сбоем, и писать заявки в тех. поддержку.
ладна, - упёрлись. пишем костыли: читаем тело, и если там осмысленная строка - значит это не сбой, а сервис ответил.


Ну да, этот кто-то, которого не смутило 404 от сервера плохо сделал свою работу. Не представляю, как тот факт, что кто-то не обработал правильный 404 при ошибке означает, что не надо обозначать так больше ошибки. Потому что кто-то может не знать обозначение кодов и это не прочитать?

в-общем, я с этого и начал, - что пытаться засунуть код прикладного решения в код состояния ответа сервера - является архитектурной ошибкой.


То, что соблюдение стандарта является "архитектурной ошибкой" - это конечно просто абсурд и оправдание собственной кривой архитектуры.
19. Трактор 1261 12.01.25 22:32 Сейчас в теме
(17) Курьер прибежал довольный код 200. А на самом деле адресат переехал - код 301. Или адресат не найден - код 404. Или адресат пьян и разорвал письмо в припадке буйства - код 500. Вот это я и называю введением в заблуждение.
44. TODD22 20 23.01.25 22:26 Сейчас в теме
(11)
посмотри тело ответа, а там ок, или ошибочка, с комментариями :)

А теперь представьте у вас 50 сервисов с которыми вам нужно сделать интеграцию и каждый отошёл от стандарта, и возвращает свои описания ошибок в теле ответа.

Теперь вам вместо "Если Код200 Тогда". Надо писать обработку под каждый ответ с "ошибочками, с комментариями" и разбираться отдельно в каждом придуманном кем то велосипеде, какие ошибки они в теле возвращают, в каком виде. Как это всё обрабатывать у себя в коде.
48. starik-2005 3098 28.01.25 10:43 Сейчас в теме
(44) Боря, ты на редкость адекватно мыслишь ныне )))

Вот из спецификации REST:
Единообразие интерфейса. Клиент должен всегда понимать, в каком формате и на какие адреса ему нужно слать запрос, а сервер, в свою очередь, также должен понимать, в каком формате ему следует отвечать на запросы клиента.
49. TODD22 20 29.01.25 20:59 Сейчас в теме
(48) И я тебя рад видеть в добром здравии )))
Оставьте свое сообщение