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

Тема в разделе "Lotus + Java + LS2J", создана пользователем morpheus, 13 апр 2010.

  1. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Доброе время всем

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

    на стороне прова есть платформа 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;
    Вапрос: куда копать чтобы реализовать это на ЛС ( я пробовал на подобии как здесь но не получилось )

    всегда ошибка что
    спасибо
     
  2. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    Morpheus
    тоесть есть определенный емейл куда нужно кидать аттач?
     
  3. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    на 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;
    }
    }
     
  4. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    нет это HTTP POST\GET запрос (насколько я понимаю)
     
  5. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Делал так: формировал xml-запрос, сохранял в поле документа, толкал серверный java-агент, который открывал документ и делал запрос. Функцию запроса привёл выше. URL, логин, пароль брал в агенте из системного профильного документа, скрытого от пользователей (чтоб не подглядели, бо сервис платный).
     
  6. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    nvy
    Это как я понимаю просто в поле сохранить текст :

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




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

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    как-то так
    <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]
     
  8. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    наконецто дошли руки дореализации, вот не задача в строке
    URLConnection urlConnection;
    в функции
    public String doPost(String urlString, String query)

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

    JavaAgent.java:44: cannot resolve symbol

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

    шо делать???

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
  10. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Morpheus
    Функция один-в-один как приведено выше? На какую строку ругается?

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Спасибо , СМС-ки пошли.

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


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

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Всем привет!
    В документации смс шлюза написано для того что бы отправить смс нужно сделать HTTP/POST запрос тело, которого, должно содержать XML документ с параметрами.

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    dimat
    я реализовывал на JAVA.

    Хотя не исключен вариант юзать OLE если сервер на форточках
    Код (LotusScript):
        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 структуры
     
  14. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Morpheus На Java то что нужно.
    Сам в Java не бум бум :rolleyes:
    Не мог бы ты зпостить законченую реализацию своего агента?
    Если не жалко, конечно :rolleyes:
     
  15. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    dimat
    не жалко, но это медвежья услуга если Вы не бум-бум

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

    Код (Text):
    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;
    }
    }

    }
     
  16. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Morpheus
    Спасибо, все работает:)
     
  17. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Всем привет!
    Для отправки смс использовал приведенный Морфеусом агент.
    С некоторых пор начала вываливаться стена сообщений об ошибках:

    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)

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

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Может изменились настройки сети? Например, добавился прокси-сервер. Попробуйте заменить
    <!--shcode--><pre><code class='java'> urlConnection = url.openConnection();[/CODE]
    на<!--shcode--><pre><code class='java'> urlConnection = url.openConnection(java.net.Proxy.NO_PROXY);[/CODE]
     
  19. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    нашел причину: стоял адрес днс сервера старого провайдера
     
  20. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    собсно о том и первая строка ошибки
     
Загрузка...

Поделиться этой страницей