go to post Eduard Lebedyuk · Mar 21, 2021 Sorry, meant: Do ..Adapter.%Client.SetHttpHeader(name, value)
go to post Eduard Lebedyuk · Mar 17, 2021 If you want to know if a compiled class exists, call: write $$$comClassDefined(class) It, however, does not answer the question of a compiled version being current.
go to post Eduard Lebedyuk · Mar 16, 2021 How about a slightly different architecture: Create a table, visible in all namespaces called Requests - and from Data Source namespace add 1 row to it on every new message. Create a table, visible in all namespaces called Ack which contains {RequestId, Namespace, State} In each namespace create a Business Service which would: Poll Requests/Ack tables to get new unprocessed requests (no corresponding Ack record). If an unprocessed request is found create an Ack record and send a message in a local namespace for BP processing Maybe write a response after the message is processed (or do it in BP/ProxyBP/job) Advantage of this architecture is that you decouple processing on a namespace level - so if a production in one namespace is in error state/down the rest can proceed. It also eliminates a single point of failure in namespace switching job. tl;dr instead of pushing your event make consumers pull it whenever convenient.
go to post Eduard Lebedyuk · Mar 16, 2021 Supply them in $horolog format. In a case of YYYY-MM-DD, try: $zdateh("YYYY-MM-DD", 3)
go to post Eduard Lebedyuk · Mar 15, 2021 You can also just call: set jsoninput = {}.%FromJSON(dir) where dir is a filename.
go to post Eduard Lebedyuk · Mar 15, 2021 Use any of the Binary streams: %Stream.FileBinary - If you store files on disk %Stream.GlobalBinary - if you store files in globals To send a stream just fill EntityBody property of a request object by calling it's CopyFrom method.
go to post Eduard Lebedyuk · Mar 15, 2021 Interoperability (ex. Ensemble) can be used to both import data into InterSystems Data Platforms and push it to external systems.
go to post Eduard Lebedyuk · Mar 15, 2021 OnHandleCorsRequest is called automatically if a browser requests CORS. To add to original answer a bit: Do %response.SetHeader("Access-Control-Allow-Origin","*") This is OK for development but for production use you need to replace * with a hostname of your web site.
go to post Eduard Lebedyuk · Mar 10, 2021 Check this article. You'll need either HTTP Debugging proxy or Packet analyzer to debug this.
go to post Eduard Lebedyuk · Mar 9, 2021 You probably have a mismatched brackets somewhere. You can also try [].%FromJSON instead of {}.%FromJSON
go to post Eduard Lebedyuk · Mar 9, 2021 Your code has a bracket at the end: You might have erased it accidentally?
go to post Eduard Lebedyuk · Mar 9, 2021 If you're sure that there's only one object in response array, replace: Set tSC = pResponse.%JSONImport(tHttpResponse.Data.Read()) with: Set tSC = pResponse.%JSONImport({}.%FromJSON(tHttpResponse.Data).%Get(0)) It would parse your JSON stream into a dynamic JSON array (via {}.%FromJSON(tHttpResponse.Data)), get zeroth element from it (via %Get(0)), and pass it for JSON import (via pResponse.%JSONImport).
go to post Eduard Lebedyuk · Mar 9, 2021 If you're sure that there's only one object in response, replace: Set tSC = pResponse.%JSONImport(tHttpResponse.Data.Read()) with: Set tSC = pResponse.%JSONImport({}.%FromJSON(tHttpResponse.Data).%Get(0)) If you want to parse an entire array, you'll need another class: Class CDSM.ProviderAPI.Responses Extends (%Persistent, %JSON.Adaptor) { Property Responses As List Of CDSM.ProviderAPI.ProviderInfo; } And in this case replace this code: Set pResponse=##class(CDSM.ProviderAPI.Response).%New() Set tSC = pResponse.%JSONImport(tHttpResponse.Data.Read()) With: Set pResponse=##class(CDSM.ProviderAPI.Responses).%New() Set tSC = pResponse.%JSONImport(tHttpResponse.Data) and update the method signature too.
go to post Eduard Lebedyuk · Mar 9, 2021 Why would be better or recommended to use %CSP.REST directly, instead of EnsLib.REST.Service? To start with using %CSP.REST is the recommended way to use REST with productions. Are there any improvements if we use %CSP.REST? It's easier to develop, there are more examples available, you can have a combined production/non-production REST services easily.