Есть скрипт на php (запрос к API манго телеком). Нужно те же действия, что выполняет скрипт, сделать в 1С
$postdata, $post - проблем нет. всё символ в символ также.
$opts, $context - как правильно рассчитать и передать в 1С в тело запроса ????
код 1С:
на выходе ошибка 401: не авторизованы
<?php
$api_key = '62x9h7d4x29z23q71z0ypxv33j8heena';
$api_salt = 'nb4fg0evtell98utr9n6w9zqiyxmjbnw';
$url = 'https://app.mango-office.ru/vpbx/commands/callback';
$data = array(
"command_id" => "your-command-id",
"from" => array(
"extension" => "313",
"number" => ""
),
"to_number" => "89536666669"
);
$json = json_encode($data);
$sign = hash('sha256', $api_key . $json . $api_salt);
$postdata = array(
'vpbx_api_key' => $api_key,
'sign' => $sign,
'json' => $json
);
$post = http_build_query($postdata);
$opts = array(
'http' => array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $post
)
);
$context = stream_context_create($opts);
$response = file_get_contents($url, false, $context);
?>
Показать$postdata, $post - проблем нет. всё символ в символ также.
$opts, $context - как правильно рассчитать и передать в 1С в тело запроса ????
код 1С:
СертификатОС = Новый СертификатКлиентаWindows();
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(СертификатОС);
АдресДляСоединения = СтрЗаменить(Объект.МангоАдрес, "https://", "");
Соединение = Новый HTTPСоединение(АдресДляСоединения,,,,,, ЗащищенноеСоединение);
//{ JSON
// расчет sign, СтрокаJson
//} JSON
postdata = Новый Соответствие;
postdata.Вставить("vpbx_api_key", Объект.МангоКод);
postdata.Вставить("sign", sign);
postdata.Вставить("json", СтрокаJson);
post = "vpbx_api_key=" + postdata.Получить("vpbx_api_key") +"&"+
"sign=" + postdata.Получить("sign") +"&"+
"json=" + postdata.Получить("json");
Параметрыhttp = Новый Соответствие;
Параметрыhttp.Вставить("method", "POST");
Параметрыhttp.Вставить("header", "Content-type: application/x-www-form-urlencoded");
Параметрыhttp.Вставить("content", post);
opts = Новый Соответствие;
opts.Вставить("http", Параметрыhttp);
АдресЗапроса = "/vpbx/commands/callback";
//
//ЗаголовкиЗапроса = Новый Соответствие;
//ЗаголовкиЗапроса.Вставить("Content-Type","multipart/form-data; boundary=My1cV8bNdr");
ЗапросАПИ = Новый HTTPЗапрос(АдресЗапроса);
ЗапросАПИ.УстановитьТелоИзСтроки(post);
ОтветАПИ = Соединение.ОтправитьДляОбработки(ЗапросАПИ);
Показатьна выходе ошибка 401: не авторизованы
По теме из базы знаний
- Передача файлов и данных на веб-сервер средствами 1С:Предприятие 8.X методом POST
- .Net в 1С. Асинхронные HTTP запросы, отправка Post нескольких файлов multipart/form-data, сжатие трафика с использованием gzip, deflate, удобный парсинг сайтов и т.д.
- Тюнинг производительности запросов в PostgreSQL
- Учимся создавать http сервис (часть четвертая). Изучение метода POST http запроса (передача текстовых данных)
- HTTP сервер, HTTP асинхронный клиент, клиент ГИС МТ "Честный знак" внешние компоненты для 1С 7.7
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Проблема вся в заголовках, как только ты начинаешь передавать нормальные заголовки- все начинает работать.
1) у тебя идет
но при этом ты нигде дальше это не используешь, я заменил на
и
Все заработало!
1) у тебя идет
Параметрыhttp = Новый Соответствие;
Параметрыhttp.Вставить("method", "POST");
Параметрыhttp.Вставить("header", "Content-type: application/x-www-form-urlencoded");
Параметрыhttp.Вставить("content", post);
но при этом ты нигде дальше это не используешь, я заменил на
Параметрыhttp = Новый Соответствие;
Параметрыhttp.Вставить("Accept-Language", "ru");
Параметрыhttp.Вставить("Accept-Charset", "utf-8");
Параметрыhttp.Вставить("Content-Language", "ru");
Параметрыhttp.Вставить("Content-Charset", "utf-8");
Параметрыhttp.Вставить("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
и
ЗапросАПИ = Новый HTTPЗапрос(АдресЗапроса,Параметрыhttp);
Все заработало!
(2) dj_serega, там авторизация не прямая, сервер принимает все запросы, а авторизация на каждый запрос отдельно - через параметры vpbx_api_key и sign
Ошибка тут 100% : ЗапросАПИ.УстановитьТелоИзСтроки(post); т.е. неверно формируется тело запроса, а вот как сделать такое же тело запроса как в php скрипте - я не знаю...
Ошибка тут 100% : ЗапросАПИ.УстановитьТелоИзСтроки(post); т.е. неверно формируется тело запроса, а вот как сделать такое же тело запроса как в php скрипте - я не знаю...
Решил проблему. Но не методами 1С...
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1"); всё отработало отлично.
Аналогичный POST запрос из 1С - не отрабатывал, причину так и не выяснил (((
Всем спасибо за помощь. Если кто знает причину проблемы в 1С - напишите пожалуйста.
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1"); всё отработало отлично.
Аналогичный POST запрос из 1С - не отрабатывал, причину так и не выяснил (((
Всем спасибо за помощь. Если кто знает причину проблемы в 1С - напишите пожалуйста.
(7) ЧерныйКот, Попробуй
для неавторизованного https-соединения. Может, дело и не в установке тела сообщения...
Чтобы гарантированно понять, в чем дело, надо сравнить реальные оправляемые данные... Но для этого придется отладочный веб-сервер поднимать.
Соединение = Новый HTTPСоединение(Сервер,Порт,,,,, Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено));
для неавторизованного https-соединения. Может, дело и не в установке тела сообщения...
Чтобы гарантированно понять, в чем дело, надо сравнить реальные оправляемые данные... Но для этого придется отладочный веб-сервер поднимать.
(14) herfis, пробовал все варианты.
дело не в авторизации. мне прислали тексты запросов которые уходят с моей стороны. Так там тело запроса, который был создан методами 1С - просто содержало другие данные (точнее другую структуру данных), чем тот же запрос (символ в символ) , но отправленный WinHttp.
дело не в авторизации. мне прислали тексты запросов которые уходят с моей стороны. Так там тело запроса, который был создан методами 1С - просто содержало другие данные (точнее другую структуру данных), чем тот же запрос (символ в символ) , но отправленный WinHttp.
типа того:
СтрокаJson = "{}";
Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
Хеширование.Добавить(Объект.МангоКод); // vpbx_api_key
Хеширование.Добавить(СтрокаJson); // json
Хеширование.Добавить(Объект.МангоКлюч);// vpbx_api_salt
sign = Хеширование.ХешСумма;
sign = СтрЗаменить(НРЕГ(sign), " ", "");
postdata = Новый Соответствие;
postdata.Вставить("vpbx_api_key", Объект.МангоКод);
postdata.Вставить("sign", sign);
postdata.Вставить("json", СтрокаJson);
post = "vpbx_api_key=" + postdata.Получить("vpbx_api_key") + "&" +
"sign=" + postdata.Получить("sign") + "&" +
"json=" + postdata.Получить("json");
Попытка
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2,"utf-8");
WinHttp.Open("POST",Объект.МангоАдрес+"config/users/request",0);
WinHttp.SetRequestHeader("Accept-Language", "ru");
WinHttp.SetRequestHeader("Accept-Charset","utf-8");
WinHttp.setRequestHeader("Content-Language", "ru");
WinHttp.setRequestHeader("Content-Charset", "utf-8");
WinHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
ТелоПОСТ = post;
WinHttp.Send(ТелоПОСТ);
ТекстОтвета = WinHttp.ResponseText();
Исключение
ТекстПредупреждения = ОписаниеОшибки();
КонецПопытки;
Если WinHttp.Status <> 200 Тогда
ТекстПредупреждения = Строка(WinHttp.Status) + Символы.ПС + ТекстПредупреждения;
КонецЕсли;
Показать vpbx_api_key = "";
vpbx_api_salt = "";
СтрокаJson="{}";
Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
Хеширование.Добавить(vpbx_api_key);
Хеширование.Добавить(СтрокаJson);
Хеширование.Добавить(vpbx_api_salt);
sign = Хеширование.ХешСумма;
sign = СтрЗаменить(НРЕГ(sign), " ", "");
СерверПриемник = "app.mango-office.ru";
HTTPСоединение = Новый HTTPСоединение(СерверПриемник,,,,Новый ИнтернетПрокси,,Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows));
ЗаголовкиHTTP = Новый Соответствие;
ЗаголовкиHTTP.Вставить("Connection", "keep-alive");
ЗаголовкиHTTP.Вставить("Content-Type","application/x-www-form-urlencoded");
АдресСтраницыНаСервере = "vpbx/config/users/request";
СтрокаНаОтправку = "vpbx_api_key = "+vpbx_api_key+"
|sign = "+sign+"
|json = "+СтрокаJson;
//Формируем HTTP запрос
ЗапросHTTP = Новый HTTPЗапрос(АдресСтраницыНаСервере, ЗаголовкиHTTP);
ЗапросHTTP.УстановитьТелоИзСтроки(СтрокаНаОтправку);
ОтветHTTP = Неопределено;
Попытка
//Ответ от сервера получим в возвращаемом значении типа HTTPОтвет
ОтветHTTP = HTTPСоединение.Получить(ЗапросHTTP);
Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку());
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
ПоказатьПопробуй что выдаст
(23) herfis, дело в том что я видел реализацию через COM-объект который сейчас в рабочий в этой теме. Но хочется реализовать через штатные механизмы 1С. У меня по обмену данными через разные API опыт есть - из этого могу с уверенностью сказать что доступные средства 1с НЕ ВСЕГДА позволяют это красиво сделать без участия этого COM объекта (ведь иногда клиенты и не на "Винде"). Но все же иногда и получается после долгих мучений и поиска ошибок можно это сделать. Почему же я на этой теме завис - потому что я хочу найти решение 1С-ое без компонент и для общего развития так как интересно.
Цитирую:
Андрей, от Вас приходит такой запрос(см. скриншот ниже)
Поля сигн и апикей - верные. Но приходит в одну строчку всё
Поля сигн и апикей - верные. Но приходит в одну строчку всё
...
"MSG": "Received request",
"IP": "**.**.***.***",
"PARAMETERS": {
"USER_AGENT": "1C+Enterprise/8.3",
"REQUEST_URI": "/vpbx/vpbx/config/users/request&vpbx_api_key=*****&json=*****&sign=*****"
},
...
Вот снизу пример правильный, как должно приходить:
...
"PARAMETERS": {
"REQUEST_URI": "/vpbx/vpbx/config/users/request",
"POST": {
"vpbx_api_key": "*****",
"json": "*****",
"sign": "*****"
}
},
...
Показать
Вобще у 1С много ошибок от версии к версии. Попрбуй на новой версии
http://www.forum.mista.ru/topic.php?id=776480
Параметры = Новый Соответствие;
Параметры.Вставить("Content-Type", "application/x-www-form-urlencoded");
HTTPЗапрос = Новый HTTPЗапрос(АдресЗапроса, Параметры);
Мне помогло добавление параметра "Content-Type", "application/x-www-form-urlencoded". Без него, в запрос Post не получалось передать параметр
Добрый день!
Есть небольшие неточности, например в заголовках. Вот рабочий пример по отправки post запроса на создание issues на gitlab, там отличие в том что тело запроса отправляется в виде json.
Есть небольшие неточности, например в заголовках. Вот рабочий пример по отправки post запроса на создание issues на gitlab, там отличие в том что тело запроса отправляется в виде json.
&НаКлиенте
Процедура Отправить(Команда)
СертификатОС = Новый СертификатКлиентаWindows();
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(СертификатОС);
АдресДляСоединения = "gitlab.com";
Соединение = Новый HTTPСоединение(АдресДляСоединения,,,,,, ЗащищенноеСоединение);
//Данные задачи (issues)
postJSON = Новый Структура;
postJSON.Вставить("title", "Наименование");
postJSON.Вставить("description", "Описание");
postJSON.Вставить("labels", "Метки");
//Запись json для тела запроса
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON,postJSON);
jsonStr = ЗаписьJSON.Закрыть();
//Заголовки http с токеном
Заголовкиhttp = Новый Соответствие;
Заголовкиhttp.Вставить("method", "POST");
Заголовкиhttp.Вставить("Content-type", "application/json");
Заголовкиhttp.Вставить("Private-Token", "ваш токен для доступа к проекту");
АдресЗапроса = "/api/v4/projects/project_id/issues"; //project_id - id проекта на gitlab
ЗапросАПИ = Новый HTTPЗапрос(АдресЗапроса);
ЗапросАПИ.Заголовки = Заголовкиhttp;
ЗапросАПИ.УстановитьТелоИзСтроки(jsonStr);
ОтветАПИ = Соединение.ОтправитьДляОбработки(ЗапросАПИ);
стрОтвет = ОтветАПИ.ПолучитьТелоКакСтроку();
Сообщить(стрОтвет);
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот