In my MWLUG presentation (as well as in a couple of entries on this blog) I talk about how you can access Domino data from a regular webpage using jQuery and a Lotusscript agent returning data as JSON. The issue with this solution is that the web page must be on the same web application path as the Domino agent. You can’t do what’s known as cross-domain Ajax.
For example if the Domino server is domino.texasswede.com but you have the webpage hosted at www.texasswede.com, it will not work. The security in Javascript does not allow calls across servers like that. There is however an easy solution, and it is called JSONP. What you do is to return not JSON but a call-back function with the JSON data as the argument.
So instead of returning this:
{ "firstName":"Karl-Henry", "lastname":"Martinsson","email":"texasswede@gmail.com" }
you would have the Lotuscript agent return this:
personCallBack({ "firstName":"Karl-Henry", "lastname":"Martinsson","email":"texasswede@gmail.com" })
Let’s assume we call the agent GetPersonData.jsonp. On the calling side (in the jQuery code) you would then use this code:
$.ajax({ url : "http://domino.texasswede.com/database.nsf/GetPersonData.jsonp?OpenAgent", dataType:"jsonp" });
Finally you write the Javascript call-back function that will accept the data:
function personCallBack(data) { $("#firstName").html(data["firstName"]); $("#lastName").html(data["lastName"]); $("#emailAddress").html(data["email"]); }
You can of course make this as advanced as you like but this is the basics. I have updated the JSON class I use for stuff like this to include a method to return JSONP. The new function is called SendJSONPToBrowser() and takes a string with the name of the call-back function as argument, for example like this:
Call json.SendJSONPToBrowser("personCallBack")
Below is the updated class (if you downloaded my sample database from MWLUG you have the older version of it). Enjoy!
%REM Library Class.JSON by Karl-Henry Martinsson Created Oct 9, 2014 - Initial version Updated Nov 6, 2015 - Added JSONP support Description: Class to generate simple JSON from values %END REM Option Public Option Declare Class JSONdata Private p_json List As String Public Sub New() '*** Set default value(s) me.p_json("ajaxstatus") = "" End Sub %REM Property Set success Description: Set success to true or false %END REM Public Property Set success As Boolean If me.success Then Call me.SetValue("ajaxstatus","success") Else Call me.SetValue("ajaxstatus","error") End If End Property %REM Property Get success Description: Not really used... %END REM Public Property Get success As Boolean If me.p_json("ajaxstatus") = |"success"| Then me.success = True Else me.success = False End If End Property %REM Sub SetMsg Description: Set msg item %END REM Public Sub SetMsg(message As String) Call me.SetValue("msg",message) End Sub Public Sub SetErrorMsg(message As String) Call me.SetValue("errormsg",message) me.success = False End Sub Public Sub SetValue(itemname As String, value As String) Dim tmp As String Dim delimiter As String '*** Check for quote (double and single) and fix value if needed tmp = Replace(value,Chr$(13),"<br>") tmp = FullTrim(Replace(tmp,Chr$(10),"")) If InStr(tmp,|"|)>0 Then If InStr(tmp,|'|)>0 Then tmp = Replace(tmp,|"|,|"|) delimiter = |"| Else delimiter = |'| End If Else delimiter = |"| End If '*** Store value with delimiter in list me.p_json(itemname) = delimiter & tmp & delimiter End Sub Public Sub SetData(itemname As String, value As String) '*** Store value in list me.p_json(itemname) = value End Sub %REM Function GetJSON Description: Return a JSON object as text %END REM Function GetJSON As String Dim json As String '*** Opening curly braces + CR json = "{" + Chr$(13) '*** Loop through all list elements and build JSON ForAll j In me.p_json json = json + |"| + ListTag(j) + |":| + j + "," + Chr$(13) End ForAll '*** Remove the comma after the last item json = Left$(json,Len(json)-2) + Chr$(13) '*** Add closing curly bracket and return JSON json = json + "}" GetJSON = json End Function %REM Sub SendToBrowser Description: Print JSON to browser, with correct MIME type %END REM Public Sub SendToBrowser() '*** MIME Header to tell browser what kind of data we will return (JSON). '*** See http://www.ietf.org/rfc/rfc4627.txt Print "content-type: application/json" Print me.GetJSON End Sub %REM Sub SendJSONPToBrowser Description: Print JSON to browser, with correct MIME type %END REM Public Sub SendJSONPToBrowser(callbackFunction As String) '*** MIME Header to tell browser what kind of data we will return (Javascript). '*** See http://www.rfc-editor.org/rfc/rfc4329.txt Print "content-type: application/javascript" Print callbackFunction + "(" + me.GetJSON + ")" End Sub End Class