Lo de pasar los datos “vía PHP” es lo que me suena muy raro. Si quieres migrar los datos de una BD a la otra se me ocurren mil mejores formas que con PHP. Si lo que necesitas es conectarte a Caché para recuperar información a una pantalla de PHP y luego moverla a MySQL. El problema se reduce a conectar PHP a Caché. Mírate este proyecto de código abierto: https://github.com/chrisemunt/mg_php

Chicos y chicas aprovechad esta oportunidad para certificarse. Paso 1: REGISTRARSE en el VS2020

Hay tiempo de preparar el examen ya que se puede realizar online en cualquier momento hasta el 31 de Diciembre.

¿Qué os parece si hacemos una serie de webinars explicando los contenidos como preparación para el examen?

Glup, eso no me lo esperaba!!... tendría que mirar desde cuándo está el JSON Adaptor

Pero para tu problema eso va a dar igual, me explico. El parámetro "jsonObject" es el que utiliza esa clase %JSON.Adaptor pero esa clase lo único que hace es ayudarte a manejar objetos JSON. Para resolver tu problema inicial en lugar de usar esa clase utiliza como tu dices un Stream. Por ejemplo el %Stream.GlobalCharacter.

Esta sentencia:

set tSC=..PostJSON(tURL,.tHttpResponse,pRequest.orden)

Lo que hace es pasar la URL, el objeto donde se va a colocar la respuesta a la vuelta (por referencia) y el contenido del mensaje pRequest. En este caso puedes inventarte un objeto tuyo que lleve un Stream con un JSON en texto plano para probar.

En este método:

Method PostJSON(pURL As %String, Output pHttpResponse As %Net.HttpResponse, pStream As %Stream.GlobalCharacter) As %Status 
{
  Return ..SendHTTP("POST",pURL,.pHttpResponse,pStream) 
}

cambia la firma del método para usar el Stream. Y finalmente en este método envía el contenido como Body de la llamada HTTP.

Method SendHTTP(pHttpVerb As %String, pURL As %String, Output pHttpResponse As %Net.HttpResponse, pStream As %Stream.GlobalCharacter) As %Status 
{  
set httpRequest = ##class(%Net.HttpRequest).%New()     
set httpRequest.ContentType = "application/json"     
if $IsObject(jsonObject) {         
  set tSC=httpRequest.EntityBody.CopyFrom(pStream)
  if $$$ISERR(tSC)
    quit tSC     
}
set tSC = ..Adapter.SendFormDataURL(pURL,.pHttpResponse,pHttpVerb,httpRequest)     
quit tSC 
}

No lo he probado. Creo que el uso del método CopyFrom es correcto pero si te falla es fácil copiar el contenido de un Stream a otro mediante Write y Read.

Espero que te sirva. 

Para empezar veo que estás creando una clase Adaptador que hereda de Test.BO.Adapter.HTTPOutboundAdapter. Eso no es una Operación. Es un adaptador.

Y la verdad no veo dónde estás metiendo los datos del Body... quizá hay más código

Yo mejor haría una operación que herede de EnsLib.REST.Operation.

Ejemplo:

Class demo.bo.RESTOperation Extends EnsLib.REST.Operation
{

Parameter INVOCATION = "Queue";

Method SendHTTP(pHttpVerb As %String, pURL As %String, Output pHttpResponse As %Net.HttpResponse, jsonObject As %JSON.Adaptor) As %Status
{
    set httpRequest = ##class(%Net.HttpRequest).%New()
    set httpRequest.ContentType = "application/json"
    if $IsObject(jsonObject) {
        set tSC=jsonObject.%JSONExportToStream(httpRequest.EntityBody)
        if $$$ISERR(tSC) quit tSC
    }  
    set tSC = ..Adapter.SendFormDataURL(pURL,.pHttpResponse,pHttpVerb,httpRequest)
    quit tSC
}

Method PostJSON(pURL As %String, Output pHttpResponse As %Net.HttpResponse, jsonObject As %JSON.Adaptor) As %Status
{
    Return ..SendHTTP("POST",pURL,.pHttpResponse,jsonObject)
} 

Method OnPostRequest(pRequest As demo.PostRequest, Output pResponse As demo.PostResponse) As %Status
{
    set tURL=..Adapter.URL_"/demo"
    set tSC=..PostJSON(tURL,.tHttpResponse,pRequest.orden)
    if $$$ISERR(tSC)&&$IsObject(tHttpResponse)&&$IsObject(tHttpResponse.Data)&&tHttpResponse.Data.Size {
        set tSC=$$$ERROR($$$EnsErrGeneral,$$$StatusDisplayString(tSC)_":"_tHttpResponse.Data.Read())
    }
    if $$$ISERR(tSC) quit tSC
    // procesar respuesta
    set pResponse = ##class(demo.msg.PostResponse).%New()
    set pResponse.respuesta = ##class(demo.msg.Respuesta).%New()
    if tHttpResponse.StatusCode=200 {
        $$$TRACE(tHttpResponse.Data.Read())
        set tSC = pResponse.respuesta.%JSONImport(tHttpResponse.Data)
    } else { 
        set tSC=$$$ERROR($$$EnsErrGeneral,"HTTP Status:"_tHttpResponse.StatusCode)
    }
    quit tSC
}



XData MessageMap
{
<MapItems>
    <MapItem MessageType="demo.PostRequest"> 
        <Method>OnPostRequest</Method>
    </MapItem>
</MapItems>
}

}

Para ver los flags de compilación disponibles:

USER>Do $system.OBJ.ShowFlags()

 See $system.OBJ.ShowQualifiers() for comprehensive list of qualifiers as flags have been superseded by qualifiers

    b - Include sub classes.
    c - Compile. Compile the class definition(s) after loading.
    d - Display. This flag is set by default.
    e - Delete extent.
    h - Show hidden classes.
    i - Validate XML export format against schema on Load.
    k - Keep source.  When this flag is set, source code of
        generated routines will be kept.
    l - Lock classes while compiling.  This flag is set by default.
    p - Percent.  Include classes with names of the form %*.
    r - Recursive.  Compile all the classes that are dependency predecessors.
    s - Process system messages or application messages.
    u - Update only.  Skip compilation of classes that are already up-to-date.
    y - Include classes that are related to the current class in the way that
        they either reference to or are referenced by the current class in SQL usage.

These flags are deprecated a, f, g, n, o, q, v
Default flags for this namespace 
You may change the default flags with the SetFlags(flags,system) classmethod.

Hola Mathew,

Siempre se puede hacer una clase que herede de %Persistent y que exponga los métodos que quieras para guardar por ejemplo. Internamente allí puedes crear tu Callback y luego llamar al %Save.

Algo así como:

Class MiPersistente Extends %Persistent {

Method OnGuardar() {
}

Method Guardar() {
  ..OnGuardar()
  ..%Save()
}
}

Luego en lugar de heredar de %Persistent heredas de esta clase y sobre escribes el Callback.

No lo he probado pero es una alternativa a investigar

Gracias