HTTP Requests in ABAP

Seit geraumer Zeit bereits stellt der SAP NetWeaver eine objektorientierte API für HTTP Requests zur Verfügung. Mit Hilfe der Klasse CL_HTTP_CLIENT lassen sich HTTP-Schnittstellen mit wenig Code einfach ansprechen.

Folgendes Beispiel zeigt die Verwendung einer der Schnittstelle für den Zugriff auf wtfismyip.com, einer API, die die IP des aufrundenden Clients zurückgibt.

ABAP Report: Durchführen eines GET Requests
REPORT  Z_HTTP_REQUEST_TEST.

DATA lo_http_client TYPE REF TO if_http_client.
cl_http_client=>create_by_url( EXPORTING url = 'http://wtfismyip.com/json' IMPORTING client = lo_http_client EXCEPTIONS ARGUMENT_NOT_FOUND = 1 PLUGIN_NOT_ACTIVE = 2 INTERNAL_ERROR = 3 ).

IF sy-subrc <> 0.
  " Error handling
ENDIF.

lo_http_client->request->set_method( if_http_request=>co_request_method_get ).

lo_http_client->send( EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1 HTTP_INVALID_STATE = 2 HTTP_PROCESSING_FAILED = 3 HTTP_INVALID_TIMEOUT = 4 ).
IF sy-subrc <> 0.
  " Error handling
ENDIF.

lo_http_client->receive( EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1 HTTP_INVALID_STATE = 2 HTTP_PROCESSING_FAILED = 3 ).
IF sy-subrc <> 0.
  " Error handling
ENDIF.

DATA lv_http_response_code TYPE i.
lo_http_client->response->get_status( IMPORTING code = lv_http_response_code ).

DATA lv_result_string TYPE string.
IF lv_http_response_code = 200.
  lv_result_string = lo_http_client->response->get_cdata( ).
ELSE.
  lv_result_string = lv_http_response_code.
  CONCATENATE 'ERROR #' lv_result_string INTO lv_result_string separated by ''.
ENDIF.
lo_http_client->close( ).

zcl_extended_writer=>get_instance( lv_result_string )->write( ).

Der ZCL_EXTENDED_WRITER sorgt in diesem Fall lediglich dafür, dass der String in “lv_result_string” korrekt (mehrzeilig) ausgegeben wird.

Ausgabe des beschriebenen Beispielcodes:

Write-Ausgabe des HTTP Request

Die API unterliegt leider der Einschränkung, dass nur GET- und POST-Requests implementiert werden können. Außerdem verwendet die API – vermutlich historisch gewachsen – noch die veralteten auf dem sy-subrc basierenden Exceptions, anstelle der klassenbasierten Exceptions. Weiterhin können nur unverschlüsselte Verbindungen ohne weiteres verwendet werden. Zum Verbinden auf eine SSL-verschlüsselte Verbindung (HTTPS) muss das Zertifikat des Zielservers in der Transaktion STRUST konfiguriert werden.

Nach Angabe von SAP basiert die API standardmäßig auf HTTP 1.0. Die Verwendung von HTTP 1.1 muss explizit über den Aufruf “set_version” auf dem Request-Objekt (implementiert IF_HTTP_REQUEST) aufgerufen werden.

Verwendung von HTTP 1.1
lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_1 ).

Insgesamt ist API leider nur bedingt praktikabel. Hinzu kommt, dass ABAP keine Sockets zur Verfügung stellt, d. h. eine manuelle Erweiterung der API um die verbleibenden HTTP-Methoden ist ohne weiteres nicht einfach möglich.

Leave a Reply

Your email address will not be published. Required fields are marked *