Обмен Xml-сообщениями

morpheus

скриптописец
07.08.2006
3 915
1
34
Украина, Киев
#1
Доброе время всем

задача отправка СМС сообщений через провайдера моб. связи.

на стороне прова есть платформа IP2SMS ( с авторизацией )
которая принимает запрос на отправку в виде XML файла на определённый адрес про-ра:

<message>
<service id="single" start="время начала" validity="период актуальности"
source="отправитель"/>
<to>получатель</to>
<body content-type="тип содержимого"
encoding="кодировка"
ТЕКСТ СООБЩЕНИЯ
</body>
</message>



Провайдер приводит пример на PHP
PHP:
$from="TEST_NUMBER";
$to="380981234567";
$start="14:00";
$text="текст сообщения";
$xml="<message><service id='single' validity='+2 hour' source='$from'
start='$start'/><to>$to</to><body content-type='plain/text'
encoding='plain'>$text</body></message>";
$answ=post_request($xml, 'http://... /clients.php',
'super-login', 'mega-password');
function post_request($data, $url, $login, $pwd)
$credent = sprintf('Authorization: Basic
%s',base64_encode($login.":".$pwd) );
$params=array('http'=>array('method'=>'POST','content'=>$data,
'header'=>$credent));
$ctx = stream_context_create($params);
$fp=@fopen($url, 'rb', FALSE, $ctx);
if ($fp)
{
$response = @stream_get_contents($fp);
return $response;
}
else return FALSE;
Вапрос: куда копать чтобы реализовать это на ЛС ( я пробовал на подобии как здесь но не получилось )

всегда ошибка что
Request not recognized - xml parse failed. Request text:
спасибо
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
48
Подмосковье
#3
на Jave как-то так
PHP:
	public String doPost(String urlString, String query) {
String line;
URLConnection urlConnection;
try {
// создаём новый URL
URL url = new URL(urlString);
// открываем URL-соединение
urlConnection = url.openConnection();
// настраиваем параметры соединения
urlConnection.setDoInput(true);		
urlConnection.setDoOutput(true);
urlConnection.setUseCaches(false);
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// выполняем POST-запрос
PrintWriter output = new PrintWriter(urlConnection.getOutputStream());
output.print(query);
output.close();
// читаем ответ
StringBuffer response = new StringBuffer();
BufferedReader input = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
while ((line = input.readLine()) != null) {
response.append(line + "\n");
}
input.close();
return response.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
48
Подмосковье
#5
нет это HTTP POST\GET запрос (насколько я понимаю)
Делал так: формировал xml-запрос, сохранял в поле документа, толкал серверный java-агент, который открывал документ и делал запрос. Функцию запроса привёл выше. URL, логин, пароль брал в агенте из системного профильного документа, скрытого от пользователей (чтоб не подглядели, бо сервис платный).
 

morpheus

скриптописец
07.08.2006
3 915
1
34
Украина, Киев
#6
nvy
формировал xml-запрос
Это как я понимаю просто в поле сохранить текст :

<message><service id="single" start="время начала" validity="период актуальности"source="отправитель"/><to>получатель</to>
<body content-type="тип содержимого" encoding="кодировка" ТЕКСТ СООБЩЕНИЯ </body>
</message>




который открывал документ и делал запрос
а вот тут затык, с ява не знаком... можно пример? (помимо самой функции запроса)
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
48
Подмосковье
#7
как-то так
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='Java'>import java.util.*;
import java.net.*;
import java.io.*;

import lotus.domino.*;

public class JavaAgent extends AgentBase {

public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

Session thisSession = getSession();
AgentContext thisAgentContext = thisSession.getAgentContext();
Agent thisAgent = thisAgentContext.getCurrentAgent();
Database thisDatabase = thisAgentContext.getCurrentDatabase();
String docID = thisAgent.getParameterDocID();
if (!docID.equals("")) {
Document thisDoc = thisDatabase.getDocumentByID(docID);
if (thisDoc != null) {
if (processSMSSending(thisDoc) != null) {
// ...
}
else {
// ...
}
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}

public String processSMSSending(Document doc) {
String sResult = null;
try {
Document profile = doc.getParentDatabase().getProfileDocument("(Profile)", "");
String urlString = profile.getItemValueString("$URL");
String queryBody = doc.getItemValueString("Body");
String query = "";
//
// + танцы с бубном по формированию query из логина, пароля, body и т.п.
//
sResult = doPost(urlString, query);
}
catch (Exception e) {
e.printStackTrace();
}
return sResult;
}

}[/CODE]
 

morpheus

скриптописец
07.08.2006
3 915
1
34
Украина, Киев
#8
наконецто дошли руки дореализации, вот не задача в строке
URLConnection urlConnection;
в функции
public String doPost(String urlString, String query)

выдаёт ошибку:

JavaAgent.java:44: cannot resolve symbol

исходя из этого я так понимаю нехватает файла который описывает класс.

шо делать???

з.ы. дизайню в 7.0.2
сервер 8.5.0. win 2003 x64
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
48
Подмосковье
#10
Morpheus
Функция один-в-один как приведено выше? На какую строку ругается?

Добавлено:
import java.util.*;
import java.net.*;
import java.io.*;
 

morpheus

скриптописец
07.08.2006
3 915
1
34
Украина, Киев
#11
Спасибо , СМС-ки пошли.

Хочу лишь добавить что , в функции doPost, перед выполнением Post-запроса добавить авторизацию:


Код:
String encoding = new sun.misc.BASE64Encoder().encode("LOGIN:PASSWORD".getBytes());
urlConnection.setRequestProperty("Authorization", "Basic " + encoding);
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
31
Киров
#12
Всем привет!
В документации смс шлюза написано для того что бы отправить смс нужно сделать HTTP/POST запрос тело, которого, должно содержать XML документ с параметрами.

Вопросы: что из себя должен представлять этот запрос, как осуществить этот запрос в Lotus и где должен находиться этот XML документ?
 

morpheus

скриптописец
07.08.2006
3 915
1
34
Украина, Киев
#13
dimat
я реализовывал на JAVA.

Хотя не исключен вариант юзать OLE если сервер на форточках
Код:
	sTmp = profDoc.GetItemValue( "smsURL2Send" )(0) ' SMS - URL Connect, action = send sms
sTmp = sTmp + {?id=}
sTmp = sTmp + profDoc.GetItemValue( "smsLogin" )(0) ' SMS login
sTmp = sTmp + {&pass=}
sTmp = sTmp + profDoc.GetItemValue( "smsPassword" )(0) ' SMS Password

s1 = trim( rb_doc.GetItemValue( "APhone" )(0) )
if Len( s1 ) <> 13 then Error 9003, {Incorrect phone number}
s1 = {&phone=} + StrRight( s1, "+" ) 
s1 = s1 + {&body=}
s1 = s1 + npmString2Url( Trim( rb_doc.GetItemValue( "MsgText" )(0) ) )

Dim xml As Variant
Call rb_doc.ReplaceItemValue( "AgentQuery", s1 )
if Not rb_doc.Lock then Error 9003 , {Неможливо заблокувати документ-повідомлення}

Set xml = CreateObject("Microsoft.XMLHTTP")  
Sleep 1 ' ждём 1 секунду, чтобы не упал сервер провайдра 
Call xml.open("GET", sTmp + s1  ,False) 
Call xml.send() 
sTmp = lcase( xml.responseText )
Call rb_doc.ReplaceItemValue( "AgentResponse" , sTmp )
где sTmp + s1 - и есть наш запрос в виде XML структуры
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
31
Киров
#14
Morpheus На Java то что нужно.
Сам в Java не бум бум :rolleyes:
Не мог бы ты зпостить законченую реализацию своего агента?
Если не жалко, конечно :rolleyes:
 

morpheus

скриптописец
07.08.2006
3 915
1
34
Украина, Киев
#15
dimat
не жалко, но это медвежья услуга если Вы не бум-бум

Вызов агента на сервере с NoteID - документа в котором содержится инф-а куда слать SMS

Код:
import lotus.domino.*;

import java.util.*;
import java.net.*;
import java.io.*;

public class JavaAgent extends AgentBase {

public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
Session thisSession = getSession();
AgentContext thisAgentContext = thisSession.getAgentContext();
Agent thisAgent = thisAgentContext.getCurrentAgent();
Database thisDatabase = thisAgentContext.getCurrentDatabase();
String docID = thisAgent.getParameterDocID();
if (!docID.equals("")) {
Document thisDoc = thisDatabase.getDocumentByID(docID);
if (thisDoc != null) {
String s = doPost(thisDoc);
thisDoc.replaceItemValue("AgentUpdate", "1");
thisDoc.replaceItemValue("AgentResponse", s);
thisDoc.save();
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}

public String doPost(Document doc) {
String line;
String sLog = "";
URLConnection urlConnection;
try {
Document profile = doc.getParentDatabase().getProfileDocument("MAINPROFILE", "");
// создаём новый URL
String urlString = profile.getItemValueString("xmlURL");
// query - Это и есть строка в формате XML структуры
String query = profile.getItemValueString("xmlHeader");
query = query + "< СОБИРАЕМ структуру XML >";
query = query + doc.getItemValueString("xmlPhone");
query = query + profile.getItemValueString("xmlButtom");
doc.replaceItemValue("AgentQuery", query);
URL url = new URL(urlString);
// открываем URL-соединение
urlConnection = url.openConnection();
// настраиваем параметры соединения
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setUseCaches(false);
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0");
// выполняем POST-запрос
PrintWriter output = new PrintWriter(urlConnection.getOutputStream());
output.print(query);
output.close();
// читаем ответ
StringBuffer response = new StringBuffer();
BufferedReader input = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
int iUBound = 32000;		// для того что бы в одно поле не более 32k
int k = 0;
Item textItem;
while ((line = input.readLine()) != null) {
response.append(line + "\n");
if (response.toString().length() >= iUBound) {
textItem = doc.replaceItemValue("AgentResponse" + Integer.toString(k), response.toString());
textItem.setSummary(false);
response = new StringBuffer();
k++;
}
}
input.close();
return response.toString();
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}

}
 

dimat

Well-Known Member
Lotus team
31.07.2008
516
0
31
Киров
#17
Всем привет!
Для отправки смс использовал приведенный Морфеусом агент.
С некоторых пор начала вываливаться стена сообщений об ошибках:

02.11.2011 07:59:48 Agent error: java.net.UnknownHostException: 2kengu.ru
02.11.2011 07:59:48 Agent error: at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:196)
02.11.2011 07:59:48 Agent error: at java.net.Socket.connect(Socket.java:530)
02.11.2011 07:59:48 Agent error: at java.net.Socket.connect(Socket.java:480)
02.11.2011 07:59:48 Agent error: at sun.net.NetworkClient.doConnect(NetworkClient.java:169)
02.11.2011 07:59:48 Agent error: at sun.net.www.http.HttpClient.openServer(HttpClient.java:406)
02.11.2011 07:59:48 Agent error: at sun.net.www.http.HttpClient.openServer(HttpClient.java:541)
02.11.2011 07:59:48 Agent error: at sun.net.www.http.HttpClient.<init>(HttpClient.java:245)
02.11.2011 07:59:48 Agent error: at sun.net.www.http.HttpClient.New(HttpClient.java:318)
02.11.2011 07:59:48 Agent error: at sun.net.www.http.HttpClient.New(HttpClient.java:335)
02.11.2011 07:59:48 Agent error: at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.j
ava:783)
02.11.2011 07:59:48 Agent error: at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:
724)
02.11.2011 07:59:48 Agent error: at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:649)
02.11.2011 07:59:48 Agent error: at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.ja
va:827)
02.11.2011 07:59:48 Agent error: at JavaAgent.doPost(JavaAgent.java:68)
02.11.2011 07:59:48 Agent error: at JavaAgent.NotesMain(JavaAgent.java:25)
02.11.2011 07:59:48 Agent error: at lotus.domino.NotesThread.run(Unknown Source)

я так понимаю, раз до этого все работало и никто агент не трогал, то проблоема не в коде?
в чем же может быть проблема?
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
48
Подмосковье
#18
Может изменились настройки сети? Например, добавился прокси-сервер. Попробуйте заменить
<!--shcode--><pre><code class='java'> urlConnection = url.openConnection();[/CODE]
на<!--shcode--><pre><code class='java'> urlConnection = url.openConnection(java.net.Proxy.NO_PROXY);[/CODE]