|
Отправка файла методом 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
|
Используй атеистический
.Net в 1С. Парсинг сайтов, multipart/form-data, gzip итд |
|||
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) Спасибо. И тебе не хворать!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |