Имя: Пароль:
1C
1С v8
SOAP-запрос по методу POST
0 Night_Wolf
 
10.07.14
15:16
Пытаюсь отправить SOAP-запрос, код процедуры такой:

ssl = Новый ЗащищенноеСоединениеOpenSSL;
НТТР = Новый HTTPСоединение("mcommunicator.ru",,,,,5,ssl);
ФайлЗапроса = ПолучитьИмяВременногоФайла();

НомерАбонента = "7923190хххх";
ТекстСообщения = "Проверка отправки SOAP из 1С прошла успешно!";
        
ТекстSOAP =
"
|POST /M2M/m2m_api.asmx HTTP/1.1
|Host: mcommunicator.ru
|Content-Type: text/xml; charset=utf-8
|Content-Length: length
|SOAPAction: ""http://mcommunicator.ru/M2M/SendMessage"";
|
|<?xml version=""1.0"" encoding=""utf-8""?>
|<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""; xmlns:xsd=""http://www.w3.org/2001/XMLSchema""; xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">;
|<soap:Body>
|    <SendMessage xmlns=""http://mcommunicator.ru/M2M"">;
|        <msid>"+НомерАбонента+"</msid>
|        <message>"+ТекстСообщения+"</message>
|        <naming></naming>
|        <login>"+Логин+"</login>
|        <password>"+Пароль+"</password>
|    </SendMessage>
|</soap:Body>
|</soap:Envelope>";

ТекстSOAP = СокрЛП(ТекстSOAP);
    
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст(ТекстSOAP);
ТекстовыйФайл.Записать(ФайлЗапроса,КодировкаТекста.ANSI);
    
ФайлРезультата = ПолучитьИмяВременногоФайла();
    
ЗаголовокНТТР = Новый Соответствие();
ФайлОтправки = Новый Файл(ФайлЗапроса);
РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
//ЗаголовокНТТР.Вставить("POST","/M2M/m2m_api.asmx HTTP/1.1");
//ЗаголовокНТТР.Вставить("HOST","mcomunicator.ru");
ЗаголовокНТТР.Вставить("Content-Type","text/xml; charset=utf-8");
ЗаголовокНТТР.Вставить("Content-Lenght",РазмерФайлаОтправки);
НТТР.ОтправитьДляОбработки(ФайлЗапроса,"M2M/m2m_api.asmx?op=SendMessage",ФайлРезультата,ЗаголовокНТТР);
    
// Получаем ответ в виде строки
ТекстовыйФайлОтвет = Новый ТекстовыйДокумент;
ТекстовыйФайлОтвет.Прочитать(ФайлРезультата,КодировкаТекста.UTF8);
СтрокаРезультат = ТекстовыйФайлОтвет.ПолучитьТекст();

Сам формат XML-Файла, который должен быть отправлен такой:
POST /M2M/m2m_api.asmx HTTP/1.1
Host: mcommunicator.ru
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://mcommunicator.ru/M2M/SendMessage";

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">;
  <soap:Body>
    <SendMessage xmlns="http://mcommunicator.ru/M2M">;
      <msid>string</msid>
      <message>string</message>
      <naming>string</naming>
      <login>string</login>
      <password>string</password>
    </SendMessage>
  </soap:Body>
</soap:Envelope>

Непонятны 2 вопроса:
1. Как записать length в файл, если я не знаю размер файла, пока не запишу его на диск
2. При отправке файла выдает ошибку:
{Форма.Форма.Форма(46)}: Ошибка при вызове метода контекста (ОтправитьДляОбработки)
    НТТР.ОтправитьДляОбработки(ФайлЗапроса,"M2M/m2m_api.asmx?op=SendMessage",ФайлРезультата,ЗаголовокНТТР);
по причине:
Ошибка при выполнении файловой операции  'M2M/m2m_api.asmx?op=SendMessage'
по причине:
Ошибка работы с Интернет:  внутренняя ошибка сервера (500). <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><soap:Fault><soap:Code><soap:Value>soap:Receiver</soap:Value></soap:Code><soap:Reason><soap:Text xml:lang="en">Server was unable to process request. ---&gt; Data at the root level is invalid. Line 1, position 1.</soap:Text></soap:Reason><soap:Detail /></soap:Fault></soap:Body></soap:Envelope>
по причине:
Ошибка работы с Интернет:  внутренняя ошибка сервера (500)

То есть как я понимаю - процедура запускается, но видит ошибку в строке 1, позиции 1. Но как там может быть ошибка? Подскажите кто знает, что я не так делаю?
1 Fragster
 
гуру
10.07.14
15:18
а что, стандартный механизм вебсервисов не устраивает?
2 Night_Wolf
 
10.07.14
15:19
А веб-сервис же не мой. Он МТС-овский. Я просто пытаюсь по нему сделать рассылку смс-сообщений нашим клиентам.
3 Fragster
 
гуру
10.07.14
15:20
(2) я понимаю. но что, стандартный механизм 1с не работает? не публикации, а вызова вебсервисов.
4 Night_Wolf
 
10.07.14
15:22
(3) - А можно подробнее - что за стандартный механизм? Я просто писал веб-сервисы в 1с в конфигурации, пакетыXDTO и сами процедуры, но сторонние никогда не вызывал. Или ссылку куда почитать.
5 ale-sarin
 
10.07.14
15:22
(0) Я для сообщений с МТС из БСП все взял. И никакой хреноты не писал.
6 ale-sarin
 
10.07.14
15:22
(4) В БСП.
7 Night_Wolf
 
10.07.14
15:25
(4)Возможно сейчас тупость спрошу, но БСП - это что такое?
8 Fragster
 
гуру
10.07.14
15:25
простейший вариант какой-то такой:

    СсылкаНаОпределение = "тутассылканаwsdl";
    Определение = Новый WSОпределения(СсылкаНаОпределение);
    
    Сервис = Определение.Сервисы[0];
    ТочкаПодключения = Сервис.ТочкиПодключения[0];
    Прокси = Новый WSПрокси(Определение, Сервис.URIПространстваИмен, Сервис.Имя, ТочкаПодключения.Имя);
    
    Фабрика = Определение.ФабрикаXDTO;
    
    Результат = Прокси.Функция(СН);

фабрика нужна чтобы параметры непримитивных типов отправлять.
9 Fragster
 
гуру
10.07.14
15:26
(7) библиотека стандартных подсистем
10 ale-sarin
 
10.07.14
15:27
11 Night_Wolf
 
10.07.14
15:27
(6)(9) Ясно, но мне не поможет. У меня нестандартная конфигурация.
12 ale-sarin
 
10.07.14
15:28
(11) Блин, не дурите.
Посмотрите, как там сделано. Куски кода возьмите.
13 Night_Wolf
 
10.07.14
15:28
Разобрался! Вот эти 5 строк в файле первые не нужны были:
POST /M2M/m2m_api.asmx HTTP/1.1
Host: mcommunicator.ru
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://mcommunicator.ru/M2M/SendMessage""; target="_blank" rel="nofollow" class="extralink">http://mcommunicator.ru/M2M/SendMessage";;

Теперь пишет ошибку, но уже что пароль некорректный. Это буду завтра решать. Спасибо всем!
14 Fragster
 
гуру
10.07.14
15:31
(13) не мучайся ты, попробуй сначала (8)

У тебя будет что-то типа

Результат = Прокси.SendMessage(ид, сообщений, нейминг, логин, пароль)
15 Бешенный
 
10.07.14
15:34
(14) Не мешай человеку. Пусть через некоторое время он сделает для себя открытие ))
16 Infsams654
 
10.07.14
16:08
(0) а зачем вообще файлом, если сейчас уже есть HTTPЗапрос
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший