|   |   | 
| 
 | 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()) ?? | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |