Имя: Пароль:
1C
1C 7.7
v7: Посылка запроса к вэб серверу с JSON
0 maestro-72
 
17.05.16
10:50
Требуется отсылать данные к веб серверу в формате JSON. Никогда с этим ранее не сталкивался. Делал обращение к вебу через Microsoft.XMLHTTP отсылал xml данные, json отсылать не приходилось. Если не трудно, натолкните на мысль или где толково почитать ссылку, сам не нашел. Может примерчик толковый, буду рад. Спасибо.
1 drcrasher
 
17.05.16
10:51
методическую поддержку посмотреть - не?
2 maestro-72
 
17.05.16
10:55
(1) Методическую? Там написано как правильно отослать данные json на веб. Давайте ссылку с удовольствием почитаю. Речь идет о 1с77. В 1с8 проще...
3 drcrasher
 
17.05.16
10:57
(2) 77? предупреждать надо было.
а так - джейсон - это банальный текстовик собранный по определённым правилам. если просто текст запросом послать можешь, то проблем не должно быть
4 ADirks
 
17.05.16
10:58
5 maestro-72
 
18.05.16
17:20
По инструкции мне предлагается посылать запрос с помощью CURL
Чтото типа
curl ­H "Content­Type: application/json" ­X POST ­d '{"api_key": "TEST_API_KEY_FOR_UR007",.... "total": 4008.47 } ] }'
http://Какойтосайт.ru/vs/api/orders.json
хочу с помощью Microsoft.XMLHTTP Post запросом отправить. Как это сделать?
6 maestro-72
 
18.05.16
17:22
или как посмотреть, что делает CURL и на этой основе свой запрос написать. Не хочу использвоать стороннюю программу, когда можно все сделать встроенными средствами.
7 BalBess
 
19.05.16
07:46
httpRequest = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
httpRequest.Open("POST",АдресСкрипта,0); // Синхронный режим.
// устанавливаем заголовки
httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
// посылаем данные
httpRequest.send(data);// Интересно, если размер строки больше 385 Кб 1С вылетает...
if (httpRequest.Status = 200) then
    ResText = СокрЛП(httpRequest.ResponseText);
else
    СтрокаСостояния("Статус ответа: "+httpRequest.Status +" - "+ httpRequest.statusText, "!!!");
endif;    


В data пихай свой json
только это "эскиз", надо все оборачивать в попытка/исключение
8 ADirks
 
19.05.16
08:20
посмотреть кто что посылает можно например такой штукой: http://www.ieinspector.com/

ещё пример, с долбанным utf-8
только куда тут пихать JSON - в URL или в Data - я не знаю

Функция ЗапросКСайту(Метод, Аргументы)
    Команда = "method="+Метод;

    Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
    Скрипт.Language = "JScript";
    Стр = "
    |function utf8_decode (aa) {
    |    var bb = '', c = 0;
    |    for (var i = 0; i < aa.length; i++) {
    |        c = aa.charCodeAt(i);
    |        if (c > 127) {
    |            if (c > 1024) {
    |                if (c == 1025) {
    |                    c = 1016;
    |                } else if (c == 1105) {
    |                    c = 1032;
    |                }
    |                bb += String.fromCharCode(c - 848);
    |            }
    |        } else {
    |            bb += aa.charAt(i);
    |        }
    |    }
    |    return bb;
    |}
    |
    |function DoCommand(Command)
    |{
    |    var URL = '"+API_Entry+"?' + Command;
    |
    |    var WinHttp = new ActiveXObject('WinHttp.WinHttpRequest.5.1');
    |    WinHttp.Option(2, 'utf-8');
    |    WinHttp.Open('POST', URL, 0); //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');
    |        
    |    WinHttp.Send();
    |
    |    return WinHttp.responseText;
    |    return utf8_decode(WinHttp.responseText);
    |}
    |";
    Скрипт.AddCode(стр);
    
    Попытка
        Ответ = Скрипт.Run("DoCommand", Команда);
    Исключение
        Ответ = 0;
    КонецПопытки;

    Возврат Ответ;
КонецФункции
9 Pistol
 
19.05.16
08:26
(7) А зачем ты ставишь такой тип содержимого?
10 ALFkz
 
19.05.16
08:45
Я так делаю
ПараметрыЗапроса=Новый Структура;
    ПараметрыЗапроса.Вставить("client_message_id",Строка(НомерСообщения));
    ПараметрыЗапроса.Вставить("sender","TsGarant");
    ПараметрыЗапроса.Вставить("recipient",НомерТелефона);
    ПараметрыЗапроса.Вставить("message_text",СОКРЛП(Текст));
    
    СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(ПараметрыЗапроса);


  WinHttp=Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
        
        WinHttp.Open("POST","https://api.??.??/app/smsgw/rest/v2/messages",0);
        WinHttp.SetRequestHeader("Content-Type","application/json;charset=utf-8");
        WinHttp.SetRequestHeader("Authorization","Basic dHNnX34234234234234234234234");
        WinHttp.Send(СтрокаJSON);
        ТекстОтвет = WinHttp.ResponseText();


Функция URLEncode(стр) Экспорт    
    Длина=СтрДлина(Стр);
    Итог="";
    Для Н=1 По Длина Цикл
        Знак=Сред(Стр,Н,1);
        Код=КодСимвола(Знак);
        
        если ((Знак>="a")и(Знак<="z")) или
             ((Знак>="A")и(Знак<="Z")) или
             ((Знак>="0")и(Знак<="9")) тогда
            Итог=Итог+Знак;
        Иначе
            Если (Код>=КодСимвола("А"))И(Код<=КодСимвола("п")) Тогда
                Итог=Итог+"%"+ПреобразоватьвСистему(208,16)+"%"+ПреобразоватьвСистему(144+Код-КодСимвола("А"),16);
            ИначеЕсли (Код>=КодСимвола("р"))И(Код<=КодСимвола("я")) Тогда
                Итог=Итог+"%"+ПреобразоватьвСистему(209,16)+"%"+ПреобразоватьвСистему(128+Код-КодСимвола("р"),16);
            ИначеЕсли (Знак="ё") Тогда
                Итог=Итог+"%"+ПреобразоватьвСистему(209,16)+"%"+ПреобразоватьвСистему(145,16);
            ИначеЕсли (Знак="Ё") Тогда
                Итог=Итог+"%"+ПреобразоватьвСистему(208,16)+"%"+ПреобразоватьвСистему(129,16);
            Иначе
                Итог=Итог+"%"+ПреобразоватьвСистему(Код,16);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Возврат Итог;
КонецФункции

Функция СформироватьСтрокуJSONИзМассива(Объект)
    СтрокаJSON = "[";
    
    Для каждого Элемент Из Объект Цикл
        Если ТипЗнч(Элемент) = Тип("Строка") Тогда
            СтрокаJSON = СтрокаJSON + """" + Элемент + """";
        ИначеЕсли ТипЗнч(Элемент) = Тип("Число") Тогда
            СтрокаJSON = СтрокаJSON + СтрЗаменить(Строка(Элемент), Символы.НПП, "");
        ИначеЕсли ТипЗнч(Элемент) = Тип("Булево") Тогда
            СтрокаJSON = СтрокаJSON + Формат(Элемент, "БЛ=false; БИ=true");
        ИначеЕсли ТипЗнч(Элемент) = Тип("Дата") Тогда
            СтрокаJSON = СтрокаJSON + Формат(Элемент - Дата(1970,1,1,1,0,0), "ЧГ=0");
        ИначеЕсли ТипЗнч(Элемент) = Тип("Массив") Тогда
            СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент);
        ИначеЕсли ТипЗнч(Элемент) = Тип("Структура") Тогда
            СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент);
        ИначеЕсли ТипЗнч(Элемент) = Тип("ТаблицаЗначений") Тогда
            СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент);
        Иначе
            СтрокаJSON = СтрокаJSON + """" + URLEncode(Строка(Элемент)) + """";
        КонецЕсли;
        
        СтрокаJSON = СтрокаJSON + ",";
    КонецЦикла;
    
    Если Прав(СтрокаJSON, 1) = "," Тогда
        СтрокаJSON = Лев(СтрокаJSON, СтрДлина(СтрокаJSON)-1);
    КонецЕсли;
    
    Возврат СтрокаJSON + "]";
КонецФункции

Функция СформироватьСтрокуJSONИзСтруктуры(Объект)
    СтрокаJSON = "{";
    
    Для каждого Элемент Из Объект Цикл
        Если Элемент.Значение = "" Тогда
            Продолжить;
        КонецЕсли;
        
        СтрокаJSON = СтрокаJSON + """" + Элемент.Ключ + """" + ":";
        
        Если ТипЗнч(Элемент.Значение) = Тип("Строка") Тогда
            СтрокаJSON = СтрокаJSON + """" + Элемент.Значение + """";
        ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Число") Тогда
            СтрокаJSON = СтрокаJSON + СтрЗаменить(Строка(Элемент.Значение), Символы.НПП, "");
        ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Булево") Тогда
            СтрокаJSON = СтрокаJSON + Формат(Элемент.Значение, "БЛ=false; БИ=true");
        ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Дата") Тогда
            СтрокаJSON = СтрокаJSON + Формат(Элемент.Значение - Дата(1970,1,1,1,0,0), "ЧГ=0");
        ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Массив") Тогда
            СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент.Значение);
        ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Структура") Тогда
            СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент.Значение);
        ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("ТаблицаЗначений") Тогда
            СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент.Значение);
        Иначе
            СтрокаJSON = СтрокаJSON + """" + URLEncode(Строка(Элемент.Значение)) + """";
        КонецЕсли;
        
        СтрокаJSON = СтрокаJSON + ",";
    КонецЦикла;
    
    Если Прав(СтрокаJSON, 1) = "," Тогда
        СтрокаJSON = Лев(СтрокаJSON, СтрДлина(СтрокаJSON)-1);
    КонецЕсли;
    
    Возврат СтрокаJSON + "}";
КонецФункции

Функция СформироватьСтрокуJSON(Объект) Экспорт
    СтрокаJSON = "";
    
    Если ТипЗнч(Объект) = Тип("Массив") Тогда
        СтрокаJSON = СформироватьСтрокуJSONИзМассива(Объект);
    ИначеЕсли ТипЗнч(Объект) = Тип("Структура") Тогда
        СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Объект);
    ИначеЕсли ТипЗнч(Объект) = Тип("ТаблицаЗначений") Тогда
        СоставСтруктуры = "";
        Для каждого Колонка Из Объект.Колонки Цикл
            СоставСтруктуры = СоставСтруктуры + ?(ЗначениеЗаполнено(СоставСтруктуры), ",", "") + Колонка.Имя;
        КонецЦикла;
        
        МассивСтрок = Новый Массив;
        Для каждого Строка Из Объект Цикл
            СтруктураКолонок = Новый Структура(СоставСтруктуры);
            ЗаполнитьЗначенияСвойств(СтруктураКолонок, Строка);
            МассивСтрок.Добавить(СтруктураКолонок);
        КонецЦикла;
        
        СтрокаJSON = СформироватьСтрокуJSONИзМассива(МассивСтрок);
    КонецЕсли;
    
    Возврат СтрокаJSON;
КонецФункции

Процедура ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, ТипДанных)
    ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));    
    НомерЗначения = 0;
    
    Пока ТекстJSON <> "" Цикл
        ПервыйСимвол = Лев(ТекстJSON, 1);
        Если ПервыйСимвол = "{" Тогда
            Значение = Новый Структура;
            ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");
            
            Если ТипДанных = "Структура" Тогда
                Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
                НомерЗначения = НомерЗначения + 1;
            ИначеЕсли ТипДанных = "Массив" Тогда
                Результат.Добавить(Значение);
            КонецЕсли;
        ИначеЕсли ПервыйСимвол = "[" Тогда
            Значение = Новый Массив;
            ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");
            
            Если ТипДанных = "Структура" Тогда
                Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
                НомерЗначения = НомерЗначения + 1;
            Иначе
                Результат.Добавить(Значение);
            КонецЕсли;
        ИначеЕсли ПервыйСимвол = "}" И ТипДанных = "Структура" Тогда
            ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            Если Лев(ТекстJSON, 1) = "," Тогда
                ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            КонецЕсли;
            
            Возврат;
        ИначеЕсли ПервыйСимвол = "]" И ТипДанных = "Массив" Тогда
            ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            Если Лев(ТекстJSON, 1) = "," Тогда
                ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
            КонецЕсли;
            
            Возврат;
        Иначе
            Если ТипДанных = "Структура" Тогда
                
                Поз = Найти(ТекстJSON, ":");
                Если Поз = 0 Тогда
                    Прервать;
                КонецЕсли;
                
                ИмяЗначения = СокрЛП(Лев(ТекстJSON, Поз-1));
                
                ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз+1));
                
                Если Лев(ТекстJSON, 1) = "{" Тогда
                    Значение = Новый Структура;
                    ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");
                ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда
                    Значение = Новый Массив;
                    ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");
                Иначе
                    Поз = 0;  Кавычка=ложь;
                    Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
                        Символ = Сред(ТекстJSON, Сч, 1);
                        Если (Символ = "," и Не Кавычка) ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
                            Поз = Сч;
                            Прервать;
                        КонецЕсли;
                        Если Символ=Символ(34) тогда
                            Кавычка=Не Кавычка;
                        конецесли;
                        
                    КонецЦикла;
                    
                    Если Поз = 0 Тогда
                        Значение = ТекстJSON;
                        ТекстJSON = "";
                    Иначе
                        Значение = Лев(ТекстJSON, Поз-1);
                        ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));
                    КонецЕсли;
                    
                    Значение = СокрЛП(Значение);
                КонецЕсли;
                
                Результат.Вставить(СтрЗаменить(ИмяЗначения,Символ(34),""), СтрЗаменить(Значение,Символ(34),""));
            ИначеЕсли ТипДанных = "Массив" Тогда
                Поз = 0;
                Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
                    Символ = Сред(ТекстJSON, Сч, 1);
                    Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
                        Поз = Сч;
                        Прервать;
                    КонецЕсли;
                КонецЦикла;
                
                Если Поз = 0 Тогда
                    Значение = ТекстJSON;
                    ТекстJSON = "";
                Иначе
                    Значение = Лев(ТекстJSON, Поз-1);
                    ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));
                КонецЕсли;
                
                Значение = СокрЛП(Значение);
                
                Результат.Добавить(Значение);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Функция ЗаполнитьСтруктуруИзОтветаJSON(Знач ТекстJSON) Экспорт
    Результат = Новый Структура;
    
    ТекстJSON = СтрЗаменить(ТекстJSON, "\""", """");
    //ТекстJSON = СтрЗаменить(ТекстJSON, """", "");    
    Если Лев(ТекстJSON, 1) = "{" Тогда
        ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, "Структура");
    ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда
        МассивДанных = Новый Массив;
        ЗаполнитьДанныеИзОтветаJSON(МассивДанных, ТекстJSON, "Массив");
        
        Результат.Вставить("Значение", МассивДанных);
    КонецЕсли;
        
    Возврат Результат;
КонецФункции
11 maestro-72
 
19.05.16
09:06
Огромное всем спасибо, буду разбираться. Есть над чем подумать...
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.