Имя: Пароль:
1C
 
Отправка файла методом POST в объекте WinHttpRequest из 1C
0 demart-omsk
 
10.06.16
11:49
Падает по 500 ошибке, где-то синтаксис походу напартачил. Подскажите, люди добрые, может кто, что увидит

WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");

Boundary = "Boundary"+СтрЗаменить(формат(ТекущаяДата(),"ДЛФ=T"),":","");
ФайлДанных = "file.xls";
РазделительСтрок = Символы.ПС;

СтрокаBase64 = Base64Строка(Новый ДвоичныеДанные("D:file.xls"));

Зп = "--" + Boundary + "
|Content-Disposition: form-data; name=""data""; filename=""" + ФайлДанных + """
|Content-Type: application/xml;" + РазделительСтрок + РазделительСтрок + "
|" + СтрокаBase64 + РазделительСтрок + "
|--" + Boundary + "--";

WinHttp.Open("POST", URL, 0);
WinHttp.SetRequestHeader("Content-Type","multipart/form-data;boundary=" + Boundary);
WinHttp.SetRequestHeader("Content-Length", СтрДлина(Зп));
WinHttp.setRequestHeader("Token", Токен);
WinHttp.Send(Зп);
Если WinHttp.Status = 200 Тогда
Сообщить(WinHttp.ResponseText);
КонецЕсли;
1 Serginio1
 
10.06.16
11:51
2 demart-omsk
 
10.06.16
14:15
(1) Спасибо, но этот метод тоже должен работать. Может кто поможет, предлагайте цену решения?
3 Fragster
 
гуру
10.06.16
14:26
(0) так 500 - это ошибка сервера. надо на нем лог смотреть, а том может у тебя экселька не в том формате, а загрузка нормально проходит.
4 Fragster
 
гуру
10.06.16
14:27
ну и почему не использовать HTTPСоединение - тоже не понятно
5 Дык ё
 
10.06.16
14:37
(2) Content-Type точно xml?
ну и, может, сервер бинарь ждёт, а не base64
6 demart-omsk
 
10.06.16
14:39
(3) лог сервера ничего не показывает (только "Ошибка сервера"), пробовал txt формат все тоже
7 demart-omsk
 
10.06.16
14:40
(5) бинарь тоже кидал, через дополнение Postman все супер работает
8 Дык ё
 
10.06.16
14:41
(7) я к тому, что content-type должен соответствовать содержимому
9 demart-omsk
 
10.06.16
14:41
(4) Через HTTPСоединение видел только передача Json строки, а ее передавать не надо
10 demart-omsk
 
10.06.16
14:42
(8) для текстового делал Content-Type: text/plain
11 Tro2001
 
10.06.16
14:57
//Рабочий вариант авторизации методом POST через HTTPСоединение. Думаю подкорректировать под отправку файла не составит труда

ТелоPOSTЗапроса = "";
    ТелоPOSTЗапроса = ТелоPOSTЗапроса + "&login=" + МойЛогин?;
    ТелоPOSTЗапроса = ТелоPOSTЗапроса + "&password=" + МойПароль;
    СерверПриемник = СокрЛП(Результат.Поставщик.ПоставщикAPI.Адрес); //имя сервера без протокола (http) и порта
    
    //Код запроса на сервере (типа Autorizate)
    АдресСтраницыНаСервере = КодЗапроса;
    
    ЗаголовкиHTTP = Новый Соответствие;
    ЗаголовкиHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded");
    
    Таймаут = 120;
    SSL =  ?(Результат.Поставщик.ПоставщикAPI.ssl, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено);
    НТТР = Новый HTTPСоединение(СерверПриемник, , , , , Таймаут, SSL);
    
    Попытка
        ЗапросHTTP = Новый HTTPЗапрос(АдресСтраницыНаСервере, ЗаголовкиHTTP);
        ЗапросHTTP.УстановитьТелоИзСтроки(ТелоPOSTЗапроса);
        ОтветHTTP = НТТР.ОтправитьДляОбработки(ЗапросHTTP);
    Исключение
        Результат.Ошибка=НСтр("ru = 'Неудачная попытка соединения с '")  + СерверПриемник + ": " + ОписаниеОшибки();
        Возврат;
    КонецПопытки;
    
    ЗаголовкиHTTP = Новый Соответствие;
    СтрокаОтветаСервера = "";
    Если ОтветHTTP.КодСостояния = 301 или ОтветHTTP.КодСостояния = 302 Тогда //
        //Если сервер вернул один из статусов переадресации
        //301 Moved Permanently («перемещено навсегда») или 302 Moved Temporarily («перемещено временно»)
        //В этом случае можно попытаться получить содержимое страницы, на которую переадресовал сервер
        ЗаголовкиОтвета = ОтветHTTP.Заголовки;
        Если ЗаголовкиОтвета.Количество() > 0 Тогда
            //Адрес страницы содержится в поле Location заголовка ответа
            АдресСтраницы = ЗаголовкиОтвета["Location"];
            Если Найти(АдресСтраницы, СерверПриемник + "/") = 0  Тогда
                АдресСтраницы = "http://"; + СерверПриемник + "/" + АдресСтраницы;
            КонецЕсли;
            Если ЗначениеЗаполнено(АдресСтраницы) Тогда
                //Если сервер вернул cookies
                //вставим их в заголовки для передачи на страницу перехода
                Куки = ОтветHTTP.Заголовки["Set-Cookie"];
                Если ЗначениеЗаполнено(Куки) Тогда
                    ЗаголовкиHTTP.Вставить("Cookie", Куки);
                КонецЕсли;
                СтрокаОтветаСервера = ПолучитьСодержимоеВебАдреса(АдресСтраницы, , , ЗаголовкиHTTP);
            КонецЕсли;
        КонецЕсли;
    Иначе
        СтрокаОтветаСервера = ОтветHTTP.ПолучитьТелоКакСтроку();
    КонецЕсли;
12 demart-omsk
 
10.06.16
15:12
(11) Нет спс, так не люблю делать, до конца довожу обычно. Установил фидлер - не перехватывает, помог знакомый советом - ieinspector, он перехватил - сравнил что в Postman, ято тут и ошибка ушла
13 demart-omsk
 
10.06.16
15:19
Ошибка в заголовке была, копи паст вообщем name=""ИМЯ"", код верный
14 Serginio1
 
10.06.16
15:55
(13) Поэтому и лучше использовать 1
15 trdm
 
10.06.16
15:58
(0) ДвоичныеДанные("D:file.xls"));
16 Pistol
 
10.06.16
16:08
(13) name и имя файла надо прикрывать какой-нибудь mime-кодировкой, хотя бы тем же base64, чтобы было типа:

=?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?=

Тогда и кириллица пролезет. См. https://tools.ietf.org/html/rfc2047
17 Pistol
 
10.06.16
16:10
(14) Стандарты соблюдать надо. А не использовать кучу прокладок, чтобы потом судорожно спрашивать "а что там происходит"
18 Serginio1
 
10.06.16
16:16
(17) Лучше пользоваться инструментов к котором уже заложены эти стандарты.

Это как при записи в XML пользоваться Записью текста.
19 Pistol
 
10.06.16
16:37
(18) см (2)
20 Serginio1
 
10.06.16
16:41
(19) А вот вариант простой. И где ошибиться практически невозможно

   HttpClient=Врап.ПолучитьТипИзСборки("System.Net.Http.HttpClient","System.Net.Http.dll");
    MultipartFormDataContent=Врап.ПолучитьТип("System.Net.Http.MultipartFormDataContent");

    
    Клиент = Врап.СоздатьОбъект(HttpClient);
    Контент = Врап.СоздатьОбъект(MultipartFormDataContent);
    Клиент.BaseAddress =Врап.СоздатьОбъект("System.Uri",uriSources);

     ПотокФайла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;
21 Pistol
 
10.06.16
16:45
(20) см (2)
22 trdm
 
10.06.16
16:48
(20) Хватит мусорить в ветку. Тебе ж уже сказали..
23 Serginio1
 
10.06.16
16:54
(22) То есть я приведя правильный код мусорю?
И как твоя реплика относится к теме?
(21) Народ на 1С пишет бинарные вычисление. Им тоже ничего не надо.
Эту ветку читают и другие люди несогласные с вашим мнением
24 oleg_km
 
10.06.16
16:58
(22)(21) Ну да, человек предложил самое прямое решение. Может это вам пойти с себестоимостью привычной поразбираться?
25 trdm
 
10.06.16
17:01
(23) Мусоришь. Рамки технологии заданы. У меня и самого с WinHttpRequest проблемки. Соро решать буду.
26 trdm
 
10.06.16
17:02
+(25) Этот дотнет еще бегать на машины ставить. Нафиг нужно.
27 oleg_km
 
10.06.16
17:05
(26) Прекрасно ставится групповыми политиками.

(25) заодно и может повод перейти на более современные технологии? Не будет проблем с установкой опций через NSScript
28 trdm
 
10.06.16
17:10
(27) Ну да куча заморочек вместо сел и сделал.

Это для ошпаренных нужны всегда новые технологии, ибо им скучно. А на штатных офисных машинах нужно соблюдать баланс между новизной и ресурсами.
Много пипла купилось на эти лозунги и им пришлось приплатиться.
Иногда приходится днями сидеть и выковыривать овно, которое роняет систему. Я не камикадзе.
29 trdm
 
10.06.16
17:12
+ по скольку я фикси, а не девочка на одну ночь, мне приходится думать над этими вопросами тщательнее и политику, приносящую меньше гемороя я уже выработал.
Подрастете, поймете.
30 Serginio1
 
10.06.16
17:17
(26) Он стоит уже на 95%. Кроме того можешь использовать только на сервере.
31 Fragster
 
гуру
10.06.16
17:22
(30) только на линупс сервере, да :)
а вот HTTPСоединение работает везде
32 Fragster
 
гуру
10.06.16
17:22
в отличии также и от (0)
33 trdm
 
10.06.16
17:24
(30) Это мифы. Не все тачки меняют раз 4-5 лет.
Не люблю я мелкософтовские технологии.
Чем меньше их на компах, тем спокойнее. Ну не считая неизбежного зла.
Так что не надо эту тошнотварь мне под нос совать.
34 oleg_km
 
10.06.16
17:27
(31) Ну да, с авторизацией клиентским сертификатом запусти? С Анонимной авторизацией через прокси, когда он начинает пихать NTLM авторизацию.

(33) Его уже по-умолчанию ставят в винде. Смешно будет, когда очередной релиз 1С будет требовать наличия .НЕТ и не ниже скажем 4.6
35 trdm
 
10.06.16
17:33
Блин, что за глупые юзеры пошли.
Говорю в контре машины пашут пока не сдохнут. Память, харды докупаются, но практически везде не на серваках хрюшки стоят.

1С никогда не будет опираться на дотнет. Они свой фрайм долго разрабатывали и он сейчас уже стабилен.
36 MM
 
10.06.16
17:34
(35) требование к наличию жабы для некоторых компонент появилось.
37 oleg_km
 
10.06.16
17:36
(36) Ха-ха, подписка VS2010 кончится и перейдут на .НЕТ.
38 Pistol
 
10.06.16
17:36
(34) Ты это, выбирайся из башни из слоновой кости. Мир уже давно изменился.

ЗащищенноеСоединениеOpenSSL (OpenSSLSecureConnection)
Свойства:

СертификатКлиента (ClientCertificate)
СертификатыУдостоверяющихЦентров (CertificationAuthorityCertificates)

Конструкторы:
По объектам используемых сертификатов

Описание:
Объект защищенного соединения OpenSSL.

Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).

----------------
ИнтернетПрокси.Установить (InternetProxy.Set)
ИнтернетПрокси (InternetProxy)
Установить (Set)

Синтаксис:
Установить(<Протокол>, <Сервер>, <Порт>, <Пользователь>, <Пароль>, <ИспользоватьАутентификациюОС>)

Параметры:
<Протокол> (обязательный)
Тип: Строка.
Протокол, для которого устанавливаются параметры прокси-сервера.

<Сервер> (обязательный)
Тип: Строка.
Имя сервера.

<Порт> (необязательный)
Тип: Число; Неопределено.
Порт прокси-сервера. Если в качестве протокола указано Неопределено, то все обращения к прокси-серверу для каждого протокола будут идти через порт по умолчанию для этого протокола.
Значение по умолчанию: Порт по умолчанию для указанного протокола.

<Пользователь> (необязательный)
Тип: Строка.
Имя пользователя для авторизации на прокси-сервере.

<Пароль> (необязательный)
Тип: Строка.
Пароль для авторизации на прокси-сервере.

<ИспользоватьАутентификациюОС> (необязательный)
Тип: Булево.
Включает использование NTLM-аутентификации на прокси.
Значение по умолчанию: Истина.

Описание:
Устанавливает параметры прокси-серверов для различных протоколов.

Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
39 oleg_km
 
10.06.16
17:43
(38) Да мне незачем, я уже давно отладил свой код на .НЕТ и судорожно отслеживать что там наконец-то 1С доработало, что в полноценных системах уже давно есть нет никакого желания. Я уже раз хорошо обжегся на ИнтернетПочта, когда оно работало на одном релизе, а на следующем сломалось и обещало починиться только в еще следующем, через несколько месяцев. Ешьте свой кактус сами.
40 Serginio1
 
10.06.16
17:45
(31) Скоро доделаю JOB: Неспешно ищу работу. 1С + .Net
И будет на линуксе
41 Serginio1
 
10.06.16
17:46
(35) У тебя и сервер дохлый?
42 Pistol
 
10.06.16
17:46
(39) Да мне незачем, я уже давно отладил свой код в 1С и судорожно отслеживать что там в ваших новомодных системах нет никакого желания.
43 Pistol
 
10.06.16
17:47
(40) В смысле работу найдешь?
44 oleg_km
 
10.06.16
17:49
(42) Давно ты не мог отладить, потому что давно авторизация клиентским сертификатом не работала и анонимному прокси 1С гадил попытками NTLM авторизации. Поэтому скажи привычную для 1Сника фразу: Я с таким не сталкивался, поэтому ВАМ это нафик не нужно.
45 Serginio1
 
10.06.16
17:50
(42) Тебя кто то заставляет?
(43) В смысле код почитай, который работает на CoreCLR который работает под и под линуксом. Работа у меня есть.
46 trdm
 
10.06.16
17:53
(42) +1
Они горазды ломать совместимость. Опасные ребята.
47 Serginio1
 
10.06.16
17:56
(46) Кто? 1С постоянно, что то ломает
48 Pistol
 
10.06.16
18:09
(44) Это работает начиная с 8.3.1.531, выпущенной 03.07.2012. Ты из комфортабельной могилки-то своей вылезай, 4 года прошло уже.
49 Serginio1
 
10.06.16
19:05
(35) На самом деле прикрутить CoreClr не проблема. Там немного телодвижений. И включить в дистрибутив CoreClr тоже непроблема. Зато все будут пользоваться однозначно.
Их фрайм отстает от реальности года на 2 как минимум. Json совсем недавно прикрутили. Нет поддержки ws протоколов до сих пор итд итд.
Про асинхронность вообще промолчу.

И зачем развивать свой фрайм если CoreClr развивает более крупная фирма с огромным комьюнити, где можно легко найти ответы на любые вопросы.
Кроме того это огромный плюс при продвижении на запад.

Но у 1С своя позиция и больше они смотрят на Java которую аналогично так же можно прикрутить.
50 mehfk
 
10.06.16
19:09
(49) 1С делает продукт, а ты дальше откровенного спама в ветках форума не продвинулся.
51 Serginio1
 
10.06.16
19:12
(50) Я выкладываю продукт который реально работает.
В 20 реальный пример.
Почему реальный пример это спам?
52 mehfk
 
10.06.16
19:14
"Когда я вижу птицу, которая ходит как утка, плавает как утка и крякает как утка, я называю эту птицу уткой." (С)
53 Serginio1
 
10.06.16
19:25
(52) Ты про утиную типизацию?
Так, что за спам ты увидел в 20?
54 Pistol
 
10.06.16
19:40
(53) Профессиональная деформация, чо :)
55 Serginio1
 
10.06.16
19:52
(64) Это как? Где и что деформировалось?
Мне честно хочется понять. Даю рабочий код, но меня называют спамером. При этом во всей этой ветке, я один дал реальное решение. Зато все остальные конструктивные критики?
56 Pistol
 
10.06.16
20:54
(55)
>При этом во всей этой ветке, я один дал реальное решение

"Определённо, тщеславие - мой самый любимый из грехов..." (C)
57 Serginio1
 
10.06.16
21:09
(56) То есть мое решение нереальное?
Ах да. Было еще в 11.
58 Pistol
 
10.06.16
21:11
(57) И тебе хороших выходных. С праздником, кстати.
59 minele
 
10.06.16
21:19
Может  попробуй посчитать ковычки, их количество должно быть четным,  если посмотреть строку Зп = "--" + Boundary + "
60 Serginio1
 
10.06.16
21:33
(58) Спасибо. И тебе не хворать!
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший