Escrito por

Sales Engineer at InterSystems
Artigo Danusa Calixto · Dez. 22, 2023 9m read

Banco de Dados de Documentos do IRIS (DocDB)

O Banco de Dados de Documentos do InterSystems IRIS (DocDB) oferece uma abordagem flexível e dinâmica de gestão dos dados de bancos de dados. O DocDB abraça o poder do JSON (JavaScript Object Notation), fornecendo um ambiente sem esquema para armazenar e recuperar dados.

É uma ferramenta poderosa que permite aos desenvolvedores ignorar um monte de código boilerplate na interação com aplicativos existentes, serialização, paginação e integração. O fluxo perfeito do DocDB com os serviços e as operações de Interoperability Rest possibilita um grande salto na produção e no gerenciamento de APIs.

Confira a documentação completa do DocDB aqui. No contexto deste artigo, mostrarei um caso de uso em que o DocDB é uma combinação perfeita.

Organizações que usam produtos da InterSystems como IRIS, Interoperability, TrakCare... geram constantemente requisitos novos e ágeis para o compartilhamento de dados com outros sistemas para consumo. A InterSystems oferece o adaptador JSON integrado para permitir que as classes persistentes sejam serializáveis em JSON no nível do registro. No entanto, reescrever seu aplicativo para estender o adaptador JSON não é uma tarefa fácil, e seus dados de interesse serão gerenciados sempre no nível do registro diretamente das classes do seu aplicativo. É aí que entra o DocDB, porque você pode criar consultas no código do seu aplicativo e despejá-las no DocDB como JSON, prontas para serem enviadas a apps para consumidores.

Aqui está um snippet executando qualquer procedimento armazenado do IRIS padrão de maneira genérica  e salvando a saída como registros no formato json.

//presumindo que os parâmetros existem como P1,P2,...Pn no contextoset queryData=$lb("queryclassname:queryname",<no of parameters>)
		set queryString=$lg(queryData,1)
		set paramCount=$lg(queryData,2)
		set args=$lb()
		for ix=1:1:paramCount{
			set var="P"_ix
			XECUTE ("(in,out) SET out=$g(in)", @var, .y)
			set$li(args,ix)=$s(y'="":""""_y_"""",1:""""_"""")
			}
		set resultSet=##class(%ResultSet).%New(queryString)
		XECUTE ("(in,out) set out=in.%Execute("_$lts(args)_")",resultSet,.scx)
		set sc=scx
		If$$$ISERR(sc) $$$ThrowStatus(sc)
		set columnNo=resultSet.GetColumnCount()
	<span class="hljs-keyword">While</span> resultSet.<span class="hljs-built_in">%Next</span>(.sc) {
		<span class="hljs-keyword">If</span> <span class="hljs-built_in">$$$ISERR</span>(sc) <span class="hljs-built_in">$$$ThrowStatus</span>(sc)
		
		<span class="hljs-keyword">set</span> row={}
		<span class="hljs-keyword">for</span> iz=<span class="hljs-number">1</span>:<span class="hljs-number">1</span>:columnNo{
			<span class="hljs-keyword">set</span> columnName=resultSet.GetColumnName(iz)
			<span class="hljs-keyword">do</span> row.<span class="hljs-built_in">%Set</span>(columnName,resultSet.GetDataByName(columnName))
		}
		<span class="hljs-keyword">set</span> sc=<span class="hljs-built_in">..AddRecordToReportResult</span>(ID,row)
		<span class="hljs-keyword">If</span> <span class="hljs-built_in">$$$ISERR</span>(sc) <span class="hljs-built_in">$$$ThrowStatus</span>(sc)
	}</code></pre>
ClassMethod AddRecordToReportResult(doc As%DynamicObject)As%Status {
    set sc=$$$OKtry {
		if (##class(%DocDB.Database).xNExists("PreparedReportDB")){
			set db=##class(%DocDB.Database).%GetDatabase("PreparedReportDB")
		} else {
			set db= ##class(%DocDB.Database).%CreateDatabase("PreparedReportDB")
		}
		set nwRecord=db.%SaveDocument(doc)
		do nwRecord.%Save(0)
		
		k nwRecord
	}catch err{
		set sc=$$$ADDSC(sc,$$$ERROR("5001",err.DisplayString()))
	}
	return sc
    
}

É isso. Seus dados, sejam quais forem, estão prontos para serem expostos a apps para consumidores.

Considerando o caso de uso de monitoramento de integrações, suas consultas verificarão o status da sua produção de interoperabilidade da InterSystems, os erros, alertas...

E os dados serão salvos em um DocDB em intervalos.

Class ProdEye.DataTask Extends%SYS.Task.Definition
{

Property IntervalMinutes As%Integer [ InitialExpression = 5 ]; Method OnTask() As%Status { try { set packageName=$P($classname(),".",1)

	<span class="hljs-keyword">set</span> targetDocument={}
	
	<span class="hljs-keyword">set</span> ZeroTimeStamp= <span class="hljs-built_in">$$HorologAddSecs</span><span class="hljs-symbol">^EnsUtil</span>(<span class="hljs-built_in">$ztimestamp</span>,-(<span class="hljs-built_in">..IntervalMinutes</span>*<span class="hljs-number">60</span>))
	
	<span class="hljs-keyword">set</span> targetDocument.TimeOfQuery=<span class="hljs-keyword">##class</span>(Ens.DataType.UTC).timeUTC()
	<span class="hljs-keyword">set</span> targetDocument.TimeOfQueryIdx=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"getDateTimeUTCIdx"</span>)
	<span class="hljs-keyword">do</span> <span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetNameSpaceList"</span>)
	<span class="hljs-keyword">k</span> prodArray
	
	<span class="hljs-keyword">do</span> <span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetProductionsList"</span>,.prodArray)
	
	
	<span class="hljs-keyword">set</span> productionObjectList=[]
	
	<span class="hljs-keyword">set</span> currNameSpace=<span class="hljs-string">""</span>
	<span class="hljs-keyword">for</span>  {
		<span class="hljs-keyword">set</span> currNameSpace=<span class="hljs-built_in">$O</span>(prodArray(currNameSpace))
		<span class="hljs-keyword">quit</span>:currNameSpace=<span class="hljs-string">""</span>
		<span class="hljs-keyword">set</span> currProd=<span class="hljs-string">""</span>
		<span class="hljs-keyword">for</span>  {
			<span class="hljs-keyword">set</span> currProd=<span class="hljs-built_in">$O</span>(prodArray(currNameSpace,currProd))
			<span class="hljs-keyword">quit</span>:currProd=<span class="hljs-string">""</span>
			<span class="hljs-keyword">set</span> newProdData=<span class="hljs-built_in">$g</span>(prodArray(currNameSpace,currProd))
			<span class="hljs-keyword">set</span> newProd=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Data.Production"</span>,<span class="hljs-string">"%New"</span>,currProd,<span class="hljs-built_in">$lg</span>(newProdData,<span class="hljs-number">1</span>),<span class="hljs-built_in">$lg</span>(newProdData,<span class="hljs-number">2</span>))
			
			<span class="hljs-keyword">k</span> compArray
			<span class="hljs-keyword">do</span> <span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentListByProd"</span>,.compArray,currProd,currNameSpace)
			
			<span class="hljs-keyword">set</span> components=<span class="hljs-string">""</span>
			<span class="hljs-keyword">set</span> currComp=<span class="hljs-string">""</span>
			<span class="hljs-keyword">for</span>  {
				<span class="hljs-keyword">set</span> currComp=<span class="hljs-built_in">$O</span>(compArray(currProd,currComp))
				<span class="hljs-keyword">quit</span>:currComp=<span class="hljs-string">""</span>
				<span class="hljs-keyword">set</span> newComp=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Data.ProductionConfigItem"</span>,<span class="hljs-string">"%New"</span>,currComp,<span class="hljs-built_in">$g</span>(compArray(currProd,currComp)))
				<span class="hljs-keyword">set</span> compId=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentId"</span>,currComp,currProd,currNameSpace)
				<span class="hljs-keyword">set</span> newComp.Type= <span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentType"</span>,compId,currNameSpace)
				<span class="hljs-keyword">set</span> newComp.QueueSize=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentQueueData"</span>,currComp,currNameSpace)
				
				<span class="hljs-keyword">set</span> MessageStats=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentMessageCountAndAvg"</span>,currComp,ZeroTimeStamp,currNameSpace)
				<span class="hljs-keyword">set</span>:<span class="hljs-built_in">$lv</span>(MessageStats) newComp.MessageCount=<span class="hljs-built_in">$lg</span>(MessageStats,<span class="hljs-number">1</span>)
				<span class="hljs-keyword">set</span>:<span class="hljs-built_in">$lv</span>(MessageStats) newComp.MessageAVGProcessingMilliseconds=<span class="hljs-built_in">$lg</span>(MessageStats,<span class="hljs-number">2</span>)
				
				<span class="hljs-keyword">set</span> newComp.JobsStatus=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Data.JobStatus"</span>,<span class="hljs-string">"BuildPropertyFromList"</span>,<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentJobs"</span>,currComp,currNameSpace))
				<span class="hljs-keyword">set</span> newComp.Errors=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Data.Log"</span>,<span class="hljs-string">"BuildPropertyFromList"</span>,<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentErrors"</span>,currComp,ZeroTimeStamp,currNameSpace))
				<span class="hljs-keyword">set</span> newComp.Warnings=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Data.Log"</span>,<span class="hljs-string">"BuildPropertyFromList"</span>,<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentWarnings"</span>,currComp,ZeroTimeStamp,currNameSpace))
				<span class="hljs-keyword">set</span> newComp.Alerts=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Data.Log"</span>,<span class="hljs-string">"BuildPropertyFromList"</span>,<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentAlerts"</span>,currComp,ZeroTimeStamp,currNameSpace))
				
				<span class="hljs-keyword">do</span> newProd.Components.Insert(newComp)
			}
			
			
			<span class="hljs-keyword">set</span> newProdJSONStr=<span class="hljs-string">""</span>
			<span class="hljs-keyword">do</span> newProd.<span class="hljs-built_in">%JSONExportToString</span>(.newProdJSONStr)
			<span class="hljs-keyword">set</span> newProdJSON={}.<span class="hljs-built_in">%FromJSON</span>(newProdJSONStr)
			<span class="hljs-keyword">do</span>:newProdJSON'=<span class="hljs-string">""</span> productionObjectList.<span class="hljs-built_in">%Push</span>(newProdJSON)
			}
		}
	
	<span class="hljs-keyword">do</span> targetDocument.<span class="hljs-built_in">%Set</span>(<span class="hljs-string">"ProductionList"</span>,productionObjectList)
	<span class="hljs-keyword">if</span> (<span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%DocDB.Database</span>).xNExists(packageName_<span class="hljs-string">".DB.ProdEyeDocument"</span>)){
		<span class="hljs-keyword">set</span> db=<span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%DocDB.Database</span>).<span class="hljs-built_in">%GetDatabase</span>(packageName_<span class="hljs-string">".DB.ProdEyeDocument"</span>)
	} <span class="hljs-keyword">else</span> {
		<span class="hljs-keyword">set</span> db= <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%DocDB.Database</span>).<span class="hljs-built_in">%CreateDatabase</span>(<span class="hljs-string">"ProdEye.DB.ProdEyeDocument"</span>)
		<span class="hljs-keyword">do</span> db.<span class="hljs-built_in">%CreateProperty</span>(<span class="hljs-string">"TimeOfQueryIdx"</span>,<span class="hljs-string">"%Integer"</span>,<span class="hljs-string">"$.TimeOFQueryIdx"</span>,<span class="hljs-number">0</span>)
		}
	<span class="hljs-keyword">set</span> nwRecord=db.<span class="hljs-built_in">%SaveDocument</span>(targetDocument)
	
	<span class="hljs-keyword">if</span> <span class="hljs-built_in">$$$ISERR</span>(nwRecord){<span class="hljs-built_in">$$$ThrowStatus</span>(nwRecord)}
	
	<span class="hljs-keyword">set</span> nwRecord.ProfileName=<span class="hljs-built_in">$get</span>(<span class="hljs-symbol">^ProdEyeProfileName</span>(<span class="hljs-number">0</span>))
	<span class="hljs-keyword">set</span> nwRecord.TimeOfQueryIdx=targetDocument.TimeOfQueryIdx
	<span class="hljs-keyword">do</span> nwRecord.<span class="hljs-built_in">%Save</span>()
	
	<span class="hljs-keyword">return</span> <span class="hljs-built_in">$$$OK</span>
} <span class="hljs-keyword">catch</span> error {
	<span class="hljs-keyword">do</span> BACK<span class="hljs-symbol">^%ETN</span>
	<span class="hljs-keyword">return</span> <span class="hljs-built_in">$$$ERROR</span>(<span class="hljs-string">"5001"</span>,error.AsStatus())
	}

}

}

agora, qualquer aplicativo externo para consumidores pode buscar os dados para verificar o status da produção, alertas, erros e avisos usando um serviço REST simples da InterSystems conforme a seguir

Include Ensemble

Class ProdEye.Prod.ProdEyeRest Extends EnsLib.REST.Service {

Property PageSize As%Integer [ InitialExpression = 10 ];Property TokenValidationURL As%String;Parameter SETTINGS = "PageSize,TokenValidationURL"; XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ] { <Routes> <Route Url="/getdata" Method="POST" Call="GetData"/> </Routes> }

Method GetData(pInput As%Library.AbstractStream, Output poutput As%Stream) As%Status { quit:'$IsObject(pInput) $$$OKquit:(pInput.SizeGet()=0) $$$OKset paramsObj={}.%FromJSON(pInput.Read()) set cutoff=paramsObj.cutoff set authorisation=paramsObj.Authorisation set profilename=paramsObj.profilename

<span class="hljs-built_in">$$$TRACE</span>(<span class="hljs-built_in">..Adapter</span>.IOAddr_<span class="hljs-string">" Profile "</span>_profilename_<span class="hljs-string">" cutoff parameter: "</span>_paramsObj.<span class="hljs-built_in">%ToJSON</span>())

<span class="hljs-keyword">if</span> ('<span class="hljs-built_in">..Authorise</span>(authorisation,<span class="hljs-built_in">..TokenValidationURL</span>)){
	<span class="hljs-keyword">do</span> poutput.<span class="hljs-keyword">Write</span>(<span class="hljs-string">"{""Error"":""Invalid Credentials""}"</span>)
	<span class="hljs-keyword">do</span> <span class="hljs-built_in">..ReportHttpStatusCode</span>(<span class="hljs-number">403</span>)
	 <span class="hljs-keyword">return</span> <span class="hljs-built_in">$$$OK</span>
}

<span class="hljs-keyword">if</span> ('<span class="hljs-built_in">..ValidateCutoff</span>(cutoff)){
	<span class="hljs-keyword">do</span> poutput.<span class="hljs-keyword">Write</span>(<span class="hljs-string">"{""Error"":""Invalid Request Parameters""}"</span>)
	<span class="hljs-keyword">do</span> <span class="hljs-built_in">..ReportHttpStatusCode</span>(<span class="hljs-number">400</span>)
	 <span class="hljs-keyword">return</span> <span class="hljs-built_in">$$$OK</span>
}


<span class="hljs-keyword">try</span>{
	<span class="hljs-keyword">set</span> packageName=<span class="hljs-built_in">$P</span>(<span class="hljs-built_in">$classname</span>(),<span class="hljs-string">"."</span>,<span class="hljs-number">1</span>)
	<span class="hljs-keyword">SET</span> db = <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%DocDB.Database</span>).<span class="hljs-built_in">%GetDatabase</span>(packageName_<span class="hljs-string">".DB.ProdEyeDocument"</span>)
	<span class="hljs-keyword">set</span> restriction=[]
	<span class="hljs-keyword">do</span> restriction.<span class="hljs-built_in">%Push</span>(<span class="hljs-string">"TimeOfQueryIdx"</span>)
	<span class="hljs-keyword">do</span> restriction.<span class="hljs-built_in">%Push</span>(cutoff)
	<span class="hljs-keyword">do</span> restriction.<span class="hljs-built_in">%Push</span>(<span class="hljs-string">"&gt;"</span>)
	
	<span class="hljs-keyword">do</span> restriction.<span class="hljs-built_in">%Push</span>(<span class="hljs-string">"ProfileName"</span>)
	<span class="hljs-keyword">do</span> restriction.<span class="hljs-built_in">%Push</span>(profilename)
	<span class="hljs-keyword">do</span> restriction.<span class="hljs-built_in">%Push</span>(<span class="hljs-string">"="</span>)
	
	<span class="hljs-keyword">SET</span> result = db.<span class="hljs-built_in">%FindDocuments</span>(restriction)
	
	<span class="hljs-keyword">if</span> ((<span class="hljs-built_in">$IsObject</span>(result))&amp;&amp;(<span class="hljs-built_in">$Isobject</span>(result.content))){
		<span class="hljs-keyword">set</span> resultPage={}
		<span class="hljs-keyword">set</span> resultPage.Next=<span class="hljs-number">0</span>
		<span class="hljs-keyword">set</span> resultList=[]
		
		<span class="hljs-keyword">set</span> iter=result.content.<span class="hljs-built_in">%GetIterator</span>()
		<span class="hljs-keyword">for</span> dx=<span class="hljs-number">1</span>:<span class="hljs-number">1</span>:<span class="hljs-built_in">..PageSize</span>{
			<span class="hljs-keyword">set</span> resultItem=iter.<span class="hljs-built_in">%GetNext</span>(.key,.resultItemvalue)
			<span class="hljs-keyword">if</span> <span class="hljs-built_in">$IsObject</span>(resultItemvalue){
				<span class="hljs-keyword">set</span> resultItemvalue={}.<span class="hljs-built_in">%FromJSON</span>(resultItemvalue.<span class="hljs-built_in">%Doc</span>)
				<span class="hljs-keyword">do</span> resultList.<span class="hljs-built_in">%Push</span>(resultItemvalue)
				<span class="hljs-keyword">set</span>:dx&gt;<span class="hljs-number">1</span> resultPage.Next=resultItemvalue.TimeOfQueryIdx
			}
			}
	<span class="hljs-keyword">set</span> resultPage.content=resultList
	
	
	<span class="hljs-keyword">do</span> poutput.<span class="hljs-keyword">Write</span>(resultPage.<span class="hljs-built_in">%ToJSON</span>())
	}<span class="hljs-keyword">else</span> {
		<span class="hljs-keyword">Throw</span> <span class="hljs-built_in">$$$ERROR</span>(<span class="hljs-string">"5001"</span>,<span class="hljs-string">"Error During Processing Data"</span>)
		}
} <span class="hljs-keyword">catch</span> error {
	<span class="hljs-keyword">do</span> poutput.<span class="hljs-keyword">Write</span>(<span class="hljs-string">"{""Error"":""Error During Processing Data : """</span>_error.AsSystemError()_<span class="hljs-string">""" ""}"</span>)
	<span class="hljs-keyword">do</span> <span class="hljs-built_in">..ReportHttpStatusCode</span>(<span class="hljs-number">500</span>)
	}

<span class="hljs-keyword">return</span> <span class="hljs-built_in">$$$OK</span>

}

ClassMethod ValidateCutoff(val As%String) As%Boolean { set sc=1quit:+val<=00quit:$l(+val)<50set valdt=$E(val,1,5)","$E(val,6,10)

<span class="hljs-keyword">try</span> {
	<span class="hljs-keyword">set</span> date=<span class="hljs-built_in">$zdt</span>(valdt)
	
}<span class="hljs-keyword">catch</span> err{
		
		<span class="hljs-keyword">set</span> sc=<span class="hljs-number">0</span>
	}

<span class="hljs-keyword">return</span> sc

}

ClassMethod Authorise(val As%String, TokenValidationURL As%String) As%Boolean { quit:$g(val)=""0if (TokenValidationURL=""){ set type=$P(val," ",1) set type=$zstrip($zstrip(type,"*c"),"<=>w") quit:$ZCVT(type,"L")'="basic"0set userpass=$P(val," ",2) set userpassDecoded=$system.Encryption.Base64Decode(userpass)

	<span class="hljs-keyword">set</span> user=<span class="hljs-built_in">$P</span>(userpassDecoded,<span class="hljs-string">":"</span>,<span class="hljs-number">1</span>)
	<span class="hljs-keyword">set</span> user=<span class="hljs-built_in">$zstrip</span>(<span class="hljs-built_in">$zstrip</span>(user,<span class="hljs-string">"*c"</span>),<span class="hljs-string">"&lt;=&gt;w"</span>)
	<span class="hljs-keyword">set</span> pass=<span class="hljs-built_in">$P</span>(userpassDecoded,<span class="hljs-string">":"</span>,<span class="hljs-number">2</span>)
	<span class="hljs-keyword">set</span> pass=<span class="hljs-built_in">$zstrip</span>(<span class="hljs-built_in">$zstrip</span>(pass,<span class="hljs-string">"*c"</span>),<span class="hljs-string">"&lt;=&gt;w"</span>)
	
	<span class="hljs-keyword">set</span> prodeyeUser=<span class="hljs-keyword">##class</span>(Ens.Config.Credentials).GetValue(<span class="hljs-string">"ProdEyeUser"</span>,<span class="hljs-string">"Username"</span>)
	<span class="hljs-keyword">set</span> prodeyePass=<span class="hljs-keyword">##class</span>(Ens.Config.Credentials).GetValue(<span class="hljs-string">"ProdEyeUser"</span>,<span class="hljs-string">"Password"</span>)
	
	<span class="hljs-keyword">return</span> ((prodeyeUser=user)&amp;&amp;(prodeyePass=pass))
}<span class="hljs-keyword">elseif</span>(TokenValidationURL'=<span class="hljs-string">""</span>){
	<span class="hljs-keyword">set</span> prodeyeAuthUser=<span class="hljs-keyword">##class</span>(Ens.Config.Credentials).GetValue(<span class="hljs-string">"ProdEyeAuthUser"</span>,<span class="hljs-string">"Username"</span>)
	<span class="hljs-keyword">set</span> prodeyeAuthPass=<span class="hljs-keyword">##class</span>(Ens.Config.Credentials).GetValue(<span class="hljs-string">"ProdEyeAuthUser"</span>,<span class="hljs-string">"Password"</span>)
	
	<span class="hljs-keyword">set</span> tokenVerificationRequest=<span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%Net.HttpRequest</span>).<span class="hljs-built_in">%New</span>()
	<span class="hljs-keyword">do</span> tokenVerificationRequest.SetHeader(<span class="hljs-string">"content-type"</span>,<span class="hljs-string">"application/json"</span>)
	<span class="hljs-keyword">do</span> tokenVerificationRequest.SetHeader(<span class="hljs-string">"Authorisation"</span>,<span class="hljs-string">"BASIC "</span>_<span class="hljs-built_in">$system</span>.Encryption.Base64Encode(prodeyeAuthUser_<span class="hljs-string">":"</span>_prodeyeAuthPass))
	<span class="hljs-keyword">set</span> token=<span class="hljs-built_in">$P</span>(val,<span class="hljs-string">" "</span>,<span class="hljs-number">2</span>)
	<span class="hljs-keyword">set</span> data={}
	<span class="hljs-keyword">set</span> data.Token=token
	<span class="hljs-keyword">do</span> tokenVerificationRequest.EntityBody.<span class="hljs-keyword">Write</span>(data.<span class="hljs-built_in">%ToJSON</span>())
	<span class="hljs-keyword">do</span> tokenVerificationRequest.Post(TokenValidationURL)
	
	<span class="hljs-keyword">set</span> response=tokenVerificationRequest.HttpResponse
	<span class="hljs-keyword">if</span> (<span class="hljs-built_in">$IsObject</span>(response) &amp;&amp; <span class="hljs-built_in">$IsObject</span>(response.Data) &amp;&amp; response.StatusCode=<span class="hljs-number">200</span> ){
		<span class="hljs-keyword">set</span> message=<span class="hljs-string">""</span> <span class="hljs-keyword">while</span> 'response.Data.AtEnd {<span class="hljs-keyword">set</span> message=message_response.Data.<span class="hljs-keyword">Read</span>(,.tSC) <span class="hljs-keyword">if</span> 'tSC <span class="hljs-keyword">quit</span>}
		<span class="hljs-keyword">set</span> responseMessage={}.<span class="hljs-built_in">%FromJSON</span>(message)
		<span class="hljs-keyword">if</span> (responseMessage.<span class="hljs-built_in">%IsDefined</span>(<span class="hljs-string">"IsValid"</span>) &amp;&amp; (responseMessage.IsValid=<span class="hljs-string">"1"</span>)){
			<span class="hljs-keyword">return</span> <span class="hljs-number">1</span>
		}<span class="hljs-keyword">else</span>{
			<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>
				}
	}<span class="hljs-keyword">else</span>{
		<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>
			}
	}

}

}

Um exemplo real de um aplicativo de consumo do caso de uso acima está disponível aqui no Open Exchange. É um aplicativo móvel desenvolvido em Dart para o framework Flutter.

Além disso, o DocDB expõe a API direta sobre todas as tabelas de documentos, descritas em detalhes aqui

A vantagem da funcionalidade do DocDB é tornar o desenvolvimento de APIs para compartilhamento de informações entre sistemas orientado pelo foco do caso de uso, rastreando e padronizando toda a serialização, staging e integração de dados ao mesmo tempo.