Имя: Пароль:
1C
1С v8
Отправка XML запроса методом POST
,
0 Kondarat
 
20.09.13
11:06
Есть некий ресурс к которому надо обратиться для получения и формирования данных из 1С. Перед работой необходимо пройти авторизацию. Из описания присланного тех. поддержкой: для авторизации необходимо отправить POSTом XML запрос такой структуры:

<?xml version="1.0" encoding="utf-8"?>
<Request method="Authorize">
    <login>МойЛогин</login>
    <password>МойПароль</password>
</Request>

И получить в ответном сообщении ID сессии, необходимой для дальнейшей работы.

На любые попытки отправить такой запрос получаю ответ:
<?xml version="1.0" encoding="utf-8"?><response><error num="2">Не определен аттрибут "method"</error></response>

Здесь код отправки:

    Логин = "МойЛогин";
    Пароль = "МойПароль";
    
    
    ИмяФайлаЗапроса = "d:\Testxml.xml";
    
    ОбъектЗапись = Новый ЗаписьXML;
    ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("utf-8", ,Истина,Истина);
    ОбъектЗапись.ОткрытьФайл(ИмяФайлаЗапроса, ПараметрыЗаписиXML);
    ОбъектЗапись.ЗаписатьОбъявлениеXML();
    
    // выводим корневой элемент Request
    ОбъектЗапись.ЗаписатьНачалоЭлемента("Request");
    
    ОбъектЗапись.ЗаписатьАтрибут("method", "Authorize");

    // выводим элемент Логин
    ОбъектЗапись.ЗаписатьНачалоЭлемента("login");
    ОбъектЗапись.ЗаписатьТекст(Логин);
    ОбъектЗапись.ЗаписатьКонецЭлемента();
    
    // выводим элемент пароль
    ОбъектЗапись.ЗаписатьНачалоЭлемента("password");
    ОбъектЗапись.ЗаписатьТекст(Пароль);
    ОбъектЗапись.ЗаписатьКонецЭлемента();
    
    // записываем конец для корневого элемента
    ОбъектЗапись.ЗаписатьКонецЭлемента();
    ОбъектЗапись.Закрыть();
        
    HTTPСоединение = новый HTTPСоединение("ххххх-ххх.ххх.ru", 80);
    
    ФайлЗапроса = "d:\Request.xml";
    ФайлОтвета  = "d:\Response.xml";
    
    Заголовки = новый Соответствие;
    Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=JUSTSOMESCRAPSTRING");
    
    ФайлОтправки = новый ЗаписьТекста;
    ФайлОтправки.Открыть(ФайлЗапроса, КодировкаТекста.ANSI);
    
    ФайлОтправки.ЗаписатьСтроку("--JUSTSOMESCRAPSTRING");
    ФайлОтправки.ЗаписатьСтроку("Content-Disposition: form-data; name=""xml""; xml=""" + ИмяФайлаЗапроса + """");
    ФайлОтправки.ЗаписатьСтроку("Content-Type: text/plain" + Символы.ВК + Символы.ПС);
    ФайлОтправки.ЗаписатьСтроку(ОбъектЗапись);
    ФайлОтправки.ЗаписатьСтроку("--JUSTSOMESCRAPSTRING");
    
    
    ФайлОтправки.Закрыть();
    
    // Отправим запрос на сервер, и получим ответ
    Попытка
        
        HTTPСоединение.ОтправитьДляОбработки(ФайлЗапроса, "/api/yyyyyyyy", ФайлОтвета, Заголовки);
    
        Файл = новый ЧтениеТекста();
        Файл.Открыть(ФайлОтвета, КодировкаТекста.UTF8);
        Ответ = Файл.Прочитать();

        Сообщить("Ответ = " + Ответ);
        
        Файл.Закрыть();
        
        
    Исключение
        Ответ = ОписаниеОшибки();
    КонецПопытки;

Если кто-то сталкивался с подобной проблемой, можете помочь?
1 Asmody
 
20.09.13
11:15
Атрибут method — это в твоем запросе в тэге Request.
Может с API что-то не то?
2 Ёпрст
 
20.09.13
11:16
а че, нормально
3 Kondarat
 
20.09.13
11:18
(1) Это мне понятно (про автрибут). Служба поддержки твердит только, что какой-то символ не в UTF-8
4 Kondarat
 
20.09.13
11:18
(2) А нормально что?
5 viktor_vv
 
20.09.13
11:20
А кирилицы в логине, пароле нету случайно?
6 Asmody
 
20.09.13
11:21
А почему у тебя кодировкатекста.ansi?
7 Kondarat
 
20.09.13
11:24
(5) Нет. Перебрал все руктями в латинице.
8 Ёпрст
 
20.09.13
11:25
я как-то забил на HTTPСоединение , переписал всё на
WinHttp в своё время.
9 Kondarat
 
20.09.13
11:26
(6) А в какой надо?
10 Kondarat
 
20.09.13
11:28
(9) От безисходности... Переписал все на VbScript - ошибка один в один.
11 Ёпрст
 
20.09.13
11:29
И это, я не помню ужо, но разве в

HTTPСоединение.ОтправитьДляОбработки(
первым параметром не должен быть у тебя ИмяФайлаЗапроса ?
12 Ёпрст
 
20.09.13
11:29
ты же именно этот xml туда слать должен.
13 Asmody
 
20.09.13
11:31
(9) UTF8 какбэ. Да и вообще, внимательно перечитай описание параметров ОтправитьДляОбработки
14 Ёпрст
 
20.09.13
11:31
на вот, пособие с примерами
http://help1c.com/faq/view/1298.html
15 Kondarat
 
20.09.13
11:32
(13) Вот и ответ на UTF-8
Ответ = <?xml version="1.0" encoding="utf-8"?><response><error num="1">Не удалось получить XML методом POST</error></response>
16 George Wheels
 
20.09.13
11:33
СП
ОтправитьДляОбработки(<Источник>...

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

А тип переменной ФайлЗапроса какой;)
17 viktor_vv
 
20.09.13
11:44
А что у тебя в файле отправки получается ? Посомтри просмотрщиком.

Я не уверен, но смущает

ОбъектЗапись.Закрыть();

а потом

ФайлОтправки.ЗаписатьСтроку(ОбъектЗапись);

судя по

ОбъектЗапись.Закрыть()

Завершает запись текста XML. Если производилась запись в файл, то файл закрывается. Если производилась запись в строку, то результирующая строка будет получена в качестве возвращаемого значения метода. Если производилась запись в файл, то метод вернет пустую строку.
18 viktor_vv
 
20.09.13
11:45
(17)+ У тебя, похоже, в файл отправки нихрена не попадает твой XML.
19 viktor_vv
 
20.09.13
11:55
Ну и

ЗаписатьСтроку(<Строка>, <Разделитель>)

первый параметр , тип строка, а тут ты туда объект пытаешься писать

ФайлОтправки.ЗаписатьСтроку(ОбъектЗапись);
20 viktor_vv
 
20.09.13
12:01
Попробуй без файла создать XML

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("utf-8");
// Запись документа XML
...
СтрXML = ЗаписьXML.Закрыть();

ФайлОтправки.ЗаписатьСтроку(СтрXML);
21 Serginio1
 
20.09.13
12:46
22 Asmody
 
20.09.13
12:54
(21) это к чему тут вообще?
23 Serginio1
 
20.09.13
13:47
(22) смотри 2 сообщение
24 Serginio1
 
20.09.13
13:53
23 + Я так понимаю нужно только изменить
  xmlHttp.setRequestHeader ("Content-type", "application/xhtml+xml; charset=""utf-8""");
25 Kondarat
 
20.09.13
17:25
Всем спасибо. В (20) правильный совет.
26 oleg_km
 
20.09.13
20:25
(25) А наверное в файле была сигнатура EF
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс