go to post Eduard Lebedyuk · Jan 17, 2018 Got it. Usually after enabling HTTPS I add server-wide redirect from HTTP to HTTPS. So in cube I specify port 80 and it automatically redirects to HTTPS.
go to post Eduard Lebedyuk · Jan 17, 2018 If Caché does not work through IIS, you need to configure it. On Windows you can configure Caché to work with IIS, Apache or Nginx.After you have configured the web server to work with Caché, add https support. For example use Let's encrypt as a CA.
go to post Eduard Lebedyuk · Jan 17, 2018 You can use DATEPART function: w $SYSTEM.SQL.DATEPART("year", $h) >2018 w $SYSTEM.SQL.DATEPART("month", $h) >1 The advantage of this approach is more readable code.
go to post Eduard Lebedyuk · Jan 17, 2018 Learning.intersystems.com has a lot of courses you can access for free. They start right from the basics.
go to post Eduard Lebedyuk · Jan 17, 2018 while i was using your code, i am getting this error in response, which says "read" method is unknownYou're getting this error because list of objects does not have this method. Check your list of objects for contents. Seems like json is already converted so you don't need to do that.
go to post Eduard Lebedyuk · Jan 17, 2018 What do you mean?If you have month and year just add 01 and produce the date.
go to post Eduard Lebedyuk · Jan 16, 2018 For SQL, use LAST_DAY function - it's a date function that returns the date of the last day of the month for a date expression: SELECT LAST_DAY('2004-02-25') It's also available in Caché ObjectScript: Write $SYSTEM.SQL.LASTDAY("2004-02-25")
go to post Eduard Lebedyuk · Jan 16, 2018 Convert json to proxy object (list of in your case) and iterate over it set json = "[{""Name"":""bat""},{""Name"":""Cat""},{""Name"":""rat""},{""Name"":""mat""},{""Name"":""hat""},{""Name"":""chat""},{""Name"":""please""},{""Name"":""help""},{""Name"":""me""},{""Name"":""in""},{""Name"":""getting""},{""Name"":""the""},{""Name"":""value""},{""Name"":""of""},{""Name"":""nameFromObjectInsideArray""}]" set sc = ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(json,,.obj,1) for i=1:1:obj.Count() { write obj.GetAt(i).Name,! } To get json string from request: set json = %request.Content.Read($$$MaxStringLength) You may also need to convert request into UTF8: set json = $ZCVT(json,"I","UTF8")
go to post Eduard Lebedyuk · Jan 16, 2018 Sorry I'm lost here. and not sure what you in 1,2 or 3 !? It's an iterative process to pinpoint and remove errors. You start by establishing a channel which can send valid requests. For example using Postman. Next you compare valid request (which you can now consistently send) with your request which does not pass. Next you iteratively break valid request or fix failed request or send failed request via Postman. Sooner or later you understand what causes your request to fail and fix that. the other difference is that Now they also require a Header, before they they only had a Body in their API. You need to add all required headers via SetHeader method. I think my date is already like that!? do you mean removing the double quotes or changing it to YYYY-DD-MM? You're sending: "PaymentRecordTransactionD":"PaymentRecordTransactionD" But API expects: PaymentRecordTransactionD": "2014-12-31" Looks different for me.
go to post Eduard Lebedyuk · Jan 16, 2018 The error says parse error, but in this case I think it means either datatype validation (probably) or fixed property order (less probable, but that can actually happen). My default advice in cases like this is as follows:Set up a way to send valid requestsSend request via Caché/EnsembleCompare (DiffDog, etc) requests from 1 and 2, here you need to:Modify valid request till it failsModify invalid request till it succeedsIn your case the first modification I would do is replacing dates with real dates, for example with 2014-01-11.
go to post Eduard Lebedyuk · Jan 15, 2018 Doubtful. Web browsers security policies probably forbid this kind of thing.Why do you need that?
go to post Eduard Lebedyuk · Jan 15, 2018 Well, yes, it returns the sender of the message. If you're sending message from BS to BO directly sender would be BS. If you're sending BS-BP-BO, for BO the sender would be BP because it is.If you want to get BS from BO in BS-BP-BO you can implement it via several approaches:Add this info to BP-BO message.You have BP-BO header, use it, SessionId and BusinessProcessId to locate BS-BP header in the header table.If you have unique identifier for BP-BO message and you know it in BS you can store this information during BS processing (to a temp holder class) and then retrieve it from BO by the identifier. I'd like to add that second approach without careful planning and optimizing may negatively impact performance if stored messages are in millions. Starting new SessionId for each new message sent from BS may help. (because BS MessageId would then be equal to SessionId in BO).
go to post Eduard Lebedyuk · Jan 15, 2018 Use %RequestHeader property instead: Set tSrcCfg = ..%RequestHeader.SourceConfigName
go to post Eduard Lebedyuk · Jan 12, 2018 I think that's for services only. They store information about processed rows in: these 2 globals $$$DoneRowTable(key) ^CacheTemp.Adapter.sqlrow(..BusinessHost.%ConfigName, ..%InstKey, key) Where DoneRowTable macro is resolved into ^Ens.AppData(..BusinessHost.%ConfigName, "adapter.sqlrow", key) You can check if there's anything for your BO. The globals are set in OnTask method of inbound adapter.
go to post Eduard Lebedyuk · Jan 12, 2018 What happens if you don't declare a Persistent value when you call ExecuteQuery()? What is " Persistent value"? What does Ensemble set as the key value for your query? What is "key value"? That said, if you execute the same query against external database, and the data in the external database does not change you should get the same results. After you finish working with resultset the first time (and before creating it a second time) you can call: Set sc = rs.Close() Maybe that would help.
go to post Eduard Lebedyuk · Jan 12, 2018 Some possible code improvements: 1. Instead of: s sc = httprequest.Post("http://127.0.0.1:57772/api/v0/bwxpert/visiocheck/account") it's enough to specify: s sc = httprequest.Post("/api/v0/bwxpert/visiocheck/account") as the rest of the address is defined beforehand. 2. Instead of: s httprequest.Authorization = "Basic X1N5c3RlbTpTWVM=" you can specify: s httprequest.Username = "_SYSTEM" s httprequest.Password = "SYS" Which is more readable 3. When specifying server, protocol in not required, incorrect even: s httprequest.Server="127.0.0.1" 4. Finally, don't use short syntax (s, d) and use one naming convention consistently - in your example some commands are in lowercase and some start with a capital letter.
go to post Eduard Lebedyuk · Jan 12, 2018 Private is not important in that case - it only affects from where method could be called. Private methods can be invoked only by methods of this class or its subclasses. The difference between class methods and instance methods is that instance methods can access object context. For example you can access current object property from instance methods. Use instance methods only when you need access to object context. In all other cases use class methods. Here's a sample code, highlighting the difference: Class Test.Person Extends %RegisteredObject { Property Name As %String; Method PrintName() { Write ..Name } ClassMethod PrintText(text) { Write text } }
go to post Eduard Lebedyuk · Jan 10, 2018 To pinpoint the error, please:Create app /csp/test with the same brokerRestart Caché and IISAfter that try to open:SMP: http://localhost/csp/sys/%25CSP.Portal.Home.zenYour old app: http:// localhost/myapi/checkYour new app: http:// localhost/csp/test/check