Show TOC

HintergrundBeispielprogramm: Ausführung eines HTTP-Requests Dieses Dokument in der Navigationsstruktur finden

 

Das folgende ABAP-Programm führt einen HTTP-Request aus. Zu Testzwecken richtet sich der Aufruf an das sendende System selbst, d.h. der Application Server ABAP wird sowohl in der Client- als auch in der Serverrolle verwendet:

Achtung Achtung

Dieses Programm stellt ein vereinfachtes Beispiel dar, es handelt sich nicht um eine Vorlage für die professionelle Anwendung.

Ende der Warnung.

Syntax Syntax

  1. report HTTP_Test.
  2. * data declarations
  3.   data: client type ref to if_http_client.
Ende des Codes

Folgende Parameter müssen eingegeben werden:

Hinweis Hinweis

Wird nichts angegeben, werden Defaultwerte verwendet: Host (Defaultwert: der aktuelle Host), Service (Defaultwert: Port 80 für HTTP und 443 für HTTPS), Protokoll (Default HTTP/1.0), Pfad zu dem gewünschten Service, wie in Abschnitt Implementierung beschrieben (Default /sap/public/ping).

Ende des Hinweises.

Hinweis Hinweis

Wird bei der Erzeugung des Client-Objekts die Verbindung über die Destination (SM59) benutzt, müssen diese Parameter in der Destination gepflegt werden.

Ende des Hinweises.

Syntax Syntax

  1. data: host type string value = ‘host.wdf.sap-ag.de’,
  2.       service type string value = ‘8080’,
  3.       path type string value = '/sap/public/ping',
  4.       errortext type string. "used for error handling
Ende des Codes
Schritt 1

Nun wird das Objekt vom Typ CL_HTTP_CLIENT erzeugt. Hierzu gibt es 2 mögliche Vorgehensweisen:

  • Im einen Fall wird die create-Methode aufgerufen; hier müssen gewünschter Host und Port angegeben werden, des weiteren kann die Proxy-Einstellung festgelegt werden. Diese übersteuert eine eventuell in der Transaktion SICF vorgenommene Konfiguration (vgl. Proxy konfigurieren).

  • Im anderen Fall wird eine in der Transaktion SM59 gepflegte Destination verwendet (Methode create_by_destination). Hier müssen nur der Name der Destination sowie der Mandant angegeben werden. In beiden Fällen müssen Exceptions definiert werden (hier nicht gezeigt) und der letzte Fehlercode abgefragt werden.

    Hinweis Hinweis

    SAP empfiehlt die Verwendung einer festen Destination, da sich hierdurch der Aufwand für Konfiguration der Kommunikationsparameter verringert.

    Ende des Hinweises.

Anschließend kann über das Objekt Client auf alle Daten (Request, Response, Header-Felder, etc) zugegriffen werden.

Das Scheme bestimmt, ob HTTP oder HTTPS verwendet wird.

* create HTTP client object(s)

Syntax Syntax

  1. call method cl_http_client=>create
  2.  exporting host  = host_str
  3.    service       = service_str
  4.    proxy_host    = proxy_host
  5.    proxy_service = proxy_service
  6.    scheme        = scheme
  7.  importing client  = client
  8. exceptions
  9.          argument_not_found = 1
  10.          internal_error     = 2
  11.          plugin_not_active  = 3
  12.          others             = 4.
Ende des Codes

Syntax Syntax

  1. call method cl_http_client=>create_by_destination
  2.   exporting destination = dest
  3.   importing client      = client
  4. exceptions
  5.         destination_not_found    = 1
  6.         internal_error           = 2
  7.         argument_not_found       = 3
  8.         destination_no_authority = 4
  9.         plugin_not_active        = 5
  10.         others                   = 6.
Ende des Codes

Syntax Syntax

  1. if sy-subrc <>0. 
  2.   write: / ‘Create failed, subrc = ', sy-subrc.
  3.   exit.
  4. endif.
Ende des Codes

Danach werden Header-Felder des Requests gesetzt. Das Setzen der HTTP-Request-Methode auf GET ist optional.

Hinweis Hinweis

Wird dieses Feld nicht gesetzt, nimmt das System GET für den Fall, dass der HTTP-Request keinen Body enthält, ansonsten POST.

Ende des Hinweises.

Das Setzen des Request-URI ist erforderlich, es sei denn, es wurde über die Destination (SM59) der gesamte Pfad als Pfad-Präfix angegeben. Hierzu verwenden Sie die Methode set_request_uri der Klasse cl_http_utility:

Syntax Syntax

  1. * set http method GET
  2. call method client-( 
  3.                    if_http_request= ).
  4. * set protocol version
  5.    if protocol = 'HTTP/1.0'.
  6.        client-(
  7.             if_http_request= ).
  8.    else.
  9.       client-(
  10.             if_http_request= ).
  11.    endif.
  12. * set request uri (/>[?>])
  13.    cl_http_utility=( request = client-
  14.                                       uri    = uri ).
Ende des Codes
Schritt 2

Im Anschluss können beliebige Felder des Client-Kontrollblocks gefüllt werden.

Weitere Optionen

  • Sie können die Attribute PROPERTYTYPE_LOGON_POPUP, PROPERTYTYPE_REDIRECT und PROPERTYTYPE_ACCEPT_COMPRESS die im Default den Wert CO_ENABLED haben, deaktivieren (auf CO_DISABLED setzen).

  • Sie können PROPERTYTYPE_ACCEPT_COOKIE auf andere Werte setzen. Der Defaultwert ist CO_DISABLED, es stehen aber auch die Werte CO_ENABLED (Cookies immer akzeptieren), CO_PROMPT (beim Empfang des Cookies ein Popup senden, ob das Cookie akzeptiert werden soll) sowie CO_EVENT (Cookiebehandlung über das Ereignis EVENTKIND_HANDLE_COOKIE des Interfaces IF_HTTP_CLIENT) zur Verfügung.

  • Sie können PROPERTYTYPE_ACCEPT_COMPRESS auf den Wert CO_DISABLED setzen, damit der Partner seine Daten unkomprimiert sendet.

  • Es besteht auch die Möglichkeit, vor dem Senden des Requests die notwendigen Anmeldedaten durch Verwendung der AUTHENTICATE()-Methode des Interfaces IF_HTTP_CLIENT einzugeben.

Schritt 3

Nun wird der Request versendet:

Syntax Syntax

  1. * Send
  2. call method client-send
  3.   exporting  timeout = timeout
  4.   exceptions http_communication_failure  = 1
  5.              http_invalid_state          = 2
  6.              http_processing_failed      = 3
  7.              others                      = 4.
  8. if sy-subrc < 0.
  9.   call method client-get_last_error
  10.      importing code    = subrc
  11.                message = errortext.
  12.   write: / 'communication_error( send )',
  13.          / 'code: ', subrc, 'message: ', dummy.
  14.   exit.
  15. endif.
Ende des Codes

Hier muss wieder mit client->get_last_error der letzte Fehler abgefragt werden.

Schritt 4

Nun wird die Antwort empfangen, die Responsedaten in das Client-Objekt gefüllt.

Syntax Syntax

  1. * receive
  2. call method client->receive
  3.     exceptions http_communication_failure  = 1
  4.                http_invalid_state          = 2
  5.                http_processing_failed      = 3
  6.                others                      = 4.
  7.   if sy-subrc <> 0.
  8.      call method client->get_last_error
  9.      importing code    = subrc
  10.                message = errortext.
  11.     write: / 'communication_error( receive )',
  12.            / 'code: ', subrc, 'message: ', dummy.
  13.     exit.
  14.   endif.
Ende des Codes

Auch hier müssen wieder Exceptions und Fehlerabfragen eingefügt werden.

Wenn die Verbindung nicht mehr verwendet wird, muss sowohl das Client-Objekt als auch die Verbindung abgebaut werden:

Syntax Syntax

  1. * close
  2. call method client->close
  3.   exceptions http_invalid_state   = 1               
  4.              others               = 2.
Ende des Codes

Um den erfolgreichen Test zu dokumentieren, wird nun die Ausgaberoutine aufgerufen.

Syntax Syntax

  1. * output
  2.   perform write_document.
Ende des Codes