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