AppConnector (OSRest) runscript

Hallo Joachim (@jowin),

du hattest mir gestern kurz eine Mail geschrieben mit der Frage wie RunScripts via /session/runscript aus dem Webclient heraus auslösen kann und das Ergebnis als Json erhält.

Falls Ihr enaio >= 9.00SP1 verwendet, dann würde ich prinzipiellauf den EmptyJob setzen der besser hierfür geeignet ist.

Diesen Job kannst du per AppConnector mit Parametern aufrufen und erhältst die Rückgabeparameter als Json zurück.

Beispiel

KernelAfterJob::krn:EmptyJob anlegen

Als erstes musst du den Server Event KernelAfterJob::krn:EmptyJob anlegen.
grafik

Der Event ist im Prinzip identisch zum RunScript Event aufgebaut. Das bedeutet, dass du eine Main Funktion hinterlegen musst und das Global RC Objekt (RunningContext) zur Verfügung steht.
Mehr Infos liefert hier Optimal Systems in ihrer Dokumentation zum Serverskripting.

Die wichtigen Eigenschaften der RC sind hier die InputParams und OutputParams.
In den InputParams erhältst du die Eingangsparameter aus dem Aufruf. Mit den OutputParams kannst du Parameter zurück geben.

Beispiel

Dieses Beispiel kopiert einfach die Eingangsparameter in die Ausgangsparameter.

Function Main
	Dim InputNames: InputNames = RC.InputParams.Names
	Dim NameArray: NameArray = Split(InputNames,";",-1,1)
	For i = LBound(NameArray) to UBound(NameArray)
		Name = NameArray(i)
		Param = RC.InputParams.Value(Name)
		RC.OutputParams.Value(Name) = Param
	Next
End Function

Webclient Event

Als nächstes kannst du diese Event per Javascript (in meinem Fall einen OnClickItem Event auf einen Button) den Endpunkt per Post aufrufen.

Beispiel

var parameter = {
	"param1":"text",
	"param2": 5
};

var xhr = new XMLHttpRequest();
xhr.open('POST', '/osrest/api/core/emptyJob', true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
	    response = JSON.parse(xhr.responseText);
	    alert(xhr.responseText);  
    }
};
xhr.send(JSON.stringify(parameter));

Ergebnis

grafik

In meinem Fall kommt hier neben den Eingangsparametern auch der $$$SwitchContextUserName$$$ mit welcher aber vom AppConnector gesetzt wird.

2 „Gefällt mir“

Hallo Ulrich,
erst mal vielen Dank für die Infos.

Hatte bereits nach Deiner Info mal die RC.OutputParams.Value(„Message“) = „Hello“ gesetzt
und funktioniert . (Was ja mein Anliegen war)

Leider bekomme ich aber keine InputNames = RC.InputParams.Names . obwohl anscheinend übergeben…
CNameSpace::DispatchJob, namespace.cpp, axsvckrn (9.0 SP1 802); params: szName = krn.RunScript; Parameters = $$$SwitchContextUserName$$$=Winkler;@par1=wert1
Sieht für mich nach einem Bug aus in /session/runscript

Dann werde ich mal den EmptyJob testen…
core/emptyJob

Grüsse Joachim

1 „Gefällt mir“

Hallo Ulrich
bei core/emptyJob funktioniert es . Besten Dank
Grüsse Joachim

Hallo Joachim,

das freut mich. Schade dass der RunScript hier anscheinend nicht sauber funktioniert.
Wenn du andere Punkte hast, dann schreibe gerne hier.

Grüsse Uli

Noch ein kleiner Update:
Wenn man den Internet Explorer nicht unterstützen muss, dann kann man auch die neuere FETCH API verwenden.

var data = {
	"param1":"text",
	"param2": 5
};

let fetchData = {
  method: 'POST',
  body: JSON.stringify(data),
  headers: new Headers({'Content-Type': 'application/json'})
}

fetch(`${window.location.baseUrl}/osrest/api/core/emptyJob`, fetchData)
.then((response) => {
	alert("done");
    result = response.json();
    })
.catch((error) => {
  console.error('Error:', error);
});

Update: in der ersten Version war leider ein Typo drin

Hier habe ich basierend auf @uw freundlichen Beispiels noch eine andere Lösung:

Mit diesem Beispiel kann über eine Senden-An-Anwendung (realisiert als einfaches VBScript) ein Objekt an einen krn.EmptyJob kommuniziert werden und dort die Metadaten mit den Server-Rechten ein sonst schreibgeschütztes Objekt bearbeitet werden.

1 „Gefällt mir“