Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Отправка xml в УТМ при помощи MSXML2.ServerXMLHTTP

v7: Отправка xml в УТМ при помощи MSXML2.ServerXMLHTTP
Я
   Pedroshitel
 
19.10.16 - 17:29
Собственно целью является отправка xml на сервер УТМ ЕГАИС. На примере запроса номенклатуры по коду ЕГАИС. Использую для этого MSXML2.ServerXMLHTTP, а для формирования файла Msxml2.DOMDocument

Сам код:
    Попытка

        HTTPxml = CreateObject("MSXML2.ServerXMLHTTP."+"6"+".0");    
    Исключение  
        Сообщить(ОписаниеОшибки(),"!");
        Возврат;
    КонецПопытки;
    
    Попытка
        Http = CreateObject("Msxml2.DOMDocument");    
    Исключение  
        Сообщить(ОписаниеОшибки(),"!");
        Возврат;
    КонецПопытки;
    
    Http.appendChild(Http.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'"));
    Documents         = Http.appendChild(Http.createElement("ns:Documents"));
    Documents.setAttribute("Version","1.0");
    Documents.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance";);
    Documents.setAttribute("xmlns:ns","http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01";);
    Documents.setAttribute("xmlns:qp","http://fsrar.ru/WEGAIS/QueryParameters";);
    Owner             = Documents.appendChild(Http.createElement("ns:Owner"));
    FSRAR_ID         = Owner.appendChild(Http.createElement("ns:FSRAR_ID"));  
    FSRAR_ID.text     = "НАШ_ИД";
    Document         = Documents.appendChild(Http.createElement("ns:Document"));  
    QueryAP         = Document.appendChild(Http.createElement("ns:QueryAP"));  
    Parameters         = QueryAP.appendChild(Http.createElement("qp:Parameters"));
    Parameter         = Parameters.appendChild(Http.createElement("qp:Parameter"));  
    Name             = Parameter.appendChild(Http.createElement("qp:Name"));  
    Name.text         = "КОД";
    Value             = Parameter.appendChild(Http.createElement("qp:Value"));  
    Value.text         = "0150117000002012280";
        
    Http.Save("F:\"+"post.txt");
    ИмяФайлаОтправки = "F:\"+"post.txt";
    
    Boundary = "934726d4c90f47449f0423353e74f586";
    ТекстОбраб.ВставитьСтроку(1,"--"+Boundary);
    ТекстОбраб.ВставитьСтроку(2,"Content-Disposition: form-data; name=""xml_file""; filename=""" + "file.xml" + """");
    ТекстОбраб.ВставитьСтроку(3,"Content-Type: text/xml; charset=utf-8");
    ТекстОбраб.ВставитьСтроку(4,"");
        
    КолТекстСтрок = ТекстОбраб.КоличествоСтрок();
    ПоследняяСтрока = ТекстОбраб.ПолучитьСтроку(КолТекстСтрок-1);
    ТекстОбраб.ЗаменитьСтроку(КолТекстСтрок-1,ПоследняяСтрока+"--"+Boundary+"--");
    
    ТекстОбраб.Записать(ИмяФайлаОтправки);
    
    HTTPxml.Open("POST", "http://"+"нашУТМ"+"/opt/in/QueryAP";, -1); //асинхронный запрос
    
    ФС.АтрибутыФайла(ИмяФайлаОтправки,РазмерФайла);
    HTTPxml.SetRequestHeader("Content-Type","multipart/form-data; boundary="+СокрЛП(Boundary));
    HTTPxml.SetRequestHeader("Content-Charset","utf-8");
    HTTPxml.SetRequestHeader("Content-Length", СокрЛП(РазмерФайла));
    HTTPxml.Send(ИмяФайлаОтправки);
    
    Состояние("Ожидание ответа на запрос...");
    ВремяОжидания = 0;
    Пока HTTPxml.ReadyState <> 4 Цикл
        Состояние("Ожидание ответа на запрос... "+Строка(ВремяОжидания)+"s");
    КонецЦикла;          
    Состояние("");
    
    Response = HTTPxml.ResponseXML;
    Если ПустоеЗначение(Response.XML) = 1 Тогда
        //XML в ответе нет, есть только текст
        Response = HTTPxml.ResponseText;
    Иначе //объект типа MSXML2.DOMDocument.<MSXMLver>.0    
        Если ФС.СуществуетФайл(КаталогВременныхФайлов()+"logEGAIS") = 0 Тогда
            ФС.СоздатьКаталог(КаталогВременныхФайлов()+"logEGAIS");
        КонецЕсли;    
        Response.Save(КаталогВременныхФайлов()+"logEGAIS\"+"\"+ПреобразоватьURLвФайл("http://"+"10.189.7.1:8080"+"/opt/in/QueryAP";));
    КонецЕсли;
    
    Response = HTTPxml.ResponseText;
    Сообщить(Response);
 
 
   Pedroshitel
 
1 - 19.10.16 - 17:31
Файл, который формируется, нормальный, проверено на аналогичном коде в 8.2 . Судя по ответу от сервера сама проблема в заголовках.
Собственно сам ответ:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 500 Server Error</title>
</head>
<body><h2>HTTP ERROR 500</h2>
<p>Problem accessing /opt/in/QueryAP. Reason:
<pre>    Server Error</pre></p><h3>Caused by:</h3><pre>java.lang.RuntimeException: java.io.IOException: Missing initial multi part boundary
    at org.eclipse.jetty.server.Request.extractMultipartParameters(Request.java:500)
    at org.eclipse.jetty.server.Request.extractContentParameters(Request.java:417)
    at org.eclipse.jetty.server.Request.extractParameters(Request.java:363)
    at org.eclipse.jetty.server.Request.getParameterMap(Request.java:1003)
    at es.programador.http.ClientDocumentServlet.doPost(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at es.programador.http.ClientDocumentServlet.service(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:821)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1158)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1090)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)
    at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:56)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
    at org.eclipse.jetty.server.Server.handle(Server.java:517)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:306)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: Missing initial multi part boundary
    at org.eclipse.jetty.util.MultiPartInputStreamParser.parse(MultiPartInputStreamParser.java:511)
    at org.eclipse.jetty.util.MultiPartInputStreamParser.getParts(MultiPartInputStreamParser.java:405)
    at org.eclipse.jetty.server.Request.getParts(Request.java:2311)
    at org.eclipse.jetty.server.Request.extractMultipartParameters(Request.java:495)
    ... 31 more
</pre>
<h3>Caused by:</h3><pre>java.io.IOException: Missing initial multi part boundary
    at org.eclipse.jetty.util.MultiPartInputStreamParser.parse(MultiPartInputStreamParser.java:511)
    at org.eclipse.jetty.util.MultiPartInputStreamParser.getParts(MultiPartInputStreamParser.java:405)
    at org.eclipse.jetty.server.Request.getParts(Request.java:2311)
    at org.eclipse.jetty.server.Request.extractMultipartParameters(Request.java:495)
    at org.eclipse.jetty.server.Request.extractContentParameters(Request.java:417)
    at org.eclipse.jetty.server.Request.extractParameters(Request.java:363)
    at org.eclipse.jetty.server.Request.getParameterMap(Request.java:1003)
    at es.programador.http.ClientDocumentServlet.doPost(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at es.programador.http.ClientDocumentServlet.service(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:821)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:583)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1158)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1090)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)
    at org.eclipse.jetty.server.handler.RequestLogHandler.handle(RequestLogHandler.java:56)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
    at org.eclipse.jetty.server.Server.handle(Server.java:517)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:306)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:261)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
    at java.lang.Thread.run(Unknown Source)
</pre>
<hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.3.5.v20151012</a><hr/>
</body>
</html>
   Pedroshitel
 
2 - 19.10.16 - 17:33
Сделал вывод(да и гугл помог) Missing initial multi part boundary указывает на неправильный заголовок или неполный. Повторюсь в 8.2 такие заголовки и такой файл легко проходят. Буду рад любой помощи)
   Serginio1
 
3 - 19.10.16 - 17:41
   VoditelKobyly
 
4 - 20.10.16 - 06:19
Перед отправкой в ЕГАИС прогоняю файл через функцию:
//======================================================================

Функция ПодготовитьТекстЗапросаУТМ(пИмяФ)
    Перем лТекстXMLФайла,лТекстДляОтправки;
    
    лТекстXMLФайла=СоздатьОбъект("ADODB.Stream");
    лТекстXMLФайла.Type=2;
    лТекстXMLФайла.charset="utf-8";
    лТекстXMLФайла.Open();
    лТекстXMLФайла.LoadFromFile(пИмяФ);
     
    лТекстДляОтправки    = "--"+мРазделительХМЛ;
    лТекстДляОтправки    = лТекстДляОтправки + мРазделительСтрокХМЛ + "Content-Disposition: form-data; name=""xml_file""; filename=""client.xml""";
    лТекстДляОтправки    = лТекстДляОтправки + мРазделительСтрокХМЛ + "Content-Type: application/xml";
    лТекстДляОтправки    = лТекстДляОтправки + мРазделительСтрокХМЛ + "";
    лТекстДляОтправки    = лТекстДляОтправки + мРазделительСтрокХМЛ + лТекстXMLФайла.ReadText();
    лТекстДляОтправки    = лТекстДляОтправки + мРазделительСтрокХМЛ + "";
    лТекстДляОтправки    = лТекстДляОтправки + мРазделительСтрокХМЛ + "--"+мРазделительХМЛ+"--";
    
    Возврат лТекстДляОтправки;
    
КонецФункции// ПодготовитьТекстКОтправке(ИмяФ);
   Pedroshitel
 
5 - 20.10.16 - 16:36
Ну да, это хороший способ привести файл к utf-8,но проблемы это не решает. Заголовки внутри файла у меня и так прописаны, более того по сути на УТМ можно отправлять и просто txt файл, не обязательно xml. Поэтому я думаю, что проблема и ошибка "Missing initial multi part boundary" относится к вот этому коду:     HTTPxml.Open("POST", "http://"+"нашУТМ"+"/opt/in/QueryAP";;, -1); //асинхронный запрос

    

    ФС.АтрибутыФайла(ИмяФайлаОтправки,РазмерФайла); 

    HTTPxml.SetRequestHeader("Content-Type","multipart/form-data; boundary="+СокрЛП(Boundary));

    HTTPxml.SetRequestHeader("Content-Charset","utf-8");

    HTTPxml.SetRequestHeader("Content-Length", СокрЛП(РазмерФайла));

    HTTPxml.Send(ИмяФайлаОтправки);

Тут в принципе из заголовка даже можно убрать "Content-Charset". Если например я буду в функцию Send передавать просто текст, то все заработает, но я хочу именно файл передать.
   Serginio1
 
6 - 20.10.16 - 18:02
Берешь в руки фиддлер и сравниваешь.
А вообще для 7 ки 3 самое то
http://ru.stackoverflow.com/questions/527763/%d0%9a%d0%b0%d0%ba-%d0%b2%d1%8b%d0%b7%d0%b2%d0%b0%d1%82%d1%8c-%d0%bc%d0%b5%d1%82%d0%be%d0%b4-%d0%b8%d0%b7-c-%d0%b2-1%d0%a1/527802#527802

Чем использовать древние инструменты.
   VoditelKobyly
 
7 - 24.10.16 - 08:30
(5) Когда я писал обмен с УТМ и ловил такую ошибку, то проблема оказалась именно в правильном оформлении.
Не настаиваю, может это было только у меня так. Из восьмерки запросы шли, а из семерки эти же запросы постоянно выдавали ошибки.
(6) Это все хорошо, но для меня это тёмный лес.
   Serginio1
 
8 - 24.10.16 - 10:00
(7) Так там примеры есть. При этом проще чем MSXML2.ServerXMLHTTP
А Фиддлер http://www.telerik.com/fiddler  это один из самых используемых снифферов

Список тем форума
Рекламное место пустует  Рекламное место пустует
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Э. Йодан
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует