Defining my first REST API within InterSystems using iris-rest-Api-template as a basis and I am seeing if someone could provide me some guidance to see if I can make it work.
In some of my other posts, I have been trying to come up with a way for our Enterprise Application Development team which works with .Net to build Applications to make a REST call to our instance of InterSystems to query some of the Cache Tables we have defined.
Using the iris-rest-api-template, I have created the osuwmc.DataLookup.REST.Base.cls
Class osuwmc.DataLookup.REST.Base Extends %CSP.REST [ System = 3 ]
{
Parameter CHARSET = "utf-8"
Parameter CONTENTTYPE = "application/json"
Parameter HandleCorsRequest = 1
Parameter PAGESIZE As INTEGER = 50
ClassMethod OnPreDispatch(pUrl As %String, pMethod As %String, ByRef pContinue As %Boolean) As %Status
{
SET tSC = $$$OK
TRY {
IF ('..AcceptsContentType(..#CONTENTTYPEJSON)) {
SET tSC = ..ReportHttpStatusCode(..#HTTP406NOTACCEPTABLE), pContinue=0
QUIT
} ELSE {
SET %response.ContentType=..#CONTENTTYPEJSON
}
IF ((pMethod'="POST") && (pMethod'="PUT")) || (%request.Content="") {
SET %request.Content = {}
} ELSE {
IF '$isobject(%request.Content) {
SET tContent = %request.Content
} ELSE {
SET tContent = ""
WHILE '%request.Content.AtEnd {
SET tContent = tContent_%request.Content.Read()
}
}
IF (tContent="") {
SET %request.Content = {}
} ELSE {
SET tContent = $zconvert(tContent, "I", "UTF8")
SET %request.Content = ##class(%Library.DynamicObject).%FromJSON(tContent)
}
}
} CATCH ex {
SET tSC = ex.AsStatus()
}
QUIT ##class(%iKnow.REST.Base).%ErrorHandler(tSC, .pContinue)
}
ClassMethod %ProcessResult(pStatus As %Status = {$$$OK}, pResult As %DynamicObject = "") As %Status [ Internal ]
{
#dim %response As %CSP.Response
SET tSC = $$$OK
IF $$$ISERR(pStatus) {
SET %response.Status = 500
SET tSC = ..StatusToJSON(pStatus, .tJSON)
IF $isobject(tJSON) {
SET pResult = tJSON
} ELSE {
SET pResult = { "errors": [ { "error": "Unknown error parsing status code" } ] }
}
}
ELSEIF pStatus=1 {
IF '$isobject(pResult){
SET pResult = {
}
}
}
ELSE {
SET %response.Status = pStatus
SET error = $PIECE(pStatus, " ", 2, *)
SET pResult = {
"error": (error)
}
}
IF pResult.%Extends("%Library.DynamicAbstractObject") {
WRITE pResult.%ToJSON()
}
ELSEIF pResult.%Extends("%JSON.Adaptor") {
DO pResult.%JSONExport()
}
ELSEIF pResult.%Extends("%Stream.Object") {
DO pResult.OutputToDevice()
}
QUIT tSC
}
ClassMethod ReportHttpStatusCode(pHttpStatus, pSC As %Status = {$$$OK}) As %Status
{
Set %response.Status=pHttpStatus
If $$$ISERR(pSC) Do ..outputStatus(pSC)
Return $$$OK
}
}
and the osuwmc.DataLookup.REST.TableLookup
Class osuwmc.DataLookup.REST.TableLookup Extends osuwmc.DataLookup.REST.Base
{
Parameter Version = "1.0.0"
Parameter GlobalName = "^OSUWMCDataLookup.TableLookup"
XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
<!-- Server Info -->
<Route Url="/" Method="GET" Call="GetInfo" Cors="true"/>
<Route Url="/info" Method="GET" Call="GetAllEpicDepartments" Cors="true"/>
</Routes>
}
ClassMethod GetInfo() As %Status
{
SET version = ..#Version
SET info = {
"version": (version)
}
RETURN ..%ProcessResult($$$OK, info)
}
ClassMethod GetAllEpicDepartments() As %Status
{
SET tSC = $$$OK
set sql = "SELECT ID as DepartmentID, Abbr, Name, ExternalName, PhoneNumber, ApptPhone, FaxNumber, Address1, Address2, City, Zip, Specialty, RevLocID, RevLocName, BuildingCategoryID, BuildingName, DepCategoryTypeID, DepType, Center, EAFParent, CostCenter FROM osuwmc_Epic_Clarity.DepartmentMaster"
do ##class(%ZEN.Auxiliary.jsonSQLProvider).%WriteJSONFromSQL(,sql)
return tSC
}
ClassMethod GetEpicDepartment(ID As %String) As %Status
{
SET tSC = $$$OK
set sql = "SELECT ID as DepartmentID, Abbr, Name, ExternalName, PhoneNumber, ApptPhone, FaxNumber, Address1, Address2, City, Zip, Specialty, RevLocID, RevLocName, BuildingCategoryID, BuildingName, DepCategoryTypeID, DepType, Center, EAFParent, CostCenter FROM osuwmc_Epic_Clarity.DepartmentMaster WHERE ID = ?"
do ##class(%ZEN.Auxiliary.jsonSQLProvider).%WriteJSONFromSQL(,,sql,ID)
return tSC
}
ClassMethod SwaggerSpec() As %Status
{
Set tSC = ##class(%REST.API).GetWebRESTApplication($NAMESPACE, %request.Application, .swagger)
Do swagger.info.%Remove("x-ISC_Namespace")
Set swagger.basePath = "/crud"
Set swagger.info.title = "REST API to Access and Query OSUWMC Cache Tables"
Set swagger.info.version = "0.1"
Set swagger.host = "intengtest.osumc.edu"
Return ..%ProcessResult($$$OK, swagger)
}
}
I defined the Web Application as /api/mgmnt/<namespace>/TableLookup with the osuwmc.DataLookup.REST.TableLookup as the Dispatch Class.
When I try to execute the REST call using POSTMAN, "msg": "ERROR #8754: Unable to use namespace: TABLELOOKUP."
If I try to use the sample class, I get a message saying that "The request URL was not found on the server" or a "404 Not Found"
I checked the Web Gateway to make sure the application was defined.
So, am I missing a step somewhere?