Имя: Пароль:
1C
1C 7.7
v7: Отправка XML с помощью Curl
,
0 Aleksandra_19
 
28.12.16
15:44
Добрый день! Проблема следующая.
Формирую файлы xml и отправляю их с помощью curl на сервер. Сама отправка происходит без проблем, файлы добавляются на сервер. После этого сервер присылает ответ в виде файла response.txt, который нужно обработать (достать оттуда код ответа сервера). Ошибка возникает при попытке открыть это respons.txt для обработки. Пшу так:
ТекстПараметров = "C:\curl-7.52.0-win64-mingw\bin\" + "curl.exe" +                "параметры передачи файлов";
ЗапуститьПриложение(ТекстПараметров);
ФайлЛога.Очистить();            
ПустьКФайлу = "D:\SERTHTTP\response.txt";
Если ФС.СуществуетФайл(ПустьКФайлу) = 1 Тогда
       ФайлЛога.КодоваяСтраница(0);
       ФайлЛога.Открыть(ПустьКФайлу);
       Если ФайлЛога.КоличествоСтрок() > 0 Тогда
            //достаем информацию из файла
       КонецЕсли;
Иначе
       Пока ФС.СуществуетФайл(ПустьКФайлу) = 0  Цикл
       ФС.СуществуетФайл(ПустьКФайлу);
       Если ФС.СуществуетФайл(ПустьКФайлу) = 1 Тогда
           //обработка файла
           Прервать;
       КонецЕсли;
       КонецЦикла;                    
КонецЕсли;


В строке ФайлЛога.Открыть(ПустьКФайлу); постоянно выдает ошибку - Неверное имя файла.
Подскажите, пожалуйста, в чем проблема?
1 trdm
 
28.12.16
15:48
Обычно файл после Очистить(); надо еще и записать а потом закрыть.
2 trdm
 
28.12.16
15:49
Попробуй заменить объект "Текст" на "TextStream" из vbs.
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream = FSO.CreateTextFile("C:\Test.txt")
3 trdm
 
28.12.16
15:50
У него есть метод close();
4 Garykom
 
гуру
28.12.16
15:51
Переходите с курла на Ъ :)
5 Aleksandra_19
 
28.12.16
15:52
(3) Записывать ФайлЛога сразу после создания и тут же его закрывать?
6 trdm
 
28.12.16
15:59
Попробуй поменять местами:

ЗапуститьПриложение(ТекстПараметров);
ФайлЛога.Очистить();  

У тебя файл лога же тут заполняется курлом: ЗапуститьПриложение(ТекстПараметров);

А потом ты его очищаешь.
7 Serginio1
 
28.12.16
16:00
8 Aleksandra_19
 
28.12.16
16:06
(6) У меня сначала вызывается запуск курла, а потом очистка файла. Курл присылает ответ в файл respons.txt, а не в ФайлЛога. Или что-то не допонимаю?
9 ptiz
 
28.12.16
16:07
ЗапуститьПриложение() - оно точно ждет окончания?
Попробуй через "WScript.Shell"
и метод .Run(ТекстПараметров, 0, 1);
10 Aleksandra_19
 
28.12.16
16:12
Возможно, я не правильно понимаю смысл самой работы с курлом.Попробую переформулировать вопрос - курл отрабатывает, после этого в определенной папке на диске D появляется текстовик respons.txt, в котором содержится ответ сервера. как мне выбрать именно этот respons.txt и прочитать его содержимое?
11 trdm
 
28.12.16
16:12
(8) Понятно. Думал респонс и файл лога одно и тоже.
12 Aleksandra_19
 
28.12.16
16:15
(11) ФайлЛога я сама создала через объект "Текст", чтобы добраться как-то до содержимого этого respons, но в итоге запуталась и не могу найти ошибку
13 ptiz
 
28.12.16
16:27
(12) Файл в проводнике есть или нет?
14 trdm
 
28.12.16
16:34
(13) есть. Но он залочен.
стандартный способ проверить отпустило ли файло - попробовать переименовать его.

попробуй:

    ФайлЛога.Очистить();            
    ПустьКФайлу = "D:\SERTHTTP\response.txt";
    ПустьКФайлу2 = "D:\SERTHTTP\response.txt.txt";
    Если ФС.СуществуетФайл(ПустьКФайлу) = 1 Тогда
        Пока ФС.СуществуетФайл(ПустьКФайлу2) = 0 Цикл
            Попытка
                ФС.ПереименоватьФайл(ПустьКФайлу,ПустьКФайлу2,1);
            Исключение
            КонецПопытки;
        КонецЦикла;  
        ФС.ПереименоватьФайл(ПустьКФайлу2,ПустьКФайлу,1);
        ФайлЛога = СоздатьОбъект("Текст");
        ФайлЛога.КодоваяСтраница(0);
        ФайлЛога.Открыть(ПустьКФайлу);
        Если ФайлЛога.КоличествоСтрок() > 0 Тогда
            //достаем информацию из файла
            
        КонецЕсли;
    Иначе
        Пока ФС.СуществуетФайл(ПустьКФайлу) = 0  Цикл
            ФС.СуществуетФайл(ПустьКФайлу);
            Если ФС.СуществуетФайл(ПустьКФайлу) = 1 Тогда
                //обработка файла
                
                Прервать;
            КонецЕсли;
        КонецЦикла;                    
    КонецЕсли;
15 Aleksandra_19
 
28.12.16
16:43
(14) ФС.СуществуетФайл(ПустьКФайлу) возвращает 1, т.е. файл уже появляется
16 Aleksandra_19
 
28.12.16
16:48
(14) А что делать если файла нет? как словить момент, когда отпускает файл? Потому что если проделать этот код в отладчике - все отрабатывает отлично
17 trdm
 
28.12.16
16:56
(16) >  как словить момент, когда отпускает файл?

ждать с помощью:
        Пока ФС.СуществуетФайл(ПустьКФайлу2) = 0 Цикл
            Попытка
                ФС.ПереименоватьФайл(ПустьКФайлу,ПустьКФайлу2,1);
            Исключение
            КонецПопытки;
        КонецЦикла;  
а лучше с пом Sleep(1000);
18 Garykom
 
гуру
28.12.16
16:57
Зачем "ловить момент" когда можно дождаться окончания работы curl'а ?

Прочитай уже (9) или "start /wait"
19 Garykom
 
гуру
28.12.16
16:59
(17) Так и хочется спросить вы ждете когда чайник сам закипит и выключится или в процессе постоянно "не кипела" отливаете и тестируете сахаром или термометром?
20 trdm
 
28.12.16
17:05
ну, девушко читает посты ч/з один. что поделаешь?
21 Serginio1
 
28.12.16
17:20
Казалось бы, что проще

Функция ВыполнитьПост(uriSources,Клиент)

  //  Контент=Врап.СоздатьОбъект("System.Net.Http.StringContent","Тестовая Строка",Encoding.UTF8,"text/plain");
    Контент=Врап.СоздатьОбъект("System.Net.Http.StringContent","Тестовая Строка "+uriSources);
    резулт=Клиент.PostAsync(uriSources,Контент).Result;
    
    
    Сообщить("===================================");
    
    Сообщить(резулт.IsSuccessStatusCode);
    Сообщить(Врап.Встроку(резулт.StatusCode));

    стр=резулт.Content.ReadAsStringAsync().Result;
   Сообщить(ПолучитьСтрокуОтвета(стр));
    

КонецФункции // ВыполнитьПост()
22 Serginio1
 
28.12.16
17:24
Клиент = Врап.СоздатьОбъект(HttpClient);
                Контент = Врап.СоздатьОбъект(MultipartFormDataContent);


                 ПотокФайла2 =Врап.ПолучитьТип("System.IO.File").OpenRead(ИмяФайла);
                 ФайловыйКонтент2 =Врап.СоздатьОбъект("System.Net.Http.StreamContent",ПотокФайла2);

// Можно добавить несколько файлов
                 Контент.Add(ФайловыйКонтент2,"attachment","TestXml");

                requestUri = "api/values/SendFiles";

                Результат = Клиент.PostAsync(requestUri, Контент).Result;
                стр = Результат.Content.ReadAsStringAsync().Result;
23 Garykom
 
гуру
28.12.16
17:25
(21) сначала ВК скачать и подключить, а без этого самого главного 99% типичных 1С-ников ничего не поняли
24 Serginio1
 
28.12.16
17:25
22+ это отправка нескольких файлов multipart/form-data
25 Serginio1
 
28.12.16
17:26
(23) Я же все ссылочки в 7 дал.
26 Serginio1
 
28.12.16
17:28
(23) Кстати хорошая ссылока про Ionic 2
27 Serginio1
 
28.12.16
17:28
28 Garykom
 
гуру
28.12.16
17:29
(25) Там если специально не подготовленный человек откроет любую ссылку и попробует разобраться ему скорую вызывать может понадобиться ))
29 Garykom
 
гуру
28.12.16
17:29
(26)(27) What is Ionic?
30 Serginio1
 
28.12.16
17:31
(29) Посмотри по ссылке. Это Angular 2 приложение для мобильников с доступом к хард части через Cordova
31 Garykom
 
гуру
28.12.16
17:31
(30) да понял https://habrahabr.ru/company/simpleweek/blog/254681/ очередной "модный фреймворк"
32 Serginio1
 
28.12.16
17:51
(31) Скорее это https://habrahabr.ru/post/316766/
33 Aleksandra_19
 
28.12.16
20:05
Всем спасибо! Все решилось заменой ЗапуститьПриложение() на КомандаСистемы(). Файл respons.txt сразу стал доступен.
Еще раз спасибо за советы и ссылки!
34 Garykom
 
гуру
28.12.16
20:56
(33) Если .net через (21)(22) то будет намного красивее без мигающих черных окон CMD/curl
35 trdm
 
28.12.16
22:29
(33) Правильно. ЗапуститьПриложение() не ждет окончания процесса, а КомандаСистемы() ждет.  в (9) был намек.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.