v8: JSON и 1с8.3 Неверный формат данных в запросе.
dabuldakov
02.11.2016 07:37
Прочитано: 4904
Добрый день! Помогите разобраться. Никак не могу понять из-за чего сервер не принимает запрос.
Внимание! При отправке запроса в формате JSON перед <> необходимо добавить “data=”. Названия и значения параметров должны быть заключены в двойные кавычки, как в примере выше.
Пример запроса из ТЗ:
andrey_71_
22.11.2016 16:27
Ответ № 2
Код 1C v 8.3
Рабочий вариант кода передачи файла для обработки
Источник
Работа с HTTP в 1С 8.2 и 8.3
В этой статье я попробую рассказать о том, какими средствами располагает технологическая платформа для работы с протоколом HTTP. В начале будет немного общей информации, а затем конкретные примеры. Отмечу, что в статье используется технологическая платформа версии 8.3.12.1595.
Общая информация
Для работы с протоколом HTTP в 1С существуют три основных объекта — HTTPСоединение, HTTPЗапрос и HTTPОтвет, кроме этого для создания HTTPS-соединения используется объект ЗащищенноеСоединениеOpenSSL, а для соединения через прокси-сервер объект ИнтернетПрокси. Существует еще несколько объектов, которые могут использоваться при работе с протоколом HTTP, но используются они достаточно редко и не так важны.
Назначение основных объектов следует из названия.
HTTPСоединение отвечает за соединение с сервером — в свойствах объекта, помимо обязательного адреса, можно указать порт, прокси, логин, пароль, таймаут, защищенное соединение и флаг аутентификации ОС, а методы повторяют основные методы HTTP.
HTTPЗапрос позволяет описать что именно мы хотим от сервера — в свойствах нужно обязательно указать адрес ресурса к которому мы обращаемся, кроме этого имеется возможность указать какие-либо заголовки, методы же, в свою очередь, позволяют различными способами установить и получить тело запроса.
HTTPОтвет является результатом выполнения запроса к серверу — из свойств мы можем узнать ответные заголовки и код состояния, а методы позволяют получить тело ответа различными способами.
ИнтернетПрокси позволяет указать настройки прокси-сервера — с помощью метода Установить() можно указать параметры для подключения к прокси-серверу, отмечу, что свойства «Пароль» и «Пользователь» являются устаревшими, использовать их не рекомендуется.
ЗащищенноеСоединениеOpenSSL создает защищенное соединение OpenSSL — имеется возможность указать сертификат клиента и/или сертификат удостоверяющего центра, в большинстве случаев (для доступа к обычным сайтам по протоколу HTTPS) указывать какие либо сертификаты не требуется.
Заканчиваем с теорией и переходим к практике.
Практические задачи при работе с HTTP
В качестве практической части рассмотрим задачи, которые чаще всего встречаются при работе с протоколом HTTP в 1С
Источник
Отправка HTTP запроса из 1С на сайт.
Необходимо из 1С обращаться к стороннему HTTP-сервису (в данном примере, написанным на PHP). Обмен с сайтом было решено сделать путем передачи строки в JSON формате.
На сайте разместили PHP скрипт, который принимает данные, обрабатывает их и возвращает результат.
Вариант 1. Передача с заголовком Content-type: application/x-www-form-urlencoded.
Тут делаем POST запрос к скрипту from1c.php и передаем туда параметр «param» в котором содержится наши данные в формате JSON.
В скрипте, чтобы получить эти данные достаточно написать echo($_POST[‘param’]).
Если вы передаете данные в формате JSON, то их можно сразу автоматически десериализовать и получить номальную структуру. Десериализовать можно через функцию json_decode(($_POST[‘param’])
Обратите внимание, что необходимо указывать «ИспользованиеByteOrderMark.НеИспользовать» иначе возникнут проблемы на стороне сайта с расшифровкой JSON строки.
Этот вариант хорош, но тут возникает потребность предварительно кодировать строку JSON , так как в ней могут быть специальные символы (,&= и т.д.). Собственно можно кодировать всю строку, как в примере выше КодироватьСтроку(СтрокаJSON, СпособКодированияСтроки.КодировкаURL), а можно кодировать только определенные параметры (только те, где может быть эти символы).
Вариант 2. Передача с заголовком Content-type: application/json.
В данном варианте предварительно кодировать строку не нужно.
Получать данные на стороне сайта, просто через echo($_POST[‘order’]) не получиться . Необходимо использовать echo file_get_contents(‘php://input’)
Вот собственно и все.
Для примера прикрепил обработку, в которой сериализую структуру в JSON и передают на сервер двумя этими вариантами.
Источник
HTTP запрос из 1С
Добрый день. Может кто подскажет почему так происходит? Делаю запрос к API через Curl вида: curl -i -X POST -H ‘Content-Type: application/json-rpc’ -d ‘<"jsonrpc": "2.0","method": "host.get","params": <"groupids":"45">,»id»: 0,»auth»: «9a59f9d85ba01c2036bc59932a»>’ http://zbx.ru/api_jsonrpc.php Все работает, данные передаются, ответ сервера приходит.
Приходит пустой ответ от сервера. Если убрать значение АдресСтраницыНаСервере — то ответ прийдет с формой аутентификации (т.е. код отправляется и ответ приходит). Может я где то в коде параметр какой забыл? Заранее большое спасибо.
Источник
1c 8.3 HTTPСоединение, метод PUT
Итак, есть задача: отправить файл по WebDav’у на Яндекс диск. Функции скачать, создать папку и удалить файл уже реализованы мной. Пример: —————————————————————————————————————————————————————————————————————— Токен = «МойТокен»; Соединение = новый HTTPСоединение(«webdav.yandex.ru»,443. Новый ЗащищенноеСоединениеOpenSSL);
Заголовки = Новый Соответствие; Заголовки.Вставить(«Host»,»webdav.yandex.ru»); Заголовки.Вставить(«Accept»,»*/*»); Заголовки.Вставить(«Authorization», «OAuth «+Токен);
Запрос = Новый HTTPЗапрос(«webdav.yandex.ru»,Заголовки);
Но если мы начинаем добавлять перенос строки в тело запроса, он либо выдает мне синтаксическую ошибку, либо перестает читать что либо после » HTTP/1.1″. Я пробовал передавать заголовки в теле запроса-не работает(не авторизуется, т.е. не видит заголовка с авторизацией), пробовал передавть что либо с помощью метода HTTPЗапрос.УстановитьТелоИзСтроки() — Все в том числе и явные ошибки игнорируются.
Дальше всего я продвинулся на коде, где я не присоединяю файл,WebDebager говорит мне что я заявляю файл 17 байт, а отправляю 0, если присоединяю файл, он не проходит аунтификацию Токен = «МойТокен»; Путь = «C:\Users\alexander\Pictures\1.txt»; Файл = Новый Файл(Путь); Соединение = новый HTTPСоединение(«webdav.yandex.ru»,443. Новый ЗащищенноеСоединениеOpenSSL); Заголовки = Новый Соответствие; Заголовки.Вставить(«Accept»,»*/*»); Заголовки.Вставить(«Host»,»webdav.yandex.ru»); Заголовки.Вставить(«Authorization», «OAuth «+Токен); Заголовки.Вставить(«Etag», ХЕШMD5 (Путь)); Заголовки.Вставить(«Sha256», ХЕШ (Путь)); Заголовки.Вставить(«Content-Type», «application/binary»); Заголовки.Вставить(«Expect», «100-continue»); Заголовки.Вставить(«Content-Length», СтрЗаменить(Файл.Размер(),» «,»»)); Запрос = Новый HTTPЗапрос(«»,Заголовки); Запрос.УстановитьИмяФайлаТела(Путь)
ВОПРОС: Как мне передать файл в HTTPСоединение, в теле запроса или как то иначе? в чем моя ошибка?.