You can definitely do the OAuth requests using basic HTTP calls.

Doing it in OnInit won't work because the token you receive has an expiration time.

You'll need to:
- For every message your Operation receives you'll need to check if the cached token's expiration time has passed (or if there's no cached token).
- If you need a new token, do your POST call to get a new token and cache it.

Here's a working example based on Craig's original sample. It sends a request with 3 mime parts: a form variable with a value, an XML file, and a PDF file loaded from disk.

    set tURL="http://some.url/path/to/upload"

    set tHttpRequest = ##class(%Net.HttpRequest).%New()    
    
    // ----------------------------------------
    // Instantiate reportId MIME Part
    Set reportId = ##class(%Net.MIMEPart).%New()

    // Define/Set the Content-Disposition header indicating how this MIME part is encoded and what it contains.
    // Final string looks like: form-data; name="reportId"
    S tContentDisp = "form-data; name="_$CHAR(34)_"reportId"_$CHAR(34)
    Do reportId.SetHeader("Content-Disposition", tContentDisp)

    // Write the reportId to the MIME Part body.
    Set reportId.Body = ##class(%GlobalCharacterStream).%New()
    Do reportId.Body.Write("RptID12345")
    
    // ----------------------------------------    
    // Instantiate file1 (XML Doc) MIME Part
    
    Set file1 = ##class(%Net.MIMEPart).%New()

    // Define/Set the Content-Disposition header indicating how this MIME part is encoded and what it contains.
    // Final string looks like: form-data; name="file1"; filename="<pRequest.CaseNumber>.xml"
    S tContentDisp = "form-data; name="_$CHAR(34)_"file1"_$CHAR(34)_"; filename="_$CHAR(34)_"xmlfile.xml"_$CHAR(34)
    Do file1.SetHeader("Content-Disposition", tContentDisp)

    // Write XML to the MIME Part body.
    Set file1.Body = ##class(%GlobalCharacterStream).%New()
    Set file1.ContentType = "application/xml"
    do file1.Body.Write("<myXML><element1>value</element1></myXML>")
    
    
    // ----------------------------------------
    // Instantiate file1 (PDF Report) MIME Part
    Set file2 = ##class(%Net.MIMEPart).%New()

    // Define/Set the Content-Disposition header indicating how this MIME part is encoded and what it contains.
    // Final string looks like: form-data; name="file1"; filename="<pRequest.CaseNumber>.xml"
    S tContentDisp = "form-data; name="_$CHAR(34)_"file2"_$CHAR(34)_"; filename="_$CHAR(34)_"PDFFile.pdf"_$CHAR(34)
    Do file2.SetHeader("Content-Disposition", tContentDisp)

    // Get the content for the PDF file
    set tFile=##class(%Stream.FileBinary).%New()
    do tFile.LinkToFile("C:\Projects\test.pdf")

    // Write PDF content to the MIME Part body.
    Set file2.Body = ##class(%GlobalBinaryStream).%New()
    Set file2.ContentType = "application/pdf"
    do file2.Body.CopyFrom(tFile)


    // ----------------------------------------
    // Pack everything up and send the request

    // Package sub-MIME Parts into Root MIME Part
    Set rootMIME = ##class(%Net.MIMEPart).%New()
    Do rootMIME.Parts.Insert(reportId)
    Do rootMIME.Parts.Insert(file1)
    Do rootMIME.Parts.Insert(file2)
    
    
    // Write out Root MIME Element (containing sub-MIME parts) to HTTP Request Body.
    Set writer = ##class(%Net.MIMEWriter).%New()
    Set sc = writer.OutputToStream(tHttpRequest.EntityBody)
    if $$$ISERR(sc) {do $SYSTEM.Status.DisplayError(sc) Quit}
    Set sc = writer.WriteMIMEBody(rootMIME)
    if $$$ISERR(sc) {do $SYSTEM.Status.DisplayError(sc) Quit}
    
    
    // Specify the Content-Type and Root MIME Part Boundary (required for multipart/form-data encoding.)
    Set tContentType = "multipart/form-data; boundary="_rootMIME.Boundary
    Set tSC = tHttpRequest.SetHeader("Content-Type",tContentType)

    // Call SendFormDataArray method in the adapter to execute POST. Response contained in tHttpResponse
    Set tSC=tHttpRequest.Post(tURL)
    
    If $$$ISERR(tSC) {
        // Oops, an error. Do something    
    }

You can use %Stream.FileBinary to create a file-based stream and then copy the contents from the %CSP.BinaryStream to it.

  Set stream=##class(%Stream.FileBinary).%New()
  Set sc=stream.LinkToFile("c:\myfile.txt")
  Set sc=stream.CopyFromAndSave(myCSPBinaryStream)

Yone, try removing this line and test if it works:

Set pOutput=##class(%GlobalBinaryStream).%New()

In Studio, go to File -> Change Namespace


In the Cache Connection Manager window, click "Connect"


In the Server Connection window, select the same server and click "OK"


Here you can untick "Remember Password" and login again

You were on the right track with %WriteJSONFromObject(), but you'll want to use %WriteJSONStreamFromObject() instead. I don't see what purpose the Body property in your request class serves. You can just create a stream object variable instead.

set myTempStream=##class(%Stream.GlobalCharacter).%New()
set tSC=##class("%ZEN.Auxiliary.altJSONProvider").%WriteJSONStreamFromObject(.myTempStream, pRequest)
if $$$ISERR(tSC) {
    quit tSC
}

...then later:

Set tSC=..Adapter.PostURL(tURL,.tHttpResponse, , myTempStream)