Search code examples
restlotus-domino

Consume REST service in server-based agent


We're asked to build a Domino server-based database that exchanges data with a remote non-Domino server. The remote server can be connected to by using webservices.

Creating a RESTful service in Domino seems simple, using R8.5.3: there are some very interesting articles on Domino Data Service on the Internet. Studying this page will certainly help me to create one end of the connection.

Now for the consuming part in the agent. We did this once before, some time ago, and then we used plain HTTP URLs and a simple GetDocumentByURL. It isn't perfect, but it works.

But is that the best way to consume a web service in a Domino agent? It's a Linux environment so I cannot use MS-objects or so. Is there some standard library that I can call, preferably in LotusScript? Or is there a way to use some XPages control in an agent?

Thanks for your suggestions!


Solution

  • [EDIT] The example from breakingpar

    The java code to be placed in a Java Library called GetHTML:

    import java.io.*;
    import java.net.*;
    
    public class GetHTML {
    
       public String getHTML(String urlToRead) {
          URL url; // The URL to read
          HttpURLConnection conn; // The actual connection to the web page
          BufferedReader rd; // Used to read results from the web page
          String line; // An individual line of the web page HTML
          String result = ""; // A long string containing all the HTML
          try {
             url = new URL(urlToRead);
             conn = (HttpURLConnection) url.openConnection();
             conn.setRequestMethod("GET");
             rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
             while ((line = rd.readLine()) != null) {
                result += line;
             }
             rd.close();
          } catch (Exception e) {
             e.printStackTrace();
          }
          return result;
       }
    }
    

    And to use it in Lotusscript:

    Uselsx "*javacon"
    Use "GetHTML" ' Java library
    Const myURL = "http://www.breakingpar.com"
    Dim js As JAVASESSION
    Dim getHTMLClass As JAVACLASS
    Dim getHTMLObject As JavaObject
    Dim html As String
    
    Set js = New JAVASESSION
    Set getHTMLClass = js.GetClass("GetHTML")
    Set getHTMLObject = getHTMLClass.CreateObject
    html = getHTMLObject.getHTML(myURL)
    

    I used this to populate a country drop down in Lotus via this service: http://ws.geonames.org/countryInfo?

    You can use a Java Agent to consume the rest service: Is there an alternative to using the LotusScript GetDocumentByURL method

    The code below is copied from the technote. If the request is part of a bigger script jou can wrap the HTTP request in LS2J

    import lotus.domino.*;
    import java.net.*;
    import java.io.*;
    import java.text.*;
    import java.util.*;
    import java.math.*;
    
    public class JavaAgent extends AgentBase {
        public void NotesMain() {
            try {
                Session session = getSession();
                AgentContext agentContext = session.getAgentContext();
    
                Database db = agentContext.getCurrentDatabase();
                URL ibmURL = new URL(" http://finance.yahoo.com/q?s=IBM&d=t");
                BufferedReader bin = new BufferedReader(new InputStreamReader(ibmURL.openStream()));
                String line;
                StringBuffer sb = new StringBuffer();
    
                while ((line = bin.readLine()) != null) {
                    sb.append(line);
                }
                String ibmString = sb.toString();
    
                Document newNotesDoc = db.createDocument();
                newNotesDoc.replaceItemValue("Form", "IBMForm");
                newNotesDoc.replaceItemValue("WebPageUS", ibmString);
                newNotesDoc.computeWithForm(true, false);
                newNotesDoc.save(true, true);
    
                String ibms = newNotesDoc.getItemValueString("QuoteUS");
                System.out.println("IBM Raw String is " + ibms);
                newNotesDoc.recycle();
    
                NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US);
                BigDecimal d = new BigDecimal(ibms);
                double ibmd = d.doubleValue();
                String ibm = n.format(ibmd);
                System.out.println("IBM Currency is " + ibm);
    
                SimpleDateFormat formatter = new SimpleDateFormat("EEEE, MMMM dd, yyyy hh:mm:ss a");
                Date currentTime_1 = new Date();
                String dateString = formatter.format(currentTime_1);
                System.out.println("Formatted date is " + dateString);
                String displayText = "IBM stock price as of " + dateString + " NYSE US " + ibm;
                System.out.println("Display text is " + displayText);
                db.recycle();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }