Lade...
 

CX_WEB_SERVICE_MANAGER::SendRequest

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:

Var(req,rep)
//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:

HTTP_PROXY_GET:
{
  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(url) proxyReq Call(SetURL)

  //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:

GET /HTTP_PROXY HTTP/1.1
Host: localhost
Content-Type: application/json
Content-Length: 31

{"url":"http://www.google.de/"}
Stack
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
Funktionsaufruf: Call(SendRequest)