| 
    
            
         
         | 
    
  | 
Интеграция 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="+СИД+"¶ms={""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="+СИД+"¶ms="+Текст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="+СИД+"¶ms="+ТекстJSON; Запрос = Новый HTTPЗапрос(Ресурс); Адрес ресурса получился следующим: /wialon/ajax.html?svc=token/update&sid=04b0a15537ad3e849b0f02794394e1a0¶ms={ "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="+СИД+"¶ms="+Текст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="+СИД+"¶ms="+ТекстJSON; Запрос = Новый HTTPЗапрос(Ресурс);  | 
|||
| 
    42
    
        lav151    
     24.11.22 
            ✎
    17:03 
 | 
         
        Нашел ошибку. Воспользовался сниффером, там и увидел косяк в запросе. Я изначально отправлял верный в 1С http запрос, а сниффер показал что отправляется запрос с обратным слэшом. Пришлось заменить правильный слэш на его кодировку в url. После этого все заработало.
 
        Ресурс="wialon/ajax.html?svc=token/update&sid="+СИД+"¶ms="+СтрЗаменить(ТекстJSON,"\","%5C");  | 
|||
| 
    43
    
        Kassern    
     24.11.22 
            ✎
    17:05 
 | 
         
        (42) А пробовали использовать КодироватьСтроку()? Если мне не изменяет память, то при кодировани в урл эта проблема уйдет     
         | 
|||
| 
    44
    
        lav151    
     24.11.22 
            ✎
    17:18 
 | 
         
        (43) Да, пробовал. Выходила 404 ошибка     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |