Отправка данных на сайт POST-запросом в формате JSON из 1С 8
 
На самом деле в интернете можно найти массу описаний и методик по организации исполняемого кода для создания HTTP-соединения для отправки с помощью него POST-HTTPЗапроса со строкой в формате JSON. Но все они носят общий характер и на практике могут возникнуть сложности. Те трудности, с которыми пришлось столкнуться и про которые очень мало можно найти в интернете при реализации кода для отправки из 1С 8 POST-запроса на сайт, и которые удалось преодлеть опытным путем - об этом эта статья.

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

Отправка данных на сайт post - запросом в формате JSON на сайте infostart.ru  самый базовый пример для написания кода "по методичке"
HTTP запросы в 1С 8.3: примеры GET и POST запросов на сайте programmist1s.ru - хорошая теория по реализации исполняего кода.
Работа с HTTP в 1С 8.2 и 8.3 на сайте 1c-programmer-blog.ru - дополнительно немного полезной теории
1C отправить POST запрос с JSON файлом - пример частного случая

Нюансы возникают в "тонкой" настройке параметров процедур HTTPЗапроса  которые были определены опытным путем. Так же в установке настроек не помешает помощь администратора сайта (php-специалиста). Итак перейдем непосредственно к ним.

 

1. Заголовки запроса

В большинстве примеров для запроса POST с отправкой данных в формате JSON предлагается в заголовок HTTP-запроса устанавливать значение "application/json" или "application/json; charset=utf-8". Но благодаря одному комментарию в обсуждении темы 1C и отправка POST запроса с JSON на сайт был подобран рабочий вариант "application/x-www-form-urlencoded" для заголовка HTTP-запроса, так же равноправным оказался вариант "application/x-www-form-urlencoded; charset=utf-8".

1С 8 HTTP запросы в 1С 8.3: пример заголовка для POST запроса, отправка ответа через httpсоединение в формате json

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

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

HTTP-запросы (get и post) в 1С 8.2 и 8.3 примеры заголовков HTTPЗапросов

ЗапросPOST = Новый HTTPЗапрос(СервисAPI_JSON + "?token=" + Токен);
ЗапросPOST.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded");
ЗапросPOST.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
ЗапросPOST.Заголовки.Вставить("Content-type", "application/json");
ЗапросPOST.Заголовки.Вставить("Content-type", "application/json; charset=utf-8");

Возможны и другие варианты значения заголовка.

 

2. Передача параметра запроса

Я долго не мог понять выражение, которое мне предоставлял программист сайта, сопровождая фразами:

  • "Данные о заказе должны приходить в $_POST['order']",
  • "$_POST это массив , он может содержать множество элементов, и информацию о заказе нужно передовать в элементе order массива $_POST. Это по $_POST['order'] И в этом элементе должен содержатся Json массив (он уже в свою очередь является строкой).",
  • "в $_POST['order'] должен лежать json массив". Было понятно, что он объясняет мне на своем php-понятийном аппарате, который, мне, увы, за отсутствием опыта работы с php не доступен. 

Поэтому были попытки поместить в запрос JSON строку и так: 

ЗапросPOST.УстановитьТелоИзСтроки("mData="+СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); - как можно встретить в примерах по ссылкам выше

, и так: ЗапросPOST.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); - т.е. просто СтрокаJSON в первом параметре метода УстановитьТелоИзСтроки().

На все вышеуказанные попытки сайт возвращал ошибку с описанием "Пустой запрос". Помог тот же комментарий, который помог в случае с заголовками, там же в теме 1C и отправка POST запроса с JSON на сайт

1С 8.х - HTTPСоединение отправка POST запросом, 1С 8 Запрос $_POST['order'], htpps соединение с отправкой json

Автор комментария предлагал перед JSON-строкой устанавливать иную подстроку. Пэтому наудачу была предпринята попытка подстрокой установить выражение "order=", ведь он фигурировал в выражении "$_POST['order']". И это оказалось верным решением - сайт начал получать уже не "пустой запрос". Т.е. в данном случае нужно подробно уточнять у программиста сайта, какой параметр он ожидает получить на API-сайта, чтобы его указать в теле HTTP-запроса:

1с 8 запрос $_post['order'] json, 1С отправка json POST-запросом, как, 1C и отправка POST запроса с JSON на сайт

 

3. Кодировка HTTPЗапроса

Следующая тонкость состоист в указании значения кодировки во 2м параметре метода УстановитьТелоИзСтроки( ) HTTPЗапроса ЗапросPOST.УстановитьТелоИзСтроки("order="+СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Он должен соответствовать кодировке на сайте. Уточнять у программиста или администратора сайта. В примерах так же встречался вариант "windows-1251" - но он оказался в данной ситуации настройки отправки POST запроса с JSON на сайт не актуальным.

 

4. Декодирование JSON-ответа 

Когда работа отправки POST HTTPЗапроса была налажена и сайт отдавал HTTPОтвет, содержащий в формате JSON - так было решено сделать, но в ответе русские слова были заменены кодировкой примерного вида "\u041f\u0443\u0441\u0442\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441"

{"result":"error","messages":{"0":"\u041f\u0443\u0441\u0442\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441"}}

Специалист по сайту сказал, что необходимо декодировать ответ. Этот момент не имеет явного прямого отношения к вопросу отправки ответа через httpсоединение в формате json из 1С: Предприятие 8, но косвенно относится к теме, т.к. HTTPОтвет., полученный в результате исользования метода ОтправитьДляОбработки() необходимо было декодировать.

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

Готовой информации не нашлось. Поэтому пришлось, изучив Синтаксис помощник, реализовать рабочий код с использованием метода ОткрытьПоток() для ЧтенияJSON с указанием кодировки:

ПотокОтветаJSON = HTTPОтвет.ПолучитьТелоКакПоток();
ЧтениеПотокаJSON = Новый ЧтениеJSON;
ЧтениеПотокаJSON.ОткрытьПоток(ПотокОтветаJSON, КодировкаТекста.UTF8);
ОтветПотокаJSON = ПрочитатьJSON(ЧтениеПотокаJSON);
ЧтениеПотокаJSON.Закрыть();
 
Результат:
{"result":"error","messages":"Пустой запрос"}
 
 

© www.azhur-c.ru 2013-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.

27-11-2019

Журавлев А.С. (Сайт azhur-c.ru)

Назад

Авторизация
Регистрация     Забыли пароль?

ural-rosaudit.ru - Аудит в сфере ЖКХ, www.ural-rosaudit.ru
azhur-blog.ru - мошенничество в интернете, www.azhur-blog.ru
info-compas.ru - каталог, инфокурсы, видеокурсы, видео курсы, обучение он-лайн, www.info-compas.ru
https://vk.com/effective_ideas - Группа вКонтакте Методы заработка и работы при помощи Интернет

 

Проверить аттестат
Cистема управления контентом Santafox&trade. Санкт-Петербург, Ленинский проспект, д. 23 (812) 545-47-48
Яндекс.Метрика