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")

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.

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:

  1. Set up a way to send valid requests
  2. Send request via Caché/Ensemble
  3. Compare (DiffDog, etc) requests from 1 and 2, here you need to:
    • Modify valid request till it fails
    • Modify invalid request  till it succeeds

In your case the first modification I would do is replacing dates with real dates, for example with 2014-01-11.

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:

  1. Add this info to BP-BO message.
  2. You have BP-BO header, use it, SessionId and BusinessProcessId to locate  BS-BP header in the header table.
  3. 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).

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.

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.

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.

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
}

}