Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& Report Z_API_AUFRUF_TEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT Z_API_AUFRUF_TEST.
DATA: lv_code TYPE i,
lv_url TYPE string,
li_client TYPE REF TO if_http_client,
lt_errors TYPE TABLE OF string,
lv_error_message TYPE string,
lv_json_data TYPE string.
lv_url = '>URL<'.
cl_http_client=>create_by_url(
EXPORTING
url = lv_url
ssl_id = 'ANONYM'
IMPORTING
client = li_client ).
li_client->send( ).
li_client->receive(
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
OTHERS = 4 ).
IF sy-subrc <> 0.
WRITE: / 'Error Number', sy-subrc, /.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
li_client->get_last_error(
IMPORTING
message = lv_error_message ).
SPLIT lv_error_message AT cl_abap_char_utilities=>newline INTO TABLE lt_errors.
LOOP AT lt_errors INTO lv_error_message.
WRITE: / lv_error_message.
ENDLOOP.
RETURN.
ENDIF.
li_client->response->get_status(
IMPORTING
code = lv_code ).
IF lv_code = 200.
WRITE: / lv_url, ': OK'.
WRITE: /.
lv_json_data = li_client->response->get_cdata( ).
WRITE lv_json_data.
ENDIF.
Code: Alles auswählen.
li_client->response->get_status( IMPORTING code = lv_http_rc
reason = lv_reason ).
Code: Alles auswählen.
li_client->request->set_header_field(
name = '~request_method'
value = 'GET' ).
li_client->request->set_header_field(
name = '~server_protocol'
value = 'HTTP/1.1' ).
Vielen Dank für alle drei Antworten.IHe hat geschrieben: ↑18.08.2021 10:20Den Laufzeitfehler erhältst du, weil SY-MSGTY initial ist - der vorherige Aufruf setzt nur den sy-subrc, aber keine Meldung. Wenn du den MESSAGE-Befehl auskommentiertst, erhältst du denn dann eine lv_error_message?
Ansonsten kannst du auch den Status überprüfen:Eventuell musst du vor dem send() auch noch Header-Daten füllen wie z.B.:Code: Alles auswählen.
li_client->response->get_status( IMPORTING code = lv_http_rc reason = lv_reason ).
Es kann auch hilfreich sein den API-Aufruf parallel mit einem Tool wie z.B. Postman zu testen.Code: Alles auswählen.
li_client->request->set_header_field( name = '~request_method' value = 'GET' ). li_client->request->set_header_field( name = '~server_protocol' value = 'HTTP/1.1' ).
Code: Alles auswählen.
REPORT ZKGR_API_AUFRUF_TEST.
DATA: lv_code TYPE i,
lv_url TYPE string,
li_client TYPE REF TO if_http_client,
lt_errors TYPE TABLE OF string,
lv_error_message TYPE string,
lv_json_data TYPE string,
lv_http_rc TYPE string,
lv_reason TYPE string.
lv_url = 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/info?id=1'.
cl_http_client=>create_by_url(
EXPORTING
url = lv_url
ssl_id = 'ANONYM'
IMPORTING
client = li_client ).
li_client->request->set_header_field(
name = '~request_method'
value = 'GET' ).
li_client->request->set_header_field(
name = '~server_protocol'
value = 'HTTP/1.1' ).
li_client->request->set_header_field(
name = '*privater API KEY "name" den ich nicht teilen kann*'
value = 'privater API KEY VALUE den ich nicht teilen kann*' ).
li_client->send( ).
li_client->receive(
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
OTHERS = 4 ).
IF sy-subrc <> 0.
WRITE: / 'Error Number', sy-subrc, /.
* MESSAGE ID sy-msgid TYPE A NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
li_client->get_last_error(
IMPORTING
message = lv_error_message ).
SPLIT lv_error_message AT cl_abap_char_utilities=>newline INTO TABLE lt_errors.
LOOP AT lt_errors INTO lv_error_message.
WRITE: / lv_error_message.
ENDLOOP.
RETURN.
ENDIF.
IF lv_code = 404.
WRITE: / lv_url, ': not ok'.
ENDIF.
IF lv_code = 200.
WRITE: / lv_url, ': OK'.
WRITE: /.
lv_json_data = li_client->response->get_cdata( ).
WRITE lv_json_data.
ENDIF.
Wie kommst du auf drei Zertifikate?
Dann fehlen dir vermutlich noch zwei 😉
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
sap_koun
Code: Alles auswählen.
cl_http_utility=>set_query( request = li_client->request
query = iv_query ).
Hallo Herr Hoffmann,IHe hat geschrieben: ↑25.08.2021 06:59
Eine Query bei GET kannst du folgendermaßen absetzen:Die Query ist hierbei ein einfacher String.Code: Alles auswählen.
cl_http_utility=>set_query( request = li_client->request query = iv_query ).
Code: Alles auswählen.
CONSTANTS: lc_trans_url TYPE string VALUE 'https://pro-api.coinmarketcap.com//v1/cryptocurrency/quotes/latest?id=1',
lc_sth_name TYPE string VALUE 'CMC_PRO_API_KEY',
lc_sth_apikey TYPE string VALUE 'XXXXX-XXXX-XXXXX-XXXX-XXXX'.
Code: Alles auswählen.
lo_http_client->append_field_url(
EXPORTING
name = 'id'
value = '1'
CHANGING
url = lv_url ).
lo_http_client->append_field_url(
EXPORTING
name = 'CMC_PRO_API_KEY'
value = 'xxxx-xxxx-xxxx-xxxx-xxxx'
CHANGING
url = lv_url ).