1с http запрос установитьтелоизстроки не работает

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
Все работает, данные передаются, ответ сервера приходит.

Пытаюсь реализовать средствами 1с:
СерверПриемник = «zbx.ru»;
АдресСтраницыНаСервере = «api_jsonrpc.php»;
Таймаут = 120;
HTTP = Новый HTTPСоединение(СерверПриемник. Таймаут,,);
ЗаголовокЗапросаHTTP = Новый Соответствие();
ЗаголовокЗапросаHTTP.Вставить(«Content-Type: «, «application/json-rpc»);
HTTPЗапрос = Новый HTTPЗапрос(АдресСтраницыНаСервере, ЗаголовокЗапросаHTTP);
СтрокаJSON = («<
| «»jsonrpc»»: «»2.0″»,
| «»method»»: «»host.get»»,
| «»params»»: <""groupids"": 45>,
| «»id»»: 0,
| «»auth»»: «»9a59f9d85ba01c2036bc59932a»»>»);
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON,,);
ФайлРезультат = ПолучитьИмяВременногоФайла();
HTTP.ОтправитьДляОбработки(HTTPЗапрос,ФайлРезультат);
ТекстовыйФайлОтвета = Новый ТекстовыйДокумент;
ТекстовыйФайлОтвета.Прочитать(ФайлРезультат, КодировкаТекста.UTF8);
СтрокаОтветаСервера = ТекстовыйФайлОтвета.ПолучитьТекст();
Сообщить(СтрокаОтветаСервера);

Приходит пустой ответ от сервера. Если убрать значение АдресСтраницыНаСервере — то ответ прийдет с формой аутентификации (т.е. код отправляется и ответ приходит). Может я где то в коде параметр какой забыл? Заранее большое спасибо.

Источник

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Соединение, в теле запроса или как то иначе? в чем моя ошибка?.

Источник

Читайте также:  Кнопка домой не работает иногда
Оцените статью