File Specs for services support wildcards, but not the complex time stamp specifications that are used for outputting filenames from an operation.

File Spec
Filename or wildcard file specification for file(s) to retrieve. For the wildcard specification, use the convention that is appropriate for the operating system on the local InterSystems IRIS Interoperability machine.

https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.c...

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    
    }

A visual trace URL takes the form of:

EnsPortal.VisualTrace.zen?SESSIONID=12818

You'll need to run some queries (once in the router namespace and once in the edge namespace) to find the session ID that corresponds to your control ID.

You can find messages with that control id by querying the search table.

First you need to get the search table property ID for the MSHControlID. Change the value of ClassExtent to match whatever your local search table class is if you're not using the default:

SELECT PropId from Ens_Config.SearchTableProp WHERE ClassExtent='EnsLib.HL7.SearchTable' AND Name='MSHControlID'

Let's say that returns a PropId of 1

You can then query the search table for the control ID you're looking for where PropValue is the control id. If you have a custom search table you'll need to use your custom table name here instead of the default EnsLib_HL7.SearchTable:

SELECT DocId FROM EnsLib_HL7.SearchTable WHERE PropId=1 AND PropValue='123456789'

This gives you the ID for the message body. Let's say it returned a DocId of 98765. You can then query the message header table to get the session ID that that message body belongs to:

SELECT DISTINCT(SessionId)
FROM Ens.MessageHeader WHERE MessageBodyID = 98765

Keep in mind that the URL for the Visual Trace could change in future versions, so you're doing this at your own risk.

Currently the most common approach for creating a web application/page which sources data from IRIS is to use one of the popular client side web application frameworks such as Angular, React, or vue.js. In IRIS you would build a web service which your app would call to get data.

Creating REST Services
https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GREST