Имя: Пароль:
1C
1C 7.7
v7: WinHttpRequest передача JSON по HTTPS
,
0 OnePrg
 
15.06.22
16:39
КОД НЕ РАБОЧИЙ! Не уверен, что именно так и надо, но, что нарыл:

    WinHttp  = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    WinHttp.Open(СокрЛП("POST"), СокрЛП(Адрес),0);
    WinHttp.SetCredentials(Логин,Пароль,0);
    WinHttp.SetRequestHeader("Authorization"," Basic " + глКодироватьСтрокуВ_Base64(Логин+":"+Пароль));
    
    СтримЧтение = СоздатьОбъект("ADODB.Stream");
    СтримЧтение.Type     = 1;
    СтримЧтение.Mode     = 3;
    //СтримЧтение.Charset = "UTF-8";
    СтримЧтение.Open();
    
    Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
    Скрипт.Language     = "VBScript";
    Скрипт.Timeout        = -1;
    Скрипт.AddObject("StreamRead",WinHttp);
    Скрипт.AddObject("winhttp",WinHttp);
    СтримЧтение.LoadFromFile("d:\ref.txt");
    
    Если СтримЧтение.Type=1 Тогда
        Скрипт.Eval("winhttp.send(StreamRead.Read())");  <------------- Объект не поддерживает это свойство или метод
    Иначе
        Скрипт.Eval("winhttp.send(StreamRead.ReadText())");
    КонецЕсли;
1 RomanYS
 
15.06.22
16:43
(0) а чем встроенный функционал 1с не угодил?
2 Выпрь
 
15.06.22
16:44
(1) в 77?
3 RomanYS
 
15.06.22
16:50
(2) Не заметил) Вопрос снимается
4 Kigo_Kigo
 
15.06.22
17:10
winhttp.send(ТекстДжисон);  как то так
5 OnePrg
 
15.06.22
17:13
пардон, код без ошибки такой

    WinHttp  = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    WinHttp.Open(СокрЛП("POST"), СокрЛП(Адрес),0);
    WinHttp.SetCredentials(Логин,Пароль,0);
    WinHttp.SetRequestHeader("Authorization"," Basic " + глКодироватьСтрокуВ_Base64(Логин+":"+Пароль));
    
    СтримЧтение = СоздатьОбъект("ADODB.Stream");
    СтримЧтение.Type     = 1;
    СтримЧтение.Mode     = 3;
    //СтримЧтение.Charset = "UTF-8";
    СтримЧтение.Open();
    
    Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
    Скрипт.Language     = "VBScript";
    Скрипт.Timeout        = -1;
    Скрипт.AddObject("StreamRead",СтримЧтение);
    Скрипт.AddObject("winhttp",WinHttp);
    СтримЧтение.LoadFromFile("d:\ref.txt");
    
    Если СтримЧтение.Type=1 Тогда
        Скрипт.Eval("winhttp.send(StreamRead.Read())");
    Иначе
        Скрипт.Eval("winhttp.send(StreamRead.ReadText())");
    КонецЕсли;    


Но при этом:

Status:       415
StatusText:   Unsupported Media Type
ResponseText: {"type":"https://tools.ietf.org/html/rfc7231#section-6.5.13","title":"Unsupported Media Type","status":415,"traceId":"|b80aa874-43dea69ce2e435bc."}
6 OnePrg
 
15.06.22
17:15
(4) пробовал и так - передавал в параметры Send  текстовую строку в формате JSON

Результат: Unsupported Media Type
7 OnePrg
 
15.06.22
17:16
Если вот эту строку разкоментировать

СтримЧтение.Charset = "UTF-8";

Тогда: Операция не допускается в данном контексте.
8 Kigo_Kigo
 
15.06.22
17:16
415 Unsupported Media Type
Код ответа на ошибку клиента HTTP 415 Unsupported Media Type указывает, что сервер отказывается принять запрос, потому что формат содержимого не поддерживается сервером.

Проблема формата может быть связана с указанным запросом Content-Type или Content-Encoding или в результате непосредственного контроля данных.
9 Kigo_Kigo
 
15.06.22
17:17
у тебя сервер твой джисон не понимает
10 Kigo_Kigo
 
15.06.22
17:19
короче по НТТПС у меня вот это работало отлично без скриптов напрямую


ИмяФайла =  КаталогИБ() + "txt2_"; //ПолучитьИмяВременногоФайла("txt2_");
    
    XOriginRequestId = Строка(СоздатьGUID());
    //Час     ="";
    //Минута  ="";
    //Секунда ="";
    //ТекВремя   = ТекущееВремя(Час, Минута, Секунда);
    
    ГодДата = ДатаГод(ТекущаяДата());
    МесяцДата = ДатаМесяц(ТекущаяДата());
    ДеньДата = ДатаЧисло(ТекущаяДата());
    Если СтрДлина(МесяцДата) = 1 Тогда
        МесяцДата = Строка("0") + Строка(МесяцДата);
    КонецЕсли;
    Если СтрДлина(ДеньДата) = 1   Тогда
        ДеньДата = Строка("0") + Строка(ДеньДата);
    КонецЕсли;
    
    XTimestamp = Строка(Строка(ГодДата)+ "-" + Строка(МесяцДата) + "-" + Строка(ДеньДата) + "T"
    + Строка(ТекущееВремя()) + ".000Z") ;
    

    //URL = "/v1/partner/purchase?total=$total&cash=$cash&scores=$scores" + КодИлиТелефон + "&cashierExternalId=$cashierExternalId";
    Сумма = Док.Итог("Сумма");
    ТекстЗапроса = "https://udsgame.com/v1/partner/purchase?total=";//1000&cash=999&scores=1&code=129174";
    ТекстЗапроса = ТекстЗапроса + Строка(Сумма); //СуммаЧека
    ТекстЗапроса = ТекстЗапроса +"&cash=" + Строка(Сумма-БалловСписать) ;// - (1000-БаловСписать)/100*10); //СуммаЧека -Скидка или баллы
    ТекстЗапроса = ТекстЗапроса +"&scores=" + СокрЛП(БалловСписать); //Списать баллов
    Если СтрДлина(СокрЛП(КодКлиента)) = 6 Тогда
        ТекстЗапроса = ТекстЗапроса +"&code=" + СокрЛП(КодКлиента); //Код клиента или телефон

    Иначе
        ТекстЗапроса = ТекстЗапроса +"&phone=%2B7"+ СокрЛП(КодКлиента); //Код клиента или телефон
    КонецЕсли;  
        ТекстЗапроса = ТекстЗапроса +"&invoiceNumber="+ СокрЛП(Прав(Док.НомерДок,5)); //Номер документа
        ТекстЗапроса = ТекстЗапроса +"&cashierExternalId="+ СокрЛП(Док.Продавец.IDUdsgame); //Код продавца


    //cash=total-scores-10%)

      //invoiceNumber
      
      //cashierExternalId
    //ИсходныеДанные = СоздатьОбъект("ТаблицаЗначений");
    //ИсходныеДанные.НоваяКолонка("total","Число",15,2);
    //ИсходныеДанные.НоваяКолонка("cash","Число",15,2);
    //ИсходныеДанные.НоваяКолонка("scores","Число",15,2);
    //ИсходныеДанные.НоваяКолонка("code","Строка",15);
    //ИсходныеДанные.новаяСтрока();
    //ИсходныеДанные.total=1000;
    //ИсходныеДанные.cash = 999;
    //ИсходныеДанные.scores = 1;
    //ИсходныеДанные.code = "999593";
    //Отправить = "{" + Симв(34) + "scores" + Симв(34) + ": 10.0,"+ Симв(34) + "total"+ Симв(34) + ": 1000.0,"+ Симв(34) + "cash"+ Симв(34) + ": 999.0,"+ Симв(34) + "code"+ Симв(34) + ":"+ Симв(34) + "999593"+ Симв(34) + "}";
//ЗначениеВСтрокуВнутр(ИсходныеДанные);
    //Сообщить(Отправить);
    Отправить = "{" + Симв(34) + "scores" + Симв(34) + ":" + Симв(34) +  СокрЛП(БалловСписать)+ Симв(34) +","
    + Симв(34) +"total"+ Симв(34) + ":" +Симв(34)+ Строка(Сумма) + Симв(34) +","
    + Симв(34) + "cash"+ Симв(34) + ":" + Симв(34)+ Строка(Сумма-БалловСписать)+ Симв(34) +",";
    Если СтрДлина(СокрЛП(КодКлиента)) = 6 Тогда
        
        Отправить = Отправить + Симв(34) + "code"+ Симв(34) + ":"+ Симв(34) + СокрЛП(КодКлиента)+ Симв(34) +",";
    Иначе
        Отправить = Отправить + Симв(34) + "phone"+ Симв(34) + ":%2B7"+ Симв(34) + СокрЛП(КодКлиента)+ Симв(34) +",";

    КонецЕсли;
     Отправить = Отправить + Симв(34) + "invoiceNumber" +  Симв(34) + ":" + Симв(34) + СокрЛП(Прав(Док.НомерДок,5)) +  Симв(34)+ ","
                            +Симв(34) + "cashierExternalId"  + Симв(34) + ":" + Симв(34) + СокрЛП(Док.Продавец.IDUdsgame) +  Симв(34) +"}";
    
//ЗначениеВСтрокуВнутр(ИсходныеДанные);
    //Сообщить(Отправить);
    //ТекстЗапроса = ТекстЗапроса;//+Отправить;
    
    Если Константа.JsonФормат = 1 Тогда
        
        URL = "https://udsgame.com/v1/partner/purchase";//ТекстЗапроса;//"https://udsgame.com/v1/partner/purchase";
        XMLHttpRequest = СоздатьXMLHttpRequest(URL,"POST");
        XMLHttpRequest.setRequestHeader("Accept", "application/json");
        XMLHttpRequest.setRequestHeader("X-Api-Key", Токен);
        
        XMLHttpRequest.setRequestHeader("X-Origin-Request-Id", Строка(XOriginRequestId));
        XMLHttpRequest.setRequestHeader("X-Timestamp", Строка(XTimestamp));
        XMLHttpRequest.send(Отправить);
    Иначе
        URL = ТекстЗапроса;//"https://udsgame.com/v1/partner/purchase";//ТекстЗапроса;//"https://udsgame.com/v1/partner/purchase";
        XMLHttpRequest = СоздатьXMLHttpRequest(URL,"POST");
        XMLHttpRequest.setRequestHeader("Accept", "application/json");
        XMLHttpRequest.setRequestHeader("X-Api-Key", Токен);
        
        XMLHttpRequest.setRequestHeader("X-Origin-Request-Id", Строка(XOriginRequestId));
        XMLHttpRequest.setRequestHeader("X-Timestamp", Строка(XTimestamp));
        XMLHttpRequest.send(ТекстЗапроса);

    КонецЕсли;
    //ОтветОтСервера = СокрЛП(XMLHttpRequest.responseText);
    ТекстОтвета = СоздатьОбъект("Текст");
    ТекстОтвета.открыть(КаталогИБ()+"txt2_");
    ОтветОтСервера = СокрЛП(XMLHttpRequest.responseText);
    ТекстОтвета . ДобавитьСтроку(ОтветОтСервера);
    ИЗСтрокиСЗ = СоздатьОбъект("СписокЗначений");
    
    ТекстОтвета1 = СтрЗаменить(ОтветОтСервера,":",",");
    ТекстОтвета1 = СтрЗаменить(ТекстОтвета1,"{","");
    ТекстОтвета1 = СтрЗаменить(ТекстОтвета1,"}","");


    ИЗСтрокиСЗ.ИзСтрокиСРазделителями(ТекстОтвета1);
    Если ИЗСтрокиСЗ.ПолучитьЗначение(1)  = "errorCode" Тогда
        Предупреждение(СокрЛП(ИЗСтрокиСЗ.ПолучитьЗначение(4)));
11 Kigo_Kigo
 
15.06.22
17:20
Функция СоздатьXMLHttpRequest(URL,Метод = "GET")
    
    Попытка
        XMLHttpRequest = СоздатьОбъект("Msxml2.ServerXMLHTTP");
    Исключение
        Попытка
            XMLHttpRequest = СоздатьОбъект("Msxml2.XMLHTTP.3.0");
        Исключение
            Попытка
                XMLHttpRequest = СоздатьОбъект("Msxml2.XMLHTTP");
            Исключение
                Попытка
                    XMLHttpRequest = СоздатьОбъект("Microsoft.XMLHTTP");
                Исключение
                    Сообщить("Невозможно создать XMLHttpRequest.                                                                                          
                    |" + ОписаниеОшибки(), "!");
                КонецПопытки;
            КонецПопытки;
        КонецПопытки;
    КонецПопытки;
    
    XMLHttpRequest.open(Метод, URL, 0);
    
    Возврат XMLHttpRequest;
    
КонецФункции
12 Kigo_Kigo
 
15.06.22
17:21
Функция СоздатьGUID()
    TypeLib = CreateObject("Scriptlet.TypeLib");
    NewGUID = TypeLib.Guid();
    TypeLib = "";
    Возврат NewGUID;
КонецФункции    

на всякий случай
13 Выпрь
 
15.06.22
17:36
может тогда уж полностью скрипт писать, а не часть там, часть здесь
14 Выпрь
 
15.06.22
17:37
или почему нельзя просто, без эвал
winhttp.send(StreamRead.Read())
15 OnePrg
 
15.06.22
17:40
Попробовал отправить пуcтой JSON

    WinHttp  = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    WinHttp.Open(СокрЛП("POST"), СокрЛП(Адрес),0);
    WinHttp.SetCredentials(Логин,Пароль,0);
    WinHttp.SetRequestHeader("Authorization"," Basic " + глКодироватьСтрокуВ_Base64(Логин+":"+Пароль));
    WinHttp.Send("{}");


Status:       415
StatusText:   Unsupported Media Type
ResponseText:
16 OnePrg
 
15.06.22
17:51
(10) Попробовал твой код:

    XMLHttpRequest = СоздатьXMLHttpRequest(Адрес,"POST");
    XMLHttpRequest.SetRequestHeader("Authorization"," Basic " + глКодироватьСтрокуВ_Base64(Логин+":"+Пароль));
    Т = СоздатьОбъект("Текст");
    Т.Открыть("d:\ref.txt");
    Отправить = "";
    Для инд = 1 по Т.КоличествоСтрок() Цикл
        Отправить = Отправить + Т.ПолучитьСтроку(инд);
    КонецЦикла;    
    XMLHttpRequest.send(Отправить);     

Status:       415
StatusText:   Unsupported Media Type
ResponseText: {"type":"https://tools.ietf.org/html/rfc7231#section-6.5.13","title":"Unsupported Media Type","status":415,"traceId":"|b80ab5c5-43dea69ce2e435bc."}
17 OnePrg
 
15.06.22
17:54
Может сам файл неправильный?

{
"Suppliers":[
{
"ID":"455555",
"Name":"Постачальник1",
"Edrpo":"12222"
},
{
"ID":"455556",
"Name":"Постачальник2",
"Edrpo":"122223"
}
],
"Offers":[
{
"Code":"11111",
"Name":"Товар1",
"Producer":"Фармак (Україна, Київ)",
"VAT":7,
"SupplierCodes":[
{
"ID":"455555",
"Code":"54545422"
},
{
"ID":"455556",
"Code":"5454542222"
}
]
},
{
"Code":"11112",
"Name":"Товар2",
"Producer":"Фармак (Україна, Київ)",
"VAT":7,
"SupplierCodes":[
{
"ID":"455556",
"Code":"54545422"
},
{
"ID":"455555",
"Code":"5454542222"
}
]
}
]
}
18 Ёпрст
 
15.06.22
18:02
постманом, для начала отправь свой мусор, потом ужо.. в 1с-ине играйся
19 OnePrg
 
15.06.22
18:05
415 Неподдерживаемый тип носителя Код состояния 415 (неподдерживаемый тип носителя) указывает на то, что исходный сервер отказывается обслуживать запрос, поскольку полезная нагрузка имеет формат, не поддерживаемый этим методом на целевом ресурсе. Проблема с форматом может быть связана с указанным в запросе Content-Type или Content-Encoding или в результате непосредственной проверки данных.

Может указать в заголовке поля Content-Type или Content-Encoding?
20 OnePrg
 
15.06.22
18:07
Всё! Разобрался!


    XMLHttpRequest = СоздатьXMLHttpRequest(Адрес,"POST");
    XMLHttpRequest.SetRequestHeader("Authorization"," Basic " + глКодироватьСтрокуВ_Base64(Логин+":"+Пароль));
    XMLHttpRequest.SetRequestHeader("content-type","application/json");
    Т = СоздатьОбъект("Текст");
    Т.Открыть("d:\ref.txt");
    Отправить = "";
    Для инд = 1 по Т.КоличествоСтрок() Цикл
        Отправить = Отправить + Т.ПолучитьСтроку(инд);
    КонецЦикла;    
    XMLHttpRequest.send(Отправить);     


Всем спасибо!
21 Злопчинский
 
15.06.22
22:37
(12) а почему не штатным формексом?
22 victuan1
 
16.06.22
07:44
(12) Ну если на "всякий случай", то уж лучше так ;) :

//_____________________________________________________________________________
Функция СоздатьGUID() Экспорт
    Попытка //с использованием 1cpp.dll (https://www.1cpp.ru/docum/icpp/html/guid.html)
        GUID = СоздатьОбъект("GUID");
        GUID.Новый();
        Возврат GUID.ВСтроку()
    Исключение
    КонецПопытки;

    Попытка //без использования v7plus.dll (http://infostart.ru/public/70092/)
        TypeLib = CreateObject("Scriptlet.TypeLib");
        Возврат нрег(СтрЗаменить(СтрЗаменить(TypeLib.Guid, "{", ""), "}", ""));
    Исключение
    КонецПопытки;

    Попытка //с использованием v7plus.dll (как получить (сгенерировать) GUID в 1С 7.7?
        Инфо = СоздатьОбъект("AddIn.V7SysInfo");
        Возврат нрег(Инфо.СоздатьGUID());
    Исключение
    КонецПопытки;
    
    Возврат ""
КонецФункции
23 victuan1
 
16.06.22
07:45
(21) В формексе же ж вроде нет? В 1с++ есть. Или...?
24 Злопчинский
 
16.06.22
07:52
в формексе есть получение GUIDa? в двух вариантах с окаймляющими {} и без

ПолучитьGUID(<?>)
Синтаксис:
ПолучитьGUID(<БезСкобок>)
Назначение:
Генерирует и возвращает GUID в виде строки.
Параметры:
<БезСкобок> - 0 - возвращает GUID, обрамленный фигурными скобками; 1 - возвращает GUID без фигурных скобок. Необязательный, по умолчанию - 0.
ПРИМЕР:
Сервис = СоздатьОбъект(''Сервис'');
Сообщить(Сервис.ПолучитьGUID());
Сообщить(Сервис.ПолучитьGUID(1));
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой