Отправка данных на сайт POST-запросом в формате JSON из 1С 8
На самом деле в интернете можно найти массу описаний и методик по организации исполняемого кода для создания HTTP-соединения для отправки с помощью него POST-HTTPЗапроса со строкой в формате JSON. Но все они носят общий характер и на практике могут возникнуть сложности. Те трудности, с которыми пришлось столкнуться и про которые очень мало можно найти в интернете при реализации кода для отправки из 1С 8 POST-запроса на сайт, и которые удалось преодлеть опытным путем - об этом эта статья.
Методологически реализовать отправку POST-запроса в формате JSON на сайт не сложно, в написании исполнчемого кода может помочь любая из метологий по ссылке из списка ниже. Отправка данных на сайт post - запросом в формате JSON на сайте infostart.ru самый базовый пример для написания кода "по методичке" Нюансы возникают в "тонкой" настройке параметров процедур HTTPЗапроса которые были определены опытным путем. Так же в установке настроек не помешает помощь администратора сайта (php-специалиста). Итак перейдем непосредственно к ним.
В большинстве примеров для запроса 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". В моем случае путем проверки уже на рабочем варианте запроса было установлено, что заголовок имеет значение. По возможности надо уточнять у php-программиста сайта заголовок. В моем случае программист ответил по поводу заголовков, что "я не разбираю заголовки, это делается автоматом в php", поэтому пришлось перебирать. Таким образом в Вашем случае может сложиться ситуция, что, возможно, придется перебирать из примерных вариантов, если иного не сообщит php-программист: Запрос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");
Возможны и другие варианты значения заголовка.
Я долго не мог понять выражение, которое мне предоставлял программист сайта, сопровождая фразами:
Поэтому были попытки поместить в запрос JSON строку и так: ЗапросPOST.УстановитьТелоИзСтроки("mData="+СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); - как можно встретить в примерах по ссылкам выше , и так: ЗапросPOST.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); - т.е. просто СтрокаJSON в первом параметре метода УстановитьТелоИзСтроки(). На все вышеуказанные попытки сайт возвращал ошибку с описанием "Пустой запрос". Помог тот же комментарий, который помог в случае с заголовками, там же в теме 1C и отправка POST запроса с JSON на сайт Автор комментария предлагал перед JSON-строкой устанавливать иную подстроку. Пэтому наудачу была предпринята попытка подстрокой установить выражение "order=", ведь он фигурировал в выражении "$_POST['order']". И это оказалось верным решением - сайт начал получать уже не "пустой запрос". Т.е. в данном случае нужно подробно уточнять у программиста сайта, какой параметр он ожидает получить на API-сайта, чтобы его указать в теле HTTP-запроса:
Следующая тонкость состоист в указании значения кодировки во 2м параметре метода УстановитьТелоИзСтроки( ) HTTPЗапроса ЗапросPOST.УстановитьТелоИзСтроки("order="+СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); Он должен соответствовать кодировке на сайте. Уточнять у программиста или администратора сайта. В примерах так же встречался вариант "windows-1251" - но он оказался в данной ситуации настройки отправки POST запроса с 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) |
|
|||||||||||||
Copyright 2013-2020. Azhur-c.ru
ИП Журавлев Александр Сергеевич ИНН 667000271590 ОГРНИП 312667014300041 |