Имя: Пароль:
1C
1С v8
Помогите с JSON
,
0 picom
 
31.10.22
08:54
Задача, получить информацию от сюда
https://help.plusofon.ru/API/FlashCall_API

Код в 1С, который возвращает синтаксическую ошибку

    Сервер = "new-api.plusofon.ru";
    Ресурс = "/flash-call/send";
    HTTP =  Новый HTTPСоединение(Сервер,443,,,,,Новый ЗащищенноеСоединениеOpenSSL);
    
    
    
    имяФайлаСПараметрами = ПолучитьимяВременногоФайла("txt"); // файл, содержащий параметры
    ЗаписьТекста = Новый ЗаписьТекста(имяФайлаСПараметрами);

    ЗаписьТекста.ЗаписатьСтроку("{");
    ЗаписьТекста.ЗаписатьСтроку("""jsonrpc"": ""2.0"",");
    ЗаписьТекста.ЗаписатьСтроку("""method"": ""flash-call/send"",");
    ЗаписьТекста.ЗаписатьСтроку("""params"": {");
    ЗаписьТекста.ЗаписатьСтроку("""phone"": ""7999999999""");
    ЗаписьТекста.ЗаписатьСтроку("}, ");
    ЗаписьТекста.ЗаписатьСтроку("""id"": 1");
    ЗаписьТекста.ЗаписатьСтроку("}");  
    ЗаписьТекста.Закрыть();
    
    ФайлРезультата = ПолучитьИмяВременногоФайла();
    
    HTTPЗапрос = Новый HTTPЗапрос(Ресурс);
    HTTPЗапрос.Заголовки.Вставить("Authorization","Bearer podfupofjuswofkjwfoihf");
    HTTPЗапрос.Заголовки.Вставить("Content-Type","application/json");
    HTTPЗапрос.УстановитьИмяФайлаТела(имяФайлаСПараметрами);    

    Результат = HTTP.ОтправитьДляОбработки(HTTPЗапрос, ФайлРезультата);    

Что я делаю не так?
1 Кир Пластелинин
 
31.10.22
08:57
1. что за ошибку?
2. откройте для себя платформенные методы работы с json
2 Smit1C
 
31.10.22
08:59
(0) JSON лучше сделать через "Новый ЗаписьJSON" из структуры, а не через запись текста.
И без текста ошибки с сервера мы тут ничем не поможем.
3 picom
 
31.10.22
08:59
Текст ошибки/возврата
{"jsonrpc":"2.0","id":null,"result":null,"error":{"code":0,"message":"Invalid JSON data in request body: Syntax error."}}
4 alarm2020
 
31.10.22
09:05
(3) Что непонятного в сообщении об ошибке? Неправильный JSON. Сделайте правильный
5 picom
 
31.10.22
09:12
Пробую, а как вот это собрать? Массив, начало объекта ... что енто?

"params": {
    "phone": "79376198612"
  },
6 Kassern
 
31.10.22
09:14
(5) В json все просто. {}-Объект []-массив
7 alarm2020
 
31.10.22
09:15
(5) Структура
8 Kassern
 
31.10.22
09:16
И да, в объекте может быть еще объект. Как в данном случае
9 KJlag
 
31.10.22
09:20
(5) любой json online converter
и в нем прочекать итоговый вариант ваш.
а так, да - как уже сказано в (1) - есть платформенные методы перевода в json
10 alarm2020
 
31.10.22
09:21
Похоже, что вместо
("""method"": ""flash-call/send"",")
надо писать
("""method"": ""flash-call\/send"",")
11 Builder
 
31.10.22
09:22
(6) Ну все таки применительно к 1С точнее так:
{} - Структура
[] - Массив
И в (5) - структура в структуре.
12 picom
 
31.10.22
09:30
(7) а как имя структуры указать, как в (5)? в СП нет
13 alarm2020
 
31.10.22
09:35
(12) У структуры нет имени. У структуры есть набор пар ключ-значение. При этом значение в какой-либо паре может быть тоже структурой. В этом случае можешь считать, что ключ и есть имя
14 Builder
 
31.10.22
09:35
(12) Как то так:
    СтруктураТов = Новый Структура;
    СтруктураТов.Вставить("status","delivered");

    СтруктураЗапроса= Новый Структура;
    СтруктураЗапроса.Вставить("dir","ASC");
    СтруктураЗапроса.Вставить("filter",СтруктураТов);
    СтруктураЗапроса.Вставить("offset",0);
    СтруктураЗапроса.Вставить("limit",1000);
    
    ИтоговыйЗапрос = СтруктураВJson(СтруктураЗапроса);
15 Kassern
 
31.10.22
09:37
(14) Сразу видно работу с API маркетплейсов)
16 Builder
 
31.10.22
09:38
+ к (14)
Ну и дальше как то так
HTTPЗапрос.УстановитьТелоИзСтроки(ИтоговыйЗапрос, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

(15) А то :)
17 alarm2020
 
31.10.22
09:40
Но ошибка все-таки здесь;
flash-call/send
ТС может не мучаться с ЗаписьJSON, а просто добавить слэш в свой исходный текст
18 picom
 
31.10.22
09:47
(17) это не помогает
19 Смотрящий от 1С
 
31.10.22
10:00
через отладчик посмотрите, что находится внутри имяФайлаСПараметрами
20 Kassern
 
31.10.22
10:08
(18) Переделайте уже через Запись json. При этом не нужно создавать временные файлы, а просто через метод Установить строку начать запись. и Результат=ЗаписьJSON.Закрыть() - получить готовый текст для отправки.
Далее, с помощью УстановитьТелоИзСтроки(Результат) - запихнуть json в запрос. И да, у вас там в API черным по белому написано - "phone     integer". Номер телефона нужно числом выгружать, а не строкой.
21 picom
 
31.10.22
10:12
(14) СтруктураВJson Такой нет...
22 Kassern
 
31.10.22
10:14
(21) Есть такой волшебный метод ЗаписатьJSON() Прочитайте про него.
23 Builder
 
31.10.22
10:14
(21)
Функция СтруктураВJson(Объект, ПараметрыПреобразования = Неопределено) Экспорт
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(
        ЗаписьJSON,
        Объект);
    
    Возврат ЗаписьJSON.Закрыть();

КонецФункции
24 Garykom
 
гуру
31.10.22
10:14
(0) ЗаписьТекста.ЗаписатьСтроку("""id"": 1");

1 надо не числом а текстом
25 Kassern
 
31.10.22
10:15
(23) Зря вы используете переменные с именами Объект
26 Kassern
 
31.10.22
10:16
Лучше вообще от системных переменных отказаться, таких как Объект, Элементы, Форма, Параметры и т.д.
27 Garykom
 
гуру
31.10.22
10:18
(24)+ хотя странно в описании для postman одно https://docs.plusofon.ru/api/plusofon_flash_call.postman_collection.json
а в примерах curl другое https://help.plusofon.ru/API/FlashCall_API
28 Garykom
 
гуру
31.10.22
10:19
(0) Проверь как оно работает через curl и postman
а затем пытаешься сделать это же из 1С
перехватывать для отладки можно Fiddler'ом
29 Kassern
 
31.10.22
10:21
(27) Я бы просто попробовал разные варианты и строкой и числом. Там комбинаций минимум
30 Builder
 
31.10.22
10:22
(25) ХЗ откуда этот кусок кода выдрал, но замечание справедливое, надо поправить :)
31 Garykom
 
гуру
31.10.22
10:31
(29) У ТС d (0) возможно классическая трабла с BOM
32 picom
 
31.10.22
10:31
(23) Спасибо! Все заработало.
33 Dzenn
 
гуру
31.10.22
11:37
Для работы с JSON предусмотрены объекты методы ПрочитатьJSON(...) ЗаписатьJSON(...) ЧтениеJSON ЗаписьJSON
Использование других способов, типа ЗаписьТекста — это ошибка и усложнение
34 Dzenn
 
гуру
31.10.22
11:39
(33) использование данных способов позволяет превращать массивы и структуры в JSON — это сильно облегчает взаимодействие
35 picom
 
07.11.22
08:01
Блин, понедельник...
На платформе 8.3.20 в режиме совместимости 8.2.13 не работает....
На свежих все ОК.
Что делать, куда копать?
36 Ryzeman
 
07.11.22
08:05
(35) >>Доступен, начиная с версии 8.3.6.

Похоже, копать в сторону сбора ручками, как ты это изначально и пытался сделать :-D
37 picom
 
07.11.22
08:09
В том то и дело, что эти методы все работаю, но даже собирая ручками, синтаксическая ошибка...
{"jsonrpc":"2.0","id":null,"result":null,"error":{"code":0,"message":"Invalid JSON data in request body: Syntax error."}}

Эта же обработка на чуть более свежей 10.3 уже работает.
Как буд-то ID по дороге теряет ...
38 picom
 
07.11.22
08:16
Вроде продвинулся

HTTPЗапрос.УстановитьТелоИзСтроки(ИтоговыйЗапрос, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Основная теорема систематики: Новые системы плодят новые проблемы.