Необходимо из 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 и передают на сервер двумя этими вариантами.
Улыбнулся)) А зачем в теле передавать json? Зачем такой геморрой? На сайте надо писать всякие проверки на спецсимволы и т.п. А не проще строкой передавать и на стороне сайта сразу считывать нужные параметры?
(2) Не совсем понял…
Что значит строкой? Передавать как GET параметры что ли? Типа localhost/?param1=value&p2=value2
Да, это проще всего конечно. Но:
1. Данные всеравно придется кодировать. Явно или не явно. Так как допустим у тебя будет значение параметра равно строке с пробелами или будет содержать символ &. Ну например у тебя значение равно Большой&текст и в итоге получиться localhost/?param1=Большой&текст&p2=value2
Такая строка будет ошибочной и ничего хорошего ты не подучишь.
2. GET параметры, а точнее url строка имеет ограничение в размере. Поэтому большой объем данных ты не передашь. Под большим объемом я подразумеваю даже хотя бы заказ покупателя с табличной частью в 20 строк.
Именно что POST, а параметры так же как в GET param1=value&p2=value2. На некоторых API и на POST есть ограничения, а строкой влазит намного больше чем json. И согласитесь, что & встречается намного реже внутри параметров, чем символы разметки json. У меня например таким образом передается целый гигантский массив в параметре через запятую и параметрами авторизации. в json это было бы раза в 2 больше данных.
$offerIds = $_POST[‘offerid’];
$a = explode(«,», $offerIds);
(4) Через параметры и запятую в массиве согласен, получается короче. Но кодировать строковые значения параметров всеравно необходимо, так как хоть редко но спец.символы встречаются и игнорировать это не получиться.
(5) Ну не знаю насколько КодироватьСтроку необходима для POST запроса. Мне всегда казалось, что она необходима только для передачи кириллицы в параметрах в GET запросах, и каждый символ кириллицы превращается в 3 символа что не удобно.
Один вопрос:
«А где должно сие лежать»?
HTTPЗапрос = Новый HTTPЗапрос(«/from1c.php»);
на сервере или на клиенте?
(6)ну попробуй передать значение, в которм есть символ & или = например.
Может я конечно как то не так передаю параметры, а так в первом примере у меня идет отправка POST запроса с параметрами.
(7) php скрипит на веб сервере конечно.
А конструкция Новый HTTPзапрос доступна на клиенте и на сервере.
(9) т.е., как минимум на веб-сервере должен быть прикручен php?
(10)да
подскажите пожалуйста если из 1С отправить json так:
то на стороне апачи пхп как принять этот json?
(13) все разобрался, не дочитал статью до конца ))