Programmierung von SAP-Programm für API´s

Alles über die SAPs In-Memory Datenbank HANA
2 Beiträge • Seite 1 von 1
2 Beiträge Seite 1 von 1

Programmierung von SAP-Programm für API´s

Beitrag von Bright4.5 (Specialist / 281 / 21 / 1 ) »
Hallo zusammen,

hat jemand schon mal ein SAP-Programm programmiert, welches von SAP heraus API´s aufruft bzw. die Daten davon abgreift?

Ich hätte mich jetzt mal entlang eines Tutorials gehangelt, aber leider funktioniert es noch nicht so ganz :/.

Das wäre mein Coding:

Code: Alles auswählen.

TRY.

  " API URL

  DATA(lv_url) = |https://www.rapdiapi.com|.

  DATA: o_client TYPE REF TO if_http_client.

  " Create HTTP Object

  cl_http_client=>create_by_url( EXPORTING
                                    url = lv_url

                                 IMPORTING

                                   client = o_client

                                 EXCEPTIONS

                                    argument_not_found  = 1
                                    plugin_not_active   = 2
                                    internal_error      = 3
                                    others = 4 ).

  if sy-subrc <> 0.
    o_client->close( ).
  endif.

if o_client is bound.


" set http method

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


  " set_header_fields

  o_client->request->set_header_field( name = 'X-RapidAPI-Host'
                                       value = 'airport-info.p.rapidapi.com' ).

  o_client->request->set_header_field( name = 'X-RapidAPI-Key'
                                       value = '7217e89939msh998319a5fa4b773p107fc2jsne56a3276d142' ).

  "set_timout

  o_client->send( timeout = if_http_client=>co_timeout_default ).

  "read response, http_status, payload

  o_client->receive( ).

  Data: lv_http_status TYPE i,
        lv_status_text TYPE string.

  o_client->response->get_status( IMPORTING
                                    code = lv_http_status
                                    reason = lv_status_text ) .

  write: / 'HTTP_STATUS_CODE:', lv_http_status.
  write: / 'STATUS_TEXT:', lv_status_text.

  if lv_http_status = 200.
    DATA(lv_result) = o_client->response->get_cdata( ).

    write: / 'Response'.
    write: / lv_result.

  endif.

  "close http_connection

  o_client->close( ).

  ENDIF.

  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).

ENDTRY.


Leider klappt es mit dem SSL-Zertifikat immer noch nicht :(

Hat jemand so etwas schon mal gemacht und könnte mir da ein paar Tipps geben?

Was müsste der Drittanbieter liefern? Die URL und was sonst noch, damit das mit der API klappt?

Vielen Dank im Voraus.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Programmierung von SAP-Programm für API´s

Beitrag von tar (Specialist / 109 / 22 / 31 ) »
Das ist in SAP leider schrecklich umständlich.

Ich nehme beispielhaft mal diese API-URL: https://api.bitvavo.com/v2/markets

1. Zuerst musst du die SSL-Zertifikatskette vom API-Anbieter herunterladen:

Geh dazu einfach mit einem Browser auf die URL, klicke dann in der Adressleiste links auf das Schlossymbol, hangel dich zu den Zertifikaten und lade diese (alle 3) einzeln als .perm-Dateien herunter.

2. Diese Zertifikate musst du dann ins SAP importieren:

Rufe Transaktion STRUST auf, klicke doppelt auf "SSL-Client (Anonym)", dann auf der rechten Seite ganz unten das linke Symbol "Zertifikat importieren", eine .perm-Datei auswählen usw. und dann rechts auf "In Zert.-Liste aufnehmen"

Für alle Zertifikate wiederholen und beim Verlassen von STRUST alles sichern.

3. Du brauchst nun noch eine vorhandene HTTPS-Verbindung, die SSL aktiviert hat:

Rufe Transaktion SM59 auf, lege dort eine neue "HTTP-Verbindung zu ext. Server" an. Als Host trägst du die URL ohne Präfix und Suffixe ein (hier: api.bitvavo.com). Als Pfadpräfix kannst du hier testweise mal noch den direkten Endpunkt angeben (hier: /v2/markets). Im Reiter "Anmeldung & Sicherheit" setzt du ganz unten SSL auf "aktiv" und wählst "ANONYM SSL-Client" aus. Dann speichern.

Dann einfach mal direkt oben links auf "Verbindungstest" klicken. Wenn da kein SSL-Fehler mehr aufpoppt und du eine Antwort siehst, funktioniert es.

Im Code musst du dann die Verbindung wählen (cl_http_client=>create_by_destination) und deine Requests entsprechend aufbauen. Wenn du den Endpunkt direkt in der Verbindung angegeben hast, sollte auch das direkt funktionieren.

Hier direkt mit Response-Anzeige:

Code: Alles auswählen.

report z_api_call.

cl_http_client=>create_by_destination(
  exporting
    destination = 'bitvavo'
  importing
    client      = data(client)
).

client->send( ).
client->receive( ).

if sy-subrc is initial.
  data(response_xstring) = client->response->get_data( ).
  data(response_string) = cl_abap_conv_codepage=>create_in( )->convert( response_xstring ).

  call transformation id source xml response_xstring result xml data(response_xml_table).
  data(response_xml) = cl_abap_conv_codepage=>create_in( )->convert( response_xml_table ).

  cl_soap_xml_helper=>xml_show(
    sdoc  = response_xml
    html  = abap_false
    title = 'Response'
  ).
else.
  client->get_last_error(
    importing
      code    = data(error_code)
      message = data(error_text)
  ).

  write:
    / 'communication error',
    / 'code: ', error_code,
    / 'message: ', error_text.
endif.

client->close( ).
Da eine API aber nicht nur 1 Endpunkt hat, solltest du in der SM59 nur den Host angeben und den Pfadpräfix leer lassen. Um dann die eigentlichen Endpunkte abzurufen, musst du im Code den Request entsprechend den jeweiligen API-Vorgaben aufbauen, d.h. meistens dazu die Request-Header entsprechend füllen und die URL samt Query anpassen sowie ggf. den Body füllen (bei POST-Requests).

Das geht bspw. so:

Code: Alles auswählen.

cl_http_client=>create_by_destination(
  exporting
    destination = 'bitvavo'
  importing
    client      = data(client)
).

cl_http_utility=>set_request_uri(
  request = client->request
  uri     = client->create_rel_url( path = '/v2/markets' )
).

cl_http_utility=>set_query(
  query   = 'market=BTC-EUR'
  request = client->request
).

* header und body füllen, hier nicht notwendig, daher auskommentiert
*client->request->set_header_field(
*  name  = 'SomeHeaderField'
*  value = 'SomeHeaderValue'
*).

*client->request->set_data(
*  data = someXstring
*).

client->send( ).
client->receive( ).
" ... siehe oben ...
client->close( ).
Ggf. braucht man auch Cookies oder einen Multipart-Body usw., wofür das Request-Objekt entsprechende Methoden bereitstellt.

Ansonsten wäre noch wichtig, dass man bei mehreren Requests den Client offen lassen kann/sollte und erst am Ende schließt (was mich eher an einen Socket erinnert als einen REST Request, der ja eben stateless sein sollte, aber SAP ist wie so oft seltsam).

Seite 1 von 1

Vergleichbare Themen

8
Antw.
2866
Views
Programmierung von SAP-Programm für API´s
von Bright4.5 » 12.12.2024 10:37 • Verfasst in ABAP® für Anfänger
0
Antw.
1961
Views
Unicodevorgaben bei der Programmierung
von JürgenFFM » 07.11.2007 11:29 • Verfasst in Dialogprogrammierung
0
Antw.
1785
Views
37
Antw.
2654
Views
Dynamische Programmierung
von ZF_SAPler » 16.09.2022 14:57 • Verfasst in ABAP® für Anfänger
7
Antw.
4057
Views
Programmierung erlernen
von Trolli » 20.07.2005 16:03 • Verfasst in SAP - Allgemeines

Über diesen Beitrag



Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

MS-Word als Editor
vor einer Woche von tekko 1 / 874
CC01 + CC02 Klassifizierung anlegen
vor einer Woche von Manfred K. 1 / 1072
Formulare aus Fiori debuggen
vor einer Woche von Manfred K. 1 / 1055