PrevICM Language Reference
SOAP services and communications
Next

To access some external services there is a protocol called SOAP. Now ICM can send a SOAP request and get the result back to ICM.

Sending request to the SOAP server

A SOAP request is a special XML text which contains :

In ICM you can form a SOAP message using the SoapMessage function. It creates a special soapMessage object which holds SOAP method name and it's arguments.

Example:


# create a message with SOAP method and a namespace
req = SoapMessage( "doSpellingSuggestion","urn:GoogleSearch" )  
# add method arguments
req = SoapMessage( req,  "key","btnHoYxQFHKZvePMa/onfB2tXKBJisej" ) # get key from google
req = SoapMessage( req,  "pharse", "Bretney Spers" )  # some misspelled pharse

Once the message is ready it can be send to the server using the read http command.

read string s_soapServiceURL + " " + String( soapMessage )

The result of the server response will be stored into s_out variable. It can be parsed to a soapMessage object using the SoapMessage function.

Example:


HTTP.postContentType = "text/xml"
read string "http://api.google.com/search/beta2" + " " + String(req)
res = SoapMessage( s_out )
if Error(res) == "" then
 # process message
endif

Processing SOAP results

To access the content of SOAP message, the Value function is applied

If the result of the SOAP response is a simple value, such as integer,`real,`string,`sarray,`rarray,`iarray, then it will be automatically casted to the corresponding ICM type. Otherwise a special type of parray will be returned.

In some cases the result returned by SOAP server is actually some complex data structure (not just a single string or number) The most common complex SOAP types are 'struct' and 'array'. Each of them can either contain a simple type of other 'struct' or 'array'.

You may navigate through this structure using index expressions:

soapObject[ i_integerIndex ]

or

soapObject[ s_stringIndex ]

The number of elements in the array of struct can be returned by Nof function.

Sarray of field names of a struct can be returned by Name function

For example the following code navigates through the result obtained from the google search service.


  res = Value( SoapMessage( s_out ) )
  s_html = ""
  s_html += "Searched web for <b>" + res["searchQuery"] + "</b>. Search took " + res["searchTime"] + " seconds.<br>"

  elements = res["resultElements"]
  for i=1,Nof(elements)

    resElement = elements[i]  

    s_html += "<br>"
    
    cat     = String( resElement["directoryCategory"]["fullViewableName"] )
    summary = String( resElement["summary"] )
    title   = String( resElement["title"] )
    snippet = String( resElement["snippet"] )
    url     = String( resElement["URL"] )
    cachedSize     = String( resElement["cachedSize"] )

    if (Length(title) != 0) then 
        s_html += "<font color=\"#0000FF\"><b><u>" + title + "</u></b></font><br>"
    else 
        s_html += "<font color=\"#0000FF\"><b><u>" + url + "</u></b></font><br>"
    endif

    if (Length(snippet) != 0) s_html += snippet + "<br>"
    if (Length(summary) != 0) s_html += "<font color=\"#808080\">Description:</font> " + summary + "<br>"
    if (Length(cat) != 0) s_html += "<font color=\"#808080\">Category: <u>" + cat + "</u></font><br>"
    if (Length(title) != 0) s_html += "<font color=\"#008000\"><u>" + url + "</u> - " + cachedSize + "</font><br>"

  endfor

{ KEGG database }

KEGG (Kyoto Encyclopedia of Genes and Genomes) is a database resource that integrates genomic, chemical, and systemic functional information. In particular, gene catalogs in the completely sequenced genomes are linked to higher-level systemic functions of the cell, the organism, and the ecosystem.

Example of few requests:


l_info = l_commands = no
HTTP.postContentType = "text/xml"
HTTP.soapAction = "SOAP/KEGG"
url = "http://soap.genome.jp/keggapi/request_v6.2.cgi"

req=SoapMessage( "get_pathways_by_genes" "SOAP/KEGG" )
req=SoapMessage( req "genes_id_list", {"hsa:5292"} )
read string url+" "+String(req) 

sss = SoapMessage( s_out )

if (Error(sss) == "") then
  S_path = Value(sss)
  print "pathways = " Sum(S_path,",")

  for i=1,Nof(S_path)
    req=SoapMessage( "get_references_by_pathway" "SOAP/KEGG" )
    req=SoapMessage( req "pathway_id", S_path[i] )
    read string url+" "+String(req) 
    sss = SoapMessage( s_out )
    print "references for " S_path[i]
    Value(sss)
  endfor

endif

For KEGG WSDL file click here. API is defined here

Related functions: SoapMessage Value Error Nof Type Name


Prev
Smiles
Home
Up
Next
Gui programming