CX_WEB_SERVICE_MANAGER::SendRequest
184192
Beschreibung:
Diese Methode erwartet ein CX_HTTP_REQUEST Objekt, welches die Anfrage spezifiziert. SendRequest setzt weder beim Request-Objekt, noch beim Response-Objekt die Zeitstempel. GetTime liefert für beide Objekte nach SendRequest NULL, falls sie nicht vorher gesetzt wurden.
Sind im Request-Objekt Body-Parameter gesetzt (siehe SetParameter), dann wird versucht, diese im Request-Body zu senden (auch bei GET). Das klappt nur, wenn der Body (siehe SetBody/GetBody) leer ist und der Content-Type Header (siehe SetHeader/GetHeader) entweder nicht gesetzt, oder auf application/x-www-form-urlencoded oder auf multipart/form-data gesetzt ist. Wenn das alles zutrifft, dann werden die Body-Parameter immer mit dem Content-Type application/x-www-form-urlencoded im Body übertragen. Sollte der Content-Type auf multipart/form-data gesetzt sein, wird er entsprechend auf application/x-www-form-urlencoded gesetzt, da multipart/form-data momentan nicht unterstützt wird.
Es sollte grundsätzlich darauf geachtet werden, beim Übertragen von Daten, den korrekten Content-Type zu setzten, damit der Zielserver die Anfrage korrekt interpretieren kann. (Beispiel: JSON <-> application/json)
Alle Header und Parameter werden grundsätzlich in alphabetischer Reihenfolge gesendet.
232556 werden auch URLs mit dem morphit://-Protokoll unterstützt. Diese URLs folgen dem folgenden Schema:
morphit://webservice/path morphit://configId.webservice/path
diese Webservice-Anfragen werden von SendRequest intern in einen send_webservice_request-Serverbefehl umgewandelt und über den verbundenen MorphIT-Server direkt and die verantwortliche Webservice-Instanz gesendet. Hierzu muss der ClassiX-Prozess logischerweise mit einem MorphIT-Server verbunden sein, in welchem die Webservice-Schnittstelle aktiv ist.
Die folgende Tabelle enthält Statuscode, mit besonderer Bedeutung.
Statuscode | Bedeutung |
---|---|
200 | Anfrage Erfolgreich. |
301 & 302 | Die angefragte Resource liegt unter einer anderen URL (s. Location-Header). Weiterleitungen werden von CX_HTTP_REQUEST nicht automatisch weiterverfolgt. |
503 | Unter der Angegebenen URL ist kein Webserver erreichbar. |
444 | Der Server hat die Verbindung geschlossen, ohne zu antworten. |
999 | Der Server hat mit einem ungültigen Statuscode geantwortet. |
Wichtig: Dieser Aufruf kehrt erst zurück, wenn die Anfrage beantwortet wurde. Das hat zur Folge, dass hierüber keine Anfragen an den in der gleichen ClassiX-Instanz laufenden WebServer gesendet werden können. Das führt dazu, dass die InstantView-Verarbeitung stehen bleibt.
Code-Beispiel:
Quellcode einer HTML-Seite laden:
//Create request and set request URL
CreateTransObject(CX_HTTP_REQUEST) -> req
"http://www.google.de/" req Call(SetURL)
//Send request and await response
req GetManager(WEB_SERVICE) Call(SendRequest) -> rep
rep Call(GetStatus) 200 = if {
"Body: " rep Call(GetBody) + Attention //Display HTML-Body
}
Code-Beispiel:
Ein einfacher HTTP-Proxy:
{
Provider(jsonTools)
LocalVar(req,rep,json)
-> req
//Parse the request JSON
req Call(GetBody) jsonTools::JsonParser -> json
//Create proxy request and set the new url
CreateTransObject(CX_HTTP_REQUEST) -> proxyReq
json Copy(ur
//Send Request to proxy and save repsonse
proxyReq GetManager(WEB_SERVICE) Call(SendRequest) -> res //Response for proxy request is on stack
"Transfer-Encoding" NULL res Call(SetHeader) //Remove this header if set, beause it causes problems for some clients
res ReturnStack //Forward proxy response to original requestor
Um nun http://www.google.de/ aufzurufen, müsste folgende Anfrage an ClassiX geschickt werden:
Host: localhost
Content-Type: application/json
Content-Length: 31
{"ur
Stack | Position | Objekttyp | Kurzbeschreibung |
---|---|---|---|
Stack(In) | Top | CX_HTTP_REQUEST |
Die Anfrage, die gesendet werden soll |
Stack(Out) | Top | CX_HTTP_RESPONSE | Die Antwort vom Server |