Имя: Пароль:
1C
1C 7.7
v7: Отправка json файлов на сайт
,
0 zenon46
 
29.09.22
10:45
Доброго дня!
Итак немного некрофилии, а именно клюшки, есть сайт созданный на платформе Битрикс, на него нужно кидать файлы выгрузки из базы, файлы есть большие по 50-70 мегабайт, как текст их отправлять не вариант, упадет. Может кто сталкивался с такой задачей, как на сайт выкинуть уже готовый json файл и было бы не плохо еще и ответ от сайта получить ?
1 Guk
 
29.09.22
10:57
(0) курлом, например...
2 zenon46
 
29.09.22
11:01
(1) делал я на старый сайт вот такую отправку

C:\Curl\curl.exe -v -F "ufile=@C:\ta.csv;type=text/plain;filename=ta" -F "__login=%user%" -F "__password=%password%" http://%site%/upload/auto

Но он был не на платформе Битрикс и не было обратной связи, а тут типа сайт ответ может вернуть, как его получить ?
3 Guk
 
29.09.22
11:02
(2) в конце команды укажи " > " + ТвойФайлОтвета...
4 zenon46
 
29.09.22
11:17
(3) можно ли как то обойтись без bat файлов, а напрямую выполнить команду из 7.7 ?
5 Guk
 
29.09.22
11:19
(4) можно...
WShell = СоздатьОбъект("WScript.Shell");
КодВозврата = WShell.Run("%COMSPEC% /C "+КомандаКурла, 0, 1);
6 zenon46
 
29.09.22
12:01
(5) разраб уточнил, "Json должен быть размещен в теле запроса. HTTP-запросы должны быть к соответствующим адресам. Все запросы POST. В заголовках должны присутствовать Content-type и User-Agent." - как это расшифровать на человеческий язык.
7 Kigo_Kigo
 
29.09.22
12:06
(6) URL = "https://ххъ.com/v1/partner/company";
    XMLHttpRequest = СоздатьXMLHttpRequest(URL);
    XMLHttpRequest.Open("GET", URL, 0);  
    XMLHttpRequest.setRequestHeader("Accept", "application/json");
    XMLHttpRequest.setRequestHeader("X-Api-Key", Токен);

    XMLHttpRequest.setRequestHeader("X-Origin-Request-Id", Строка(XOriginRequestId));
    XMLHttpRequest.setRequestHeader("X-Timestamp", Строка(XTimestamp));
    ТекстЗапроса = "https://udsgame.com/v1/partner/company";
    XMLHttpRequest.send(ТекстЗапроса);
8 Kigo_Kigo
 
29.09.22
12:09
ТекстЗапроса - Джесон файл

получишь тут же ответ
ТекстОтвета = СоздатьОбъект("Текст");
    ТекстОтвета.открыть(КаталогИБ()+"txt2_");
    ОтветОтСервера = СокрЛП(XMLHttpRequest.responseText);
    ТекстОтвета . ДобавитьСтроку(ОтветОтСервера);
далее сам распарсишь ответ
9 zenon46
 
29.09.22
12:09
(7) ТекстЗапроса = "https://udsgame.com/v1/partner/company";

    XMLHttpRequest.send(ТекстЗапроса);
Не совсем понял что это значит ? Если передается текст "https://udsgame.com/v1/partner/company"  - то у меня такое не прокатит, 7.7 схлопнется с нехваткой памяти, строки большой длины, мы их в json то упаковываем кусками.
10 Kigo_Kigo
 
29.09.22
12:17
(9) не убрал, это начало запроса , там далее идет формирование джисон файла
вот     ТекстЗапроса = ТекстЗапроса + Строка(Сумма); //СуммаЧека
    ТекстЗапроса = ТекстЗапроса +"&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(ТекстЗапроса);
11 Злопчинский
 
29.09.22
12:21
О. спасибо, мне тоже пригодится.
а что таоке СоздатьXMLHttpRequest
?
12 zenon46
 
29.09.22
12:29
(10) да, а где функция СоздатьXMLHttpRequest ?
13 Salimbek
 
29.09.22
12:35
(11) Скорее всего это обертка над СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
14 zenon46
 
29.09.22
12:57
(13) а что за обертка там, кроме WinHttp=СоздатьОбъект("WinHttp.WinHttpRequest.5.1"); может быть ?
15 Злопчинский
 
29.09.22
13:06
(14) а зачем один операторв функцию оборачивать? для красоты?
16 zenon46
 
29.09.22
13:08
(15) вот и я не пойму, ждемс автора, подсмотреть что там в функции происходит.
17 Злопчинский
 
29.09.22
13:16
(16) а если авто вдруг отравлен снеговиком? и там внутри функции вызов еще функции ... ну чтоб архитектурно все было ;-)
18 Salimbek
 
29.09.22
13:21
(14) А ктож его знает. Может он экспериментировал. Я вот поискал и нашел другой вариант: СоздатьОбъект("MSXML2.XMLHTTP");

Вот, может, чтобы в одном месте играться и вынесено было создание объекта в функцию. А может там еще проверяется на успешное создание, и если один не взлетел, то второй вариант создается...

Так что - ничего удивительного лично я тут не вижу.
19 Garykom
 
гуру
29.09.22
13:24
(14) WinHttp=СоздатьОбъект("MSXML2.XMLHTTP");
еще может быть
это другая либа/объекта под винду, в чем то лучше чем WinHttpRequest
20 Garykom
 
гуру
29.09.22
13:26
(19)+ и есть еще дохрена либ/объектов подобных
https://infostart.ru/1c/articles/249741/

но рекомендую все же разобраться с cURL и использовать его
это намного надежней и универсальней
21 Garykom
 
гуру
29.09.22
13:28
Ибо все эти виндовые объекты через COM/OLE это такое себе решение в случае зоопарка виндов, особенно новых версий или наоборот старых
Да еще с порезанными правами

Намного проще притащить с собой утилитку в .exe (с либами требуемыми статичными) и запускать ее
22 Kigo_Kigo
 
29.09.22
14:13
Функция СоздатьXMLHttpRequest(URL,Метод = "GET")
    
    Попытка
        XMLHttpRequest = СоздатьОбъект("Msxml2.ServerXMLHTTP");
    Исключение
        Попытка
            XMLHttpRequest = СоздатьОбъект("Msxml2.XMLHTTP.3.0");
        Исключение
            Попытка
                XMLHttpRequest = СоздатьОбъект("Msxml2.XMLHTTP");
            Исключение
                Попытка
                    XMLHttpRequest = СоздатьОбъект("Microsoft.XMLHTTP");
                Исключение
                    Сообщить("Невозможно создать XMLHttpRequest.                                                                                          
                    |" + ОписаниеОшибки(), "!");
                КонецПопытки;
            КонецПопытки;
        КонецПопытки;
    КонецПопытки;
    
    XMLHttpRequest.open(Метод, URL, 0);
    
    Возврат XMLHttpRequest;
    
КонецФункции
23 Kigo_Kigo
 
29.09.22
14:15
(22) это под практически под весь зоопарк винды подходит
24 Kigo_Kigo
 
29.09.22
14:15
+ для работы с ХТТПС
25 Arbuz
 
29.09.22
17:53
Это при том, что Djelf запилил ВК для cURL'а, "карлик" Закрывается 1С при отправке POST запроса
26 big
 
29.09.22
18:54
(6) А можно увидеть в подробностях эти требования?

А вообще - curl в таких условиях (при таких то объемах выгрузки) для 7.7 единственный выход. ;)  У меня с Меркурия по 20-40 Мб файлы тянет именно через curl, все WinHttp в клюшках нервно курят )))
27 zenon46
 
30.09.22
09:05
(26) какие подробности, конкретно интересуют ?

Попробовал сделать вот так :

URL = "https://ссылка/api/exchange/v1/catalog/brands";
XMLHttpRequest = СоздатьXMLHttpRequest(URL,"POST");
XMLHttpRequest.setRequestHeader("Content-Type","application/json");
XMLHttpRequest.setRequestHeader("User-Agent","1C-exchange");
//*******
Данные = СоздатьОбъект("ADODB.Stream");
Данные.open();
Данные.loadFromFile(Путь+ИмяФайла+".json");        
//*******
XMLHttpRequest.send(Данные);

В итоге сервер вернул "Request body must contains a valid json." Получается серверу не понравилось что сидит в "Данные"
28 den_oren
 
30.09.22
14:12
Была похожая задача.. Клюшки виснут, если в теле запроса больше 580 кб json. Но есть замечательный инструмент OneScript. Пишем код v8, компилируем в exe, запускаем через командную строку с передачей в неё имени файла, в котором json (тело запроса). Может и сложно, но работает.
29 Arbuz
 
30.09.22
15:02
(28) Вот любите же вы всякие извраты. Если уж использовать внешние инструменты, зачем тогда приплетать сюда экосистему 1с (убогий OneScript, из v7 в v8, обратно и тд), можно, например же, нативно работать с json из java или из того же питона. А если хочется мощно-стильно-молодёжно, то есть голанг, раст в конце концов.
30 big
 
30.09.22
16:38
(27) Так говорит же, что json неверный.

Вот здесь точно строка передается, а не объект? XMLHttpRequest.send(Данные)
Пробовал делать XMLHttpRequest.send(Данные.ReadText())  ??