| Web services / Server | |
In high level web services, we now give access to the HTTP headers request and response.
The web service can get information from the request headers and reply with custom headers and status.
DEFINE http_in RECORD verb STRING, url STRING, headers DYNAMIC ARRAY OF RECORD name STRING, value STRING END RECORD END RECORDAfter the web service operation has been processed, the variable is set to NULL.
DEFINE http_out RECORD code INTEGER, desc STRING, headers DYNAMIC ARRAY OF RECORD name STRING, value STRING END RECORD END RECORDAfter the web service operation has been processed, the variable is set to NULL.
The web service engine headers have precedence. For example, if you set the "Content-Length" value, the one that is taken into account is the one defined by the Genero Web Services engine.
FUNCTION CreateService()
  DEFINE serv com.WebService     # WebService
  DEFINE op com.WebOperation     # Operation of a WebService
  TRY
    #
    # Create a Web Service
    #
 
    LET serv = com.WebService.CreateWebService("EchoHttpHeadersService",
 Namespace) 
 
    #
    # Create Document Style Operations
    # 
      
    # EchoDOCRecord
    LET op = com.WebOperation.CreateDOCStyle("echoDocRecord",
"EchoDOCRecord",echoRecordDoc_in,echoRecordDoc_out)
    CALL serv.publishOperation(op,NULL)
 
    # Register HTTP input
    CALL serv.registerInputHttpVariable(http_in)
    
    # Register HTTP output
    CALL serv.registerOutputHttpVariable(http_out)
    
    #
    # Register service
    #
  
    CALL com.WebServiceEngine.RegisterService(serv) 
    DISPLAY "EchoHttpHeadersService Service registered" 
  CATCH 
    DISPLAY "Unable to create 'EchoHttpHeadersService' Web Service :
",STATUS||" ("||SQLCA.SQLERRM||")"
    EXIT PROGRAM (-1) 
  END TRY    
END FUNCTION 
FUNCTION echoDocRecord() 
  DEFINE  ind INTEGER 
  DEFINE  ok  BOOLEAN
 
  # Check incoming VERB
  IF http_in.verb != "POST" THEN
    LET http_out.code = 400
    LET http_out.desc = "Bad request: method should be POST"
    RETURN 
  END IF 
  # Check incoming query string 
  IF http_in.url.getIndexOF("?MyQuery=OK",1)<=0 THEN
    LET http_out.code = 400
    LET http_out.desc = "Bad request: URL should have MyQuery=OK"
    RETURN 
  END IF 
  # Check incoming header called MyPersonal 
  LET ok = FALSE 
  FOR ind = 1 TO http_in.headers.getLength()
    DISPLAY ind||"# ",http_in.headers[ind].name,
"=",http_in.headers[ind].value
    IF http_in.headers[ind].name == "MyPersonal" THEN
      IF http_in.headers[ind].value == "Header" THEN     
        LET ok = TRUE   
      END IF
    END IF 
  END FOR 
  IF NOT ok THEN
    LET http_out.code = 400
    LET http_out.desc =
 "Bad request: expected additional header called MyPersonal"
    RETURN 
  END IF 
  # assign the output record 
  LET echoRecordDoc_out.MyRecord.MyInt =
 echoRecordDoc_in.MyRecord.MyInt 
  LET echoRecordDoc_out.MyRecord.MyFloat =
 echoRecordDoc_in.MyRecord.MyFloat 
  # Add MyPersonalHeader=MyPersonalValue http headers 
  LET http_out.headers[1].name = "MyPersonalHeader" 
  LET http_out.headers[1].value = "MyPersonalValue"
END FUNCTION