Отправка HTTP запроса из 1С на сайт.

Задача: Передать данные из 1С на сайт. Данные будут передаваться в PHP скрипт, через HTTP запрос, вызываемый из 1С.

Необходимо из 1С обращаться к стороннему HTTP-сервису (в данном примере, написанным на PHP). Обмен с сайтом было решено сделать путем передачи строки в JSON формате.

На сайте разместили PHP скрипт, который принимает данные, обрабатывает их и возвращает результат.

Вариант 1. Передача с заголовком Content-type: application/x-www-form-urlencoded.

СтрокаJSON = КодироватьСтроку(СтрокаJSON, СпособКодированияСтроки.КодировкаURL);

HTTPСоединение = Новый HTTPСоединение("localhost");
HTTPЗапрос = Новый HTTPЗапрос("/from1c.php");
HTTPЗапрос.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded");
HTTPЗапрос.УстановитьТелоИзСтроки("param=" + СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

Сообщить("Код результата: " + Ответ.КодСостояния);
Сообщить("Ответ: " + Ответ.ПолучитьТелоКакСтроку("UTF-8"));

Тут делаем POST запрос к скрипту from1c.php и передаем туда параметр «param» в котором содержится наши данные в формате JSON.

В скрипте, чтобы получить эти данные достаточно написать echo($_POST[‘param’]).

Если вы передаете данные в формате JSON, то их можно сразу автоматически десериализовать и получить номальную структуру. Десериализовать можно через функцию json_decode(($_POST[‘param’])

Обратите внимание, что необходимо указывать «ИспользованиеByteOrderMark.НеИспользовать» иначе возникнут проблемы на стороне сайта с расшифровкой JSON строки.

Этот вариант хорош, но тут возникает потребность предварительно кодировать строку JSON, так как в ней могут быть специальные символы (,&= и т.д.). Собственно можно кодировать всю строку, как в примере выше КодироватьСтроку(СтрокаJSON, СпособКодированияСтроки.КодировкаURL), а можно кодировать только определенные параметры (только те, где может быть эти символы).

Вариант 2. Передача с заголовком Content-type: application/json.

HTTPСоединение = Новый HTTPСоединение("localhost");
HTTPЗапрос = Новый HTTPЗапрос("/from1c.php");
HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json");
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

Сообщить("Код результата: " + Ответ.КодСостояния);
Сообщить("Ответ: " + Ответ.ПолучитьТелоКакСтроку("UTF-8"));

В данном варианте предварительно кодировать строку не нужно.

Получать данные на стороне сайта, просто через echo($_POST[‘order’]) не получиться. Необходимо использовать echo file_get_contents(‘php://input’)

Вот собственно и все.

Для примера прикрепил обработку, в которой сериализую структуру в JSON и передают на сервер двумя этими вариантами.

13 Comments

  1. mixperm

    Улыбнулся)) А зачем в теле передавать json? Зачем такой геморрой? На сайте надо писать всякие проверки на спецсимволы и т.п. А не проще строкой передавать и на стороне сайта сразу считывать нужные параметры?

    Reply
  2. sm2701

    (2) Не совсем понял…

    Что значит строкой? Передавать как GET параметры что ли? Типа localhost/?param1=value&p2=value2

    Да, это проще всего конечно. Но:

    1. Данные всеравно придется кодировать. Явно или не явно. Так как допустим у тебя будет значение параметра равно строке с пробелами или будет содержать символ &. Ну например у тебя значение равно Большой&текст и в итоге получиться localhost/?param1=Большой&текст&p2=value2

    Такая строка будет ошибочной и ничего хорошего ты не подучишь.

    2. GET параметры, а точнее url строка имеет ограничение в размере. Поэтому большой объем данных ты не передашь. Под большим объемом я подразумеваю даже хотя бы заказ покупателя с табличной частью в 20 строк.

    Reply
  3. mixperm

    Именно что POST, а параметры так же как в GET param1=value&p2=value2. На некоторых API и на POST есть ограничения, а строкой влазит намного больше чем json. И согласитесь, что & встречается намного реже внутри параметров, чем символы разметки json. У меня например таким образом передается целый гигантский массив в параметре через запятую и параметрами авторизации. в json это было бы раза в 2 больше данных.

    $offerIds = $_POST[‘offerid’];

    $a = explode(«,», $offerIds);

    Reply
  4. sm2701

    (4) Через параметры и запятую в массиве согласен, получается короче. Но кодировать строковые значения параметров всеравно необходимо, так как хоть редко но спец.символы встречаются и игнорировать это не получиться.

    Reply
  5. mixperm

    (5) Ну не знаю насколько КодироватьСтроку необходима для POST запроса. Мне всегда казалось, что она необходима только для передачи кириллицы в параметрах в GET запросах, и каждый символ кириллицы превращается в 3 символа что не удобно.

    Reply
  6. Frogger1971

    Один вопрос:

    «А где должно сие лежать»?

    HTTPЗапрос = Новый HTTPЗапрос(«/from1c.php»);

    на сервере или на клиенте?

    Reply
  7. sm2701

    (6)ну попробуй передать значение, в которм есть символ & или = например.

    Может я конечно как то не так передаю параметры, а так в первом примере у меня идет отправка POST запроса с параметрами.

    Reply
  8. sm2701

    (7) php скрипит на веб сервере конечно.

    А конструкция Новый HTTPзапрос доступна на клиенте и на сервере.

    Reply
  9. Frogger1971

    (9) т.е., как минимум на веб-сервере должен быть прикручен php?

    Reply
  10. sm2701

    (10)да

    Reply
  11. 🅵🅾️🆇
    Reply
  12. user618785_bag.dat

    подскажите пожалуйста если из 1С отправить json так:

    HTTPЗапрос.УстановитьТелоИзСтроки(«param=» + СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

    то на стороне апачи пхп как принять этот json?

    Reply
  13. user618785_bag.dat

    (13) все разобрался, не дочитал статью до конца ))

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *