Имя: Пароль:
1C
1С v8
Интеграция Wialon и 1С. Внедрение "Локатора"
0 lav151
 
22.11.22
10:47
Всем Добрый день

Коллеги, нужна ваша помощь в интеграции Локатора (в виалоне) с 1С для получения токена местонахождения объекта.
Вот кусок кода в 1С.
-----
СерверАГ="hst-api.wialon.com";
SSL=Новый ЗащищенноеСоединениеOpenSSL();
Соединение=Новый HTTPСоединение(СерверАГ,,,,,,SSL);
СИД=ПолучениеСИД();
Запрос = Новый HTTPЗапрос("wialon/ajax.html?svc=token/update&sid="+СИД+"&params={""callMode"":""create"",""app"":""locator"",""at"":0,""dur"":864000,""fl"":256,""p"":""{\""note\"":\""Delivery test\"",\""zones\"":0,\""tracks\"":1}"",""items"":["+ИД+"]}");
      
Ответ=Соединение.Получить(Запрос);
Если Ответ.КодСостояния=200 Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
СтруктураТест = ПрочитатьJSON(Чтение);
КонецЕсли;
-----

В структуре я получаю ошибку {"error":4} - Неверный ввод. Если я копирую этот же запрос в строку браузера, приписывая вначале адрес hst-api.wialon.com , то все работает, токен для вывода локатора получаю. Может синтаксис ввода запроса в 1С другой, не знаю, пробовал ставить/убирать символы в запросе, менять местами параметры.. никак не получается. Писал на форум виалона не ответили. Пример готового кода брал от сюда https://forum.wialon.com/viewtopic.php?id=9583
1 Kassern
 
22.11.22
10:53
(0) JSON лучше платформенными методами собирать. Строку запроса лучше кодировать в урл. Так же нужно убедиться, что вызывается нужный метод (get, post...). Я обычно ресурс в запросе начинаю с "/" - хз насколько это необходимо. Порт у сервера стандартный? Какой ответ получаете от сервиса?
2 hockeyist
 
22.11.22
10:55
(0) Вот эти вот палочки \
они совсем не для того, что ты думаешь
3 hockeyist
 
22.11.22
10:58
(1) Там JSON в JSONе. Люди знают толк в извращениях
4 hockeyist
 
22.11.22
11:00
(2) + просто убери их
5 Kassern
 
22.11.22
11:02
(3) ага, проще было в теле запроса передать json, а в строке ресурса лишь основные параметры.
6 lav151
 
22.11.22
11:18
(1) В портах все норм, другие данные получается получить из виалоне. Ответ получается вот в строке браузера {"h":"48837859cb8cbda2dab6eaa065af8b1eBA8C41D2019E885E76144797962B4F342A6929E1","app":"locator","at":1669104805,"ct":1669104805,"dur":864000,"fl":256,"items":[23129768],"p":"{\"note\":\"Delivery (test)\",\"zones\":0,\"tracks\":1}"}
7 Kassern
 
22.11.22
11:25
(6) "\"note\":\"Delivery (test)\",\"zones\":0..." - вы понимаете что это json? Браузер автоматом делает многие вещи, что в 1с и других инструментах нужно прописывать самостоятельно. Например браузер автоматом кодирует строку в урл. Возможно и json норм передает.
8 Kassern
 
22.11.22
11:26
Попробуйте через ЗаписьJSON создать нужную строку с параметрами и передать уже ее.
9 lav151
 
22.11.22
11:30
(8) Хорошо, спасибо, как сделаю отпишусь)
10 hockeyist
 
22.11.22
11:58
(9) А просто убрать палочки?
11 hockeyist
 
22.11.22
12:08
(7) Это не JSON. Это PHP(откуда ТС взял пример) так экранирует кавычки. 1С экранирует кавычки по-другому. Ваш совет мало чем поможет ТС
12 Kassern
 
22.11.22
12:12
(11) так а зачем ему эти слеши, если он нормально сформирует текст json и воткнет его?
Создаст нужную структуру и запихнет ее в ЗаписатьJSON
13 Kassern
 
22.11.22
12:13
И будет что-то вроде:
Ресур="/wialon/ajax.html?svc=token/update&sid="+СИД+"&params="+ТекстJSON";
14 Kassern
 
22.11.22
12:13
кавычка в конце лишняя)
15 hockeyist
 
22.11.22
12:14
(12) Он запихнет вместе со слэшами и получит ту же ошибку. Ему уже сказали "убери палочки", но он не слышит.
16 Kassern
 
22.11.22
12:14
(15) "Он запихнет вместе со слэшами" - я думал, что он понимает, что сует)
17 hockeyist
 
22.11.22
12:17
Для решения вопроса достаточно просто убрать слэши. А JSON через структуру будет более замороченным. Потому что там надо в одну запись JSON воткнуть другую запись JSON
18 Kassern
 
22.11.22
12:17
Тут вообще простая структура, еще и лишние кавычки в  "p": у вас походу, так как строку передаете вместо объекта json.
{
  "callMode": "create",
  "app": "locator",
  "at": 0,
  "dur": 864000,
  "fl": 256,
  "p": {
    "note": "Delivery test",
    "zones": 0,
    "tracks": 1
  },
  "items": [
    "+ИД+"
  ]
}
19 Kassern
 
22.11.22
12:18
Вот такую примерно структуру нужно получить в ТекстJSON=ЗаписьJSON.Закрыть();
20 Kassern
 
22.11.22
12:19
{}- структура, []-массив
21 hockeyist
 
22.11.22
12:19
(18) Нет. Свойство "p" это строка. А в этой строке JSON. Отсюда и слэши
22 Kassern
 
22.11.22
12:20
Для проверки можете использовать любой онлайн едитор, например https://jsoneditoronline.org
23 Kassern
 
22.11.22
12:21
(21) А нафига?)  Тогда получается так:
{
  "callMode": "create",
  "app": "locator",
  "at": 0,
  "dur": 864000,
  "fl": 256,
  "p": "{\"note\":\"Delivery test\",\"zones\":0,\"tracks\":1}",
  "items": [
    "+ИД+"
  ]
}
24 hockeyist
 
22.11.22
12:21
(23) Я же говорю, Wialon знает толк в извращениях
25 Kassern
 
22.11.22
12:22
(24) бредятина, я думал это ТС с кавычками намудрил)
26 hockeyist
 
22.11.22
12:23
(23) Вместо слэшей должны быть кавычки
27 Kassern
 
22.11.22
12:24
(17) Даже если и так, то все равно лучше через записьjson делать, так как тут как минимум есть массивы, которые по любому нужно будет какой-то логикой заполнять да и параметры изменять. Через структуру/массив сделать это будет гораздо удобнее.
28 hockeyist
 
22.11.22
12:25
(27) Согласен. Только надо обратить внимание на вложенный JSON
29 lav151
 
22.11.22
13:59
(15) Я изначально, до публикации темы игрался со слэшами.

Попробовал по вашим рекомендациям, пока не получилось исправить. Сделал вложенный JSON. Вставил его в http запрос.
Ресурс="/wialon/ajax.html?svc=token/update&sid="+СИД+"&params="+ТекстJSON;
Запрос = Новый HTTPЗапрос(Ресурс);

Адрес ресурса получился следующим:
/wialon/ajax.html?svc=token/update&sid=04b0a15537ad3e849b0f02794394e1a0&params={
"callMode": "create",
"app": "locator",
"at": 0,
"dur": 864000,
"fl": 256,
"p": "{\"note\":\"Delivery\",\"zones\":0,\"tracks\":1}",
"items": [
"20257630"
]
}
30 Kassern
 
22.11.22
14:04
(29) какой ответ приходит вам? Текст ответа выложите. Попробуйте все же вместо "{\"note\":\"Delivery\",\"zones\":0,\"tracks\":1}" -> создать новый запись json со структурой note,Delivery,tracks и результат вставьте как строку в параметр "p"
31 Kassern
 
22.11.22
14:05
Я бы еще попробовал вариант без двойного jsonа на всякий случай. Ну и код покажите, как вы json формируется, а то может вы тупо текст вставляете)
32 lav151
 
22.11.22
14:07
(31)
    ДанныеПараметры = Новый Структура;
    ДанныеПараметры.Вставить("callMode", "create");
    ДанныеПараметры.Вставить("app", "locator");
    ДанныеПараметры.Вставить("at", 0);
    ДанныеПараметры.Вставить("dur", 864000);
    ДанныеПараметры.Вставить("fl", 256);
    
    СтрокаП="{""note"":""Delivery"",""zones"":0,""tracks"":1}";
    
    ДанныеПараметры.Вставить("p",СтрокаП);
    ДанныеПараметры.Вставить("items",МассивИД);
    
    ЗаписьJSON = Новый ЗаписьJSON;            
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON,ДанныеПараметры);
    ТекстJSON=ЗаписьJSON.Закрыть();
    
    Ресурс="/wialon/ajax.html?svc=token/update&sid="+СИД+"&params="+ТекстJSON;
    Запрос = Новый HTTPЗапрос(Ресурс);
33 lav151
 
22.11.22
14:08
(30) Ошибка такая же как и была. {"error":4} - Неверный ввод
34 Kassern
 
22.11.22
14:08
(32) Вам же тут несколько раз писали про вложенный json. Создайте еще одну запись json и  разберите строчку  {""note"":""Delivery"",""zones"":0,""tracks"":1}
35 Kassern
 
22.11.22
14:08
(33) код ответа какой от сервиса?
36 hockeyist
 
22.11.22
14:09
(29) (31) Ну? Что я говорил? Чел впихнул слэши... а-ха-ха, видимо, это неисправимо
37 Kassern
 
22.11.22
14:09
Ну и на по следок Ресурс=КодироватьСтроку(ваша строка, типкодировки);
38 Kassern
 
22.11.22
14:11
(36) Кто-то нас обманывает), смотрите в (29) есть слешы, а в (32) их уже нет, чудеса)
39 hockeyist
 
22.11.22
14:18
Отличие от примера только в Note
40 lav151
 
23.11.22
10:23
(39) Note - это описание, может быть любым.
41 lav151
 
23.11.22
10:23
ДанныеПараметры = Новый Структура;
    ДанныеПараметры.Вставить("callMode", "create");
    ДанныеПараметры.Вставить("app", "locator");
    ДанныеПараметры.Вставить("at", 0);
    ДанныеПараметры.Вставить("dur", 864000);
    ДанныеПараметры.Вставить("fl", 256);
    
    
    ДанныеПараметрыДляП = Новый Структура;
    ДанныеПараметрыДляП.Вставить("note", "Delivery");
    ДанныеПараметрыДляП.Вставить("zones", 0);
    ДанныеПараметрыДляП.Вставить("tracks", 1);

    ПараметрыДжсон = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет," ", Истина);
    
    ЗаписьJSON_ДляП = Новый ЗаписьJSON;            
    ЗаписьJSON_ДляП.УстановитьСтроку(ПараметрыДжсон);
    ЗаписатьJSON(ЗаписьJSON_ДляП,ДанныеПараметрыДляП);
    
    ТекстJSON_ДляП=ЗаписьJSON_ДляП.Закрыть();
        
    ДанныеПараметры.Вставить("p",ТекстJSON_ДляП);
    ДанныеПараметры.Вставить("items",МассивИД);
        
    ЗаписьJSON = Новый ЗаписьJSON;            
    ЗаписьJSON.УстановитьСтроку(ПараметрыДжсон);
    ЗаписатьJSON(ЗаписьJSON,ДанныеПараметры);
    ТекстJSON=ЗаписьJSON.Закрыть();
    
    Ресурс="/wialon/ajax.html?svc=token/update&sid="+СИД+"&params="+ТекстJSON;
    Запрос = Новый HTTPЗапрос(Ресурс);
42 lav151
 
24.11.22
17:03
Нашел ошибку. Воспользовался сниффером, там и увидел косяк в запросе. Я изначально отправлял верный в 1С http запрос, а сниффер показал что отправляется запрос с обратным слэшом. Пришлось заменить правильный слэш на его кодировку в url. После этого все заработало.

Ресурс="wialon/ajax.html?svc=token/update&sid="+СИД+"&params="+СтрЗаменить(ТекстJSON,"\","%5C");
43 Kassern
 
24.11.22
17:05
(42) А пробовали использовать КодироватьСтроку()? Если мне не изменяет память, то при кодировани в урл эта проблема уйдет
44 lav151
 
24.11.22
17:18
(43) Да, пробовал. Выходила 404 ошибка
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.