![]() |
|
v7: Отправка xml в УТМ при помощи MSXML2.ServerXMLHTTP | ☑ | ||
---|---|---|---|---|
0
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); |
|||
1
Pedroshitel
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> |
|||
2
Pedroshitel
19.10.16
✎
17:33
|
Сделал вывод(да и гугл помог) Missing initial multi part boundary указывает на неправильный заголовок или неполный. Повторюсь в 8.2 такие заголовки и такой файл легко проходят. Буду рад любой помощи)
|
|||
3
Serginio1
19.10.16
✎
17:41
|
||||
4
VoditelKobyly
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(); лТекстДляОтправки = лТекстДляОтправки + мРазделительСтрокХМЛ + ""; лТекстДляОтправки = лТекстДляОтправки + мРазделительСтрокХМЛ + "--"+мРазделительХМЛ+"--"; Возврат лТекстДляОтправки; КонецФункции // ПодготовитьТекстКОтправке(ИмяФ); |
|||
5
Pedroshitel
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 передавать просто текст, то все заработает, но я хочу именно файл передать. |
|||
6
Serginio1
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 Чем использовать древние инструменты. |
|||
7
VoditelKobyly
24.10.16
✎
08:30
|
(5) Когда я писал обмен с УТМ и ловил такую ошибку, то проблема оказалась именно в правильном оформлении.
Не настаиваю, может это было только у меня так. Из восьмерки запросы шли, а из семерки эти же запросы постоянно выдавали ошибки. (6) Это все хорошо, но для меня это тёмный лес. |
|||
8
Serginio1
24.10.16
✎
10:00
|
(7) Так там примеры есть. При этом проще чем MSXML2.ServerXMLHTTP
А Фиддлер http://www.telerik.com/fiddler это один из самых используемых снифферов |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |