16.11.2015, 10:01 | #1 |
Участник
|
SMS на МТС через API
Всем доброго дня. Подскажите кто-нибудь отсылал смс через API МТС?
Использую COM Microsoft.XMLHTTP Согласно инструкции http://mcommunicator.ru/m2m/m2m_api.asmx?op=SendMessage посылаю xmlSend /m2m/m2m_api.asmx HTTP/1.1 Host: mcommunicator.ru Content-Type: text/xml; charset=utf-8 Content-Length: 469 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>7912ххххххх</msid><message>Test message from Ax</message><naming></naming><login>ххх</login><password>ххх</password></SendMessage></soap:Body></soap:Envelope> на http://www.mcommunicator.ru/m2m/m2m_api.asmx используя метод POST в ответ получаю <?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. ---> Data at the root level is invalid. Line 1, position 1.</soap:Text></soap:Reason><soapetail /></soap:Fault></soap:Body></soap:Envelope> Прошу совета, что я делаю не так? |
|
16.11.2015, 11:27 | #2 |
Дмитрий Ерин
|
|
|
16.11.2015, 11:58 | #3 |
Участник
|
Каюсь, вставил это из инфолога info (strfmt("xmlSend %1", xmlSend)); Сначала у меня там был в начале POST с ним тоже не работает. Потом подумал что и так использую метод POST и убрал.
static XML sendRequest(Url _urlReq, str _method = "POST", XML _xmlSend = "") { COM xmlHttp; XML xmlFileResult; str soapAction; ; xmlHttp = new COM("Microsoft.XMLHTTP"); xmlHttp.open(_method,_urlReq,false); xmlHttp.send(_xmlSend); xmlFileResult = xmlHttp.responseText(); xmlFileResult = xmlHttp.responseText(); return xmlFileResult; } Последний раз редактировалось smailik; 16.11.2015 в 12:01. |
|
17.11.2015, 13:00 | #4 |
Участник
|
Ошибка может быть, из за того что кодировка при отправке становится Win-1251, из-за этого xml на сервере кривится, и становится не правильный.
В интернете прочитал Что после open, можно попробовать использовать метод setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); А так можно даже попробовать через обычные HTTP GET/POST запросы сделать. Для GET нужно всего-то собрать такую строку msid=string&message=string&naming=string&login=string&password=string И сделать запрос: "http://www.mcommunicator.ru/m2m/m2m_...assword=string" Написал простой пример в ax2009 с использованием NET. X++: public static str GET(URL _url, boolean useProxy = false) { CLRObject clro = null; System.Net.HttpWebRequest httpRequest = null; System.Net.HttpWebResponse httpResponse = null; System.Reflection.TargetInvocationException error2; str response, errorText; System.Exception exseption ; System.IO.StreamReader sr; System.Net.WebHeaderCollection headersCollection; System.Net.HttpStatusCode httpStatusCode; System.IO.Stream stream; int i,y; System.Version httpVersion; int counter; container con; System.Net.WebProxy proxy; System.Net.NetworkCredential nc; System.Net.WebClient WebClient; System.Object clr; str userName; System.Text.RegularExpressions.Regex regex; System.Text.RegularExpressions.Match matches; int lenthMatch; ; try { new InteropPermission(InteropKind::ClrInterop).assert(); clro = System.Net.WebRequest::Create(_url); httpRequest = clro; httpRequest.set_Credentials( System.Net.CredentialCache::get_DefaultCredentials()); httpRequest.set_AllowAutoRedirect(true); nc = httpRequest.get_Credentials(); if(useProxy) { proxy = new System.Net.WebProxy( , ); proxy.set_Credentials(System.Net.CredentialCache::get_DefaultCredentials()); httpRequest.set_Proxy(proxy); proxy.get_Credentials(); } httpRequest.set_Method("GET"); httpVersion = new System.Version(1,0); httpRequest.set_ProtocolVersion(httpVersion); httpRequest.set_ContentType("application/x-www-form-urlencoded"); httpResponse = httpRequest.GetResponse(); sr = new System.IO.StreamReader(httpResponse.GetResponseStream()); headersCollection = httpResponse.get_Headers(); httpStatusCode = httpResponse.get_StatusCode(); response = sr.ReadToEnd(); sr.Close(); sr.Dispose(); CodeAccessPermission::revertAssert(); } catch(exception::CLRError) { CodeAccessPermission::revertAssert(); new InteropPermission(InteropKind::ClrInterop).assert(); error2 = ClrInterop::getLastException(); if (error2 != null) { exseption = error2.get_InnerException(); if (exseption != null) { errorText = exseption.get_Message(); CodeAccessPermission::revertAssert(); throw error(errorText); } } CodeAccessPermission::revertAssert(); } return response; } |
|
|
За это сообщение автора поблагодарили: Товарищ ♂uatr (1). |
17.11.2015, 14:01 | #5 |
Участник
|
Полез писать то как я победил ошибку и увидел Ваше сообщение
Цитата:
setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
Сейчас код работает вот как: X++: xmlHttp = new COM("Microsoft.XMLHTTP"); xmlHttp.open(_method,_urlReq,false); soapAction = '"' + "http://mcommunicator.ru/M2M/SendMessage" + '"'; xmlHttp.setRequestHeader("Host:", "mcommunicator.ru"); xmlHttp.setRequestHeader("Content-Type:", "text/xml; charset=UTF-8" ); xmlHttp.setRequestHeader("Content-Length:", _dataLength); xmlHttp.setRequestHeader("SOAPAction:", soapAction); xmlHttp.send(_xmlSend); xmlFileResult = xmlHttp.responseText(); X++: <?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>Test message from Ax</message> <naming></naming> <login></login> <password></password></SendMessage> </soap:Body> </soap:Envelope> |
|
|
За это сообщение автора поблагодарили: sukhanchik (2), Ace of Database (3), DeAmouSE (1). |
|
|