Имя: Пароль:
1C
1С v8
Передача параметров POST с использованием Content-Type: application/x-www-form-u
,
0 Джинн
 
10.12.13
18:02
Есть кто с опытом в этой области? В частности как сформировать правильно файл отправки для Соединение.ОтправитьДляОбработки(имяФайлаОтправки,....)?
1 acsent
 
10.12.13
18:04
а в чем проблема?
2 Джинн
 
10.12.13
18:10
(1) Проблема в моем полнейшей непонимании этого :) Все мы рано или поздно что-то делаем в первый раз :)

Делаю примерно так:
ЗаписьТекста = Новый ЗаписьТекста(имяФайлаОтправки);
ЗаписьТекста.Записать("bookkeeperName=Иванов Иван Иванович");
ЗаписьТекста.Закрыть();

имяВыходногоФайла = ПолучитьимяВременногоФайла("xml");

ФайлОтправки = Новый Файл(имяФайлаОтправки);
РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());

Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", " application/x-www-form-urlencoded");
Заголовки.Вставить("Content-Length", РазмерФайлаОтправки);
    
Соединение.ОтправитьДляОбработки(имяФайлаОтправки, "типа метод", имяВыходногоФайла, Заголовки);

Хрень какая-то получается :(
3 Джинн
 
10.12.13
18:12
Если нужно мордой по батарее повозить - не стесняйтесь. Никогда эту хрень раньше не делал.
4 acsent
 
10.12.13
18:15
UTF? убери bom
5 Bober
 
10.12.13
18:20
как вариант:
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", " application/x-www-form-urlencoded");

Соединение.ОтправитьДляОбработки(имяФайлаОтправки, "типа метод" + "bookkeeperName=Иванов Иван Иванович", имяВыходногоФайла, Заголовки);
6 Джинн
 
10.12.13
18:21
(4) UTF. Но тут что-то принципиально не так в коде. В http-запросе после переноса строки в заголовке какой-то бинарный мусор, а потом параметры. Причем не экранированные. Что-то я делаю не так :(
7 Джинн
 
10.12.13
18:22
(5) Как-то не кошерно выглядит. Должно же быть красивое и правильное решение.
8 Jaap Vduul
 
10.12.13
18:23
(6)
Используй ascii кодировку, и urlencode надо самому делать.
9 Bober
 
10.12.13
18:23
(7) в смысле? если это тот параметр  о котором ты говоришь, то он передается таким образом.
10 Джинн
 
10.12.13
18:26
(9) Т.е. файл отдельно, параметры отдельно, к методу приклеенные? Вы подробнее объясняйте, для особо тупых и военных. Я в этом вопросе ноль.
11 Bober
 
10.12.13
18:27
(10) какой файл, можно подробнее описать или скинуть АПИ сервиса
12 Джинн
 
10.12.13
18:31
Описание как есть (только адрес и имя методов убрал):

Запросы на изменение данных отправляются http-методом POST по url-адресу. Данные передаются в теле документа, то есть post-параметрами.

Ну и табличка:
Параметр/тип/комментарий
bookkeeperName/string/Контактное лицо бухгалтерии
13 Джинн
 
10.12.13
18:33
Должно на сервер придти
POST Имя_Метода HTTP/1.1
Host: ххх.ххх.ххх.ххх
<всякие заголовки по одному на строку>
<перенос строки>
<тело документа>
14 Jaap Vduul
 
10.12.13
18:34
15 oleg_km
 
10.12.13
18:57
(2) Заголовки.Вставить("Content-Length", РазмерФайлаОтправки); - это не надо, 1С сам подсчитает

ЗаписьТекста по-умолчанию пишет в UTF, поэтому действительно нужно убирать BOM.

>> Хрень какая-то получается :(
А как конкретно выглядит эта хрень?
16 oleg_km
 
10.12.13
19:00
Еще, веб-сервер в какой кодировке ждет запрос. МОжет он действительно ждет в ANSI, а ты ему в UTF. В ЗаписьТекста попробуй добивь КОдировкаТекста.ANSI
17 Джинн
 
10.12.13
19:02
Тело запроса все равно не эскейпированно :(
Должно быть примерно bookkeeperName=%D0%98%D0%B3%D0%BE%D1%80%D1%8C.
18 acsent
 
10.12.13
19:05
в функция отправитьдляобработки можно передавать хттп запрос, а его устанавливать по строке
19 oleg_km
 
10.12.13
19:06
(18) А, ну та это ручками нужно делать. Или base64 закодировать. 1С сама только параметры, передаваемы в URL преобразует
20 acsent
 
10.12.13
19:07
%D0%98%D0%B3%D0%BE%D1%80%D1%8C - вот это 1с не умеет сама
21 oleg_km
 
10.12.13
19:08
я какое-то время пользовался CHILKAT. Сейчас пользуюсь .NET
22 Джинн
 
10.12.13
19:22
Вы меня пугаете. Действительно параметры в теле документа не передать никак?

А через Content-Disposition: form-data; bookkeeper="Иванов Иван Иванович"? Если со стороны сервера поймают это? Или тоже геморрой?
23 kiruha
 
10.12.13
19:28
А через
HTTP = Новый COMОбъект("MSXML2.XMLHTTP");
?
24 sttt
 
10.12.13
19:30
25 oleg_km
 
10.12.13
20:47
Мне кажется, в любом случае, все что передается через POST в 1С ты сам должен испечь. 1С ведь не знает, что в файле, вдруг там бинарные данные
26 Джинн
 
10.12.13
22:24
(24) Спасибо. Завтра покурю.
(25) php перехватывает и распаковывает док в строку параметров сам. Только в данном случае спереди какой-то мусор добавляется, а сами параметры не эскейпированы :(
27 oleg_km
 
10.12.13
22:37
(26) Мусор это похоже BOM. Попробуй все-таки айл сохранить в ANSI, может прокатит
28 Поpyчик-4
 
10.12.13
23:31
29 Джинн
 
10.12.13
23:35
(27) Уже пробовал :(
30 Джинн
 
10.12.13
23:36
(28) С этого я начал. Но там Content-Type другой.
31 oleg_km
 
11.12.13
09:29
(29) Ну тогда, если есть доступ переделать сервер, пусть он принимает или base64 или в GET, строку запроса в GET 1С вроде само обрабатывает. А если нет доступа или не хочется менять сервер то только использовать HTMLEncode. Я раньше пользовал CHILKAT, сейчас пользую .NET
32 Джинн
 
11.12.13
11:38
(31) А примерчик можно на .NET? Если не затруднит.
33 oleg_km
 
11.12.13
11:46
(31) На .NET будет посложнее. Вернее на самом нете ничего сложного нет, вот искомая функция:

Возврат ПолучитьТип"System.Web.HttpUtility", "System.Web").UrlEncode(исхСтрока, ПолучитьКодировку(текКодировка));

Но весь вопрос, как сделать .НЕТ доступным в 1С. Я пользуюсь компонентой из v8: v8: Использование сборок .NET в 1С 7.x и 8.x, можно использовать разработку Elisy, можно просто написать свой COM на C#, в который завернуть эту функцию. Но в любом случае на всех клиентах понадобится ДОТ.НЕТ.

Если .НЕТ у вас не используется, мой вам совет: используйте CHILKAT. Там компонент String бесплатный, достаточно надежный, я его использовал больше года, пока не перешел на .НЕТ
34 acsent
 
11.12.13
11:46
(30) поставь фидлер и посмотри что браузер отправляет
35 Jaap Vduul
 
11.12.13
12:22
36 oleg_km
 
11.12.13
12:43
(35) Ну в принципе можно и MD5 на 1С написать. Я уже пытался на 1С написать шаблон, проверяющий адрес электронного письма. Уже было 10 версий, то одно не учел, то что-то еще забыл. Короче изобретение велосипеда
37 Леха Дум
 
11.12.13
13:46
(0) кинь мыло или аську или скайп - кину примером на 1ц
38 Джинн
 
11.12.13
14:26
На мыло в личке написал
39 Леха Дум
 
11.12.13
14:42
(38) ответил
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.