Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Рабочий пример отправки файла json на сайт

v7: Рабочий пример отправки файла json на сайт
Я
   МимохожийОднако
 
25.05.21 - 12:48
Ищу рабочий пример отправки файла формата json.
 
 Партнерская программа EFSOL Oblako
   МимохожийОднако
 
1 - 25.05.21 - 12:49
1С:Предприятие 7.7
   МимохожийОднако
 
2 - 25.05.21 - 12:50
Чем можно проверить, что в результате отсылается на сайт?
   Кирпич
 
3 - 25.05.21 - 12:54
(2) Послать на свой сайт и там принять. Такой вариант подойдет?
   big
 
4 - 25.05.21 - 13:28
Что-то вроде этого:
curl.exe +" -X POST https://ismp.crpt.ru/api/v3/auth/cert/ -H ""content-type: application/json;charset=UTF-8"" --data-binary @"+ИмяФайлаИсходящий+" --output " + ФайлОтвета;

ИмяФайлаИсходящий - твой json с данными.

Это реальная командная строка для получения токена с Честного знака.

з.ы. если конечно там ничего не поменяли ))
   fisher
 
5 - 25.05.21 - 13:33
(2) fiddler
(4) Курлом нещитово :)
   big
 
6 - 25.05.21 - 13:38
(5) Чойта?? Очень рабочий вариант. Очень!


Начал переделывать на WinHTTP, но что-то боюсь будущих известных глюков ))
   fisher
 
7 - 25.05.21 - 13:54
(6) Шутка юмора. Курл - универсальная отмычка.
А в 7.7 хоть так хоть эдак без внешних зависимостей не обойтись, так что вполне норм. Только и того, что библиотекой красивше чуток, что ли...
   2mugik
 
8 - 25.05.21 - 14:33
(0)winHTTP а семерке нормально работало.
   big
 
9 - 25.05.21 - 19:14
(8) При объеме получаемых данных более 150 кБ (или сколько там - точно не помню) 7-ка вешается наглухо. Я на ЕГАИС с этой багофичей столкнулся, пришлось очень быстро переделывать на курлу.
   МимохожийОднако
 
10 - 25.05.21 - 19:59
(8) Можно примерчик? )
   tgu82
 
11 - 25.05.21 - 20:12
(10) Я и через curl  отправлял несколько лет а сейчас через ncftp
   FN
 
12 - 26.05.21 - 10:45
Примерно так:
winhttp = СоздатьОбъект("winhttp.winhttprequest.5.1");
winhttp.Open(Метод,УРЛ);
...

СтримЧтение = СоздатьОбъект("ADODB.Stream");
СтримЧтение.Type = 1;
СтримЧтение.Mode = 3;
СтримЧтение.Charset = "UTF-8";
СтримЧтение.Open();

Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.Language = "VBScript"; 
Скрипт.Timeout=-1;
Скрипт.AddObject("StreamRead",СтримЧтение);
Скрипт.AddObject("winhttp",winhttp);
СтримЧтение.LoadFromFile(ИмяФайлаСЗапросом);

Если СтримЧтение.Type=1 Тогда
    Скрипт.Eval("winhttp.send(StreamRead.Read())");
Иначе
    Скрипт.Eval("winhttp.send(StreamRead.ReadText())");
КонецЕсли;
   SiAl-chel
 
13 - 26.05.21 - 11:26
(12) Непонятно зачем создавать внутри 1С winhttprequest, чтобы потом его передавать в скрипт, выполняемый через MSScriptControl? Не проще ли в скрипте создать объект winhttprequest или уже в коде самой 1С оперировать объектом winhttprequest без всяких там MSScriptControl?
   big
 
14 - 26.05.21 - 11:55
WinHttp=СоздатьОбъект("WinHttp.WinHttpRequest.5.1");

WinHttp.Option(2,"UTF-8");
WinHttp.SetTimeouts(10000,10000,10000,10000);

Если флПрокси<>0 Тогда
    ПрксСервер    = СокрЛП(ПроксиСервер);
    ПрксЮзер    = СокрЛП(ПроксиПользователь);
    ПрксПароль    = СокрЛП(ПроксиПароль);
    
    WinHttp.SetProxy(2,ПрксСервер);
КонецЕсли;

ТипЗапроса    = "GET";
АдресСервиса    = "https://ismp.crpt.ru/api/v3/auth/cert/key";
СпсЗаголовки    = СоздатьОбъект("СписокЗначений");
СпсЗаголовки.ДобавитьЗначение("application/json;charset=UTF-8","content-type");

Попытка
    WinHttp.Open(ТипЗапроса, АдресСервиса, 0);
    // 0 - для сервера, 1 - для прокси
    Если флПрокси<>0 Тогда
        WinHttp.SetCredentials(ПрксЮзер,ПрксПароль,1);
    КонецЕсли;
Исключение
    Сообщить("СоздатьОбъектWinHttp Ошибка при попытке установить соединение с "+АдресСервиса+": "+ОписаниеОшибки());
    Возврат 0;
КонецПопытки;

Если ТипЗначенияСтр(СпсЗаголовки) = "СписокЗначений" Тогда
    Для а = 1 По СпсЗаголовки.РазмерСписка() Цикл
        ИмяЗаголовка = "";
        ЗначениеЗаголовка = СпсЗаголовки.ПолучитьЗначение(а,ИмяЗаголовка);
        Если (ПустоеЗначение(ИмяЗаголовка) = 0) И (ПустоеЗначение(ЗначениеЗаголовка) = 0) Тогда
            WinHttp.SetRequestHeader(ИмяЗаголовка, ЗначениеЗаголовка);
        КонецЕсли;
    КонецЦикла;
КонецЕсли;
ТекстДляОтправки    = "0123456789ADCDEF";

WinHttp.Send(ТекстДляОтправки);
ОтветСервиса    = WinHttp.ResponseText();
Если WinHttp.Status <> 200 Тогда // 200 - статус ОК
    Сообщить("Ошибка: "+WinHttp.Status + " - " + WinHttp.StatusText);
Иначе
    Сообщить("ОК");
КонецЕсли;


Красоту наводить не стал, всё и так понятно
   FN
 
15 - 26.05.21 - 13:10
(13) Скрипт нужен что бы обойти проблему из (9)
Объекты проще создавать и управлять ими именно из кода 1С, чем делать все в скрипте. Скрипт нужен только что бы большой объем данных был обработан за пределами процесса 1Cv7.
   МимохожийОднако
 
16 - 26.05.21 - 13:52
(14) А можно пример POST-запроса?
или достаточно использовать строку 
ТипЗапроса    = "POST";
вместо 
ТипЗапроса    = "GET";
?
   FN
 
17 - 26.05.21 - 15:55
(16) просто строка.
Пример запроса:

        СоединениеWinHttp=СоздатьОбъект("WinHttp.WinHttpRequest.5.1");

    СоединениеWinHttp.SetTimeouts(1000,2000,2000,2000);
    СоединениеWinHttp.Open("POST", "http://********.com/********.php", 0);
    СоединениеWinHttp.SetRequestHeader("Content-Type","multipart/form-data;charset=Windows-1251;boundary=" + Boundary);
    СоединениеWinHttp.SetRequestHeader("Content-Length", СтрДлина(ТекстЗапроса));
    Попытка
        СоединениеWinHttp.Send(ТекстЗапроса);
    Исключение
    КонецПопытки;
        Если СоединениеWinHttp.ResponseText="passed" Тогда
   МимохожийОднако
 
18 - 27.05.21 - 09:31
При открытии объекта СтримЧтение (ADODB.Stream)
выдал ошибку: Операция не допускается в данном контексте
Надо что-то зарегистрировать или права добавить? или что-то еще?
   МимохожийОднако
 
19 - 27.05.21 - 10:01
Ошибку победил. Причина в неправильном пути к файлу с текстом запроса.

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.