Το SAP χρησιμοποιεί το REST API?
Καταναλώνοντας API REST με (σύννεφο) ABAP
Κλήση μετά τη μέθοδο
Όταν εργάζεστε με API REST, το SAP χρησιμοποιεί το REST API για επικοινωνία μεταξύ εφαρμογών. Σε αυτό το άρθρο, θα διερευνήσουμε τον τρόπο κατανάλωσης API REST χρησιμοποιώντας το ABAP, ειδικά με τη λειτουργικότητα του cloud abap. Εδώ είναι τα βασικά σημεία που πρέπει να γνωρίζετε:
- Το API σημαίνει διεπαφή προγραμματισμού εφαρμογών και επιτρέπει σε δύο εφαρμογές να επικοινωνούν μεταξύ τους.
- Τα API REST είναι ένα πρότυπο API οικοδόμησης χρησιμοποιώντας το πρωτόκολλο HTTP και την αποστολή/λήψη δεδομένων JSON ή XML μέσω των URIS.
- Το Odata, δημοφιλές στον κόσμο SAP, είναι ένας τύπος REST API.
- Υπάρχουν διαθέσιμες περιορισμένες πληροφορίες σχετικά με την κατανάλωση εξωτερικών API σε ABAP, ειδικά τα λευκά API για το Cloud ABAP.
- Σε αυτό το σεμινάριο, θα χρησιμοποιήσουμε το API Placeholder JSON για σκοπούς επίδειξης.
- Ο πάροχος API προσφέρει πόρους όπως δημοσιεύσεις, σχόλια, άλμπουμ, φωτογραφίες, todos και χρήστες.
- Θα επικεντρωθούμε στον πόρο θέσεων για απλότητα.
- Μια ανάρτηση διαθέτει αναγνωριστικό, τίτλο, σώμα και αναγνωριστικό χρήστη.
- Για να καταναλώσουμε API REST στο ABAP, θα χρησιμοποιήσουμε το Whitelisted ABAP API που ονομάζεται IF_WEB_HTTP_CLIONT.
- Θα χρησιμοποιήσουμε επίσης τη βιβλιοθήκη XCO για να συνεργαστούμε με το JSON.
Ερωτήσεις:
- Τι σημαίνει το API?
Το API σημαίνει διεπαφή προγραμματισμού εφαρμογών. - Τι είναι τα API REST?
Τα API REST είναι ένα πρότυπο API οικοδόμησης χρησιμοποιώντας το πρωτόκολλο HTTP και την αποστολή/λήψη δεδομένων JSON ή XML μέσω των URIS. - Τι είναι τα ODATA?
Το Odata είναι ένας τύπος API REST που είναι δημοφιλές στον κόσμο SAP. - Υπάρχουν πολλές διαθέσιμες πληροφορίες σχετικά με την κατανάλωση εξωτερικών API στο ABAP?
Όχι, υπάρχουν διαθέσιμες περιορισμένες πληροφορίες, ειδικά για τα API που έχουν υποστεί λίστα για το Cloud ABAP. - Τι θα χρησιμοποιήσει ο πάροχος API σε αυτό το σεμινάριο?
Θα χρησιμοποιήσουμε το API Placeholder JSON για σκοπούς επίδειξης. - Ποιοι πόροι προσφέρει το API Placeholder API του JSON?
Το API Placeholder JSON προσφέρει πόρους όπως δημοσιεύσεις, σχόλια, άλμπουμ, φωτογραφίες, todos και χρήστες. - Σε ποιον πόρο θα επικεντρωθούμε σε αυτό το σεμινάριο?
Θα επικεντρωθούμε στον πόρο θέσεων για απλότητα. - Τι χαρακτηριστικά έχει μια ανάρτηση?
Μια ανάρτηση διαθέτει αναγνωριστικό, τίτλο, σώμα και αναγνωριστικό χρήστη. - Τι Whitelisted ABAP API θα χρησιμοποιήσουμε για να καταναλώσουμε API REST?
Θα χρησιμοποιήσουμε το API IF_WEB_HTTP_CLIENT. - Ποια βιβλιοθήκη θα χρησιμοποιήσουμε για να συνεργαστούμε με το JSON?
Θα χρησιμοποιήσουμε τη βιβλιοθήκη XCO.
Λεπτομερείς απαντήσεις:
- Τι σημαίνει το API?
Το API σημαίνει διεπαφή προγραμματισμού εφαρμογών. Πρόκειται για ένα σύνολο προτύπων που επιτρέπει σε δύο εφαρμογές να επικοινωνούν μεταξύ τους. - Τι είναι τα API REST?
Τα API REST είναι ένα πρότυπο κτιρίων API χρησιμοποιώντας το πρωτόκολλο HTTP. Επιτρέπουν στις εφαρμογές να στέλνουν και να λαμβάνουν δεδομένα JSON ή XML μέσω των URIS. Τα API REST με βάση το JSON χρησιμοποιούνται ευρέως. - Τι είναι τα ODATA?
Το ODATA είναι ένας τύπος API REST που είναι πολύ δημοφιλής στον κόσμο SAP. Επιτρέπει την εύκολη πρόσβαση και τον χειρισμό των δεδομένων που είναι αποθηκευμένα σε συστήματα SAP. - Υπάρχουν πολλές διαθέσιμες πληροφορίες σχετικά με την κατανάλωση εξωτερικών API στο ABAP?
Όχι, υπάρχουν διαθέσιμες περιορισμένες πληροφορίες σχετικά με την κατανάλωση εξωτερικών API στο ABAP, ειδικά για τα Whitelisted API που μπορούν να χρησιμοποιηθούν με το σύννεφο ABAP. Αυτό το σεμινάριο στοχεύει στην παροχή καθοδήγησης σχετικά με την κατανάλωση API REST χρησιμοποιώντας το Cloud ABAP. - Τι θα χρησιμοποιήσει ο πάροχος API σε αυτό το σεμινάριο?
Θα χρησιμοποιήσουμε το API Placeholder JSON, το οποίο είναι ένα ψεύτικο online REST API για δοκιμές και πρωτότυπα. Μας επιτρέπει να εκτελούμε ενέργειες CRUD (δημιουργία, ανάγνωση, ενημέρωση, διαγραφή). - Ποιοι πόροι προσφέρει το API Placeholder API του JSON?
Το API Placeholder JSON προσφέρει πόρους όπως θέσεις, σχόλια, άλμπουμ, φωτογραφίες, todos και χρήστες. Σε αυτό το σεμινάριο, θα επικεντρωθούμε στον πόρο των θέσεων. - Σε ποιον πόρο θα επικεντρωθούμε σε αυτό το σεμινάριο?
Θα επικεντρωθούμε στον πόρο Posts από το API Placeholder JSON. Αυτό θα μας επιτρέψει να επιδείξουμε πώς να εκτελέσουμε τις ενέργειες CRUD σε ένα API REST χρησιμοποιώντας τα API ABAP που έχουν ληφθεί στην πλατφόρμα SAP Cloud. - Τι χαρακτηριστικά έχει μια ανάρτηση?
Μια ανάρτηση διαθέτει αναγνωριστικό, τίτλο, σώμα και αναγνωριστικό χρήστη. Το αναγνωριστικό αντιπροσωπεύει το μοναδικό αναγνωριστικό της ανάρτησης και το αναγνωριστικό χρήστη αντιπροσωπεύει το αναγνωριστικό του χρήστη που δημιούργησε την ανάρτηση. - Τι Whitelisted ABAP API θα χρησιμοποιήσουμε για να καταναλώσουμε API REST?
Για να καταναλώσουμε API REST στο ABAP, θα χρησιμοποιήσουμε το API IF_WEB_HTTP_CLIENT. Πρόκειται για ένα API ABAP που επιτρέπεται να χρησιμοποιείται στην πλατφόρμα SAP Cloud Platform. - Ποια βιβλιοθήκη θα χρησιμοποιήσουμε για να συνεργαστούμε με το JSON?
Για να συνεργαστούμε με το JSON, θα χρησιμοποιήσουμε την έκδοση πλατφόρμας cloud της βιβλιοθήκης XCO (Components Components). Αυτή η βιβλιοθήκη παρέχει χρήσιμη λειτουργικότητα για τη μετατροπή των δεδομένων JSON μεταξύ διαφορετικών συμβάσεων ονομασίας, όπως το CamelCase στο Under_Score και το αντίστροφο.
Ακολουθώντας αυτό το σεμινάριο, θα μπορείτε να καταναλώσετε API REST χρησιμοποιώντας το ABAP, ειδικά με τη λειτουργικότητα Cloud ABAP.
Καταναλώνοντας API REST με (σύννεφο) ABAP
Μεθοδική κλήση ->>
Το SAP χρησιμοποιεί το REST API?
Э э э э э э э э э э э э э э э э э э э э э э э э э э э э э э э э э э
Ы з з з з з з з и и и и п п п п п п з п з з з з з з з з з п. С п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п п. ПOчем э э э э э э э э э э э п п п п п п п?
Э э э э э а а а а и е е з з л л л л л л л э э э э э э э э э э э э Κοιτάζοντας το ριμπάγ. С с п п п п п э э э э э э э э э э э э э э э э э э э э э э э э э э э э. Д э э э э д д д и и д д д ρίας н и д д д д д д д д д д д д д д д д д д д д д д д д д д д д д д д д д д д.
И и з а а а а а а а а ы ы з .. Е е е е д п п ж ж ж ж ж ж ж ж ж ж ж ж ж ж ж ж ж ж п п п п п п п п п п п п п п п п п. Орrρά. Пороннαι.
ПON п п е е а а τροφή пρέφ а а а а а τροφήλου. е е е и τροφή ее же жÉ в в ж и и и и ч ч.
Καταναλώνοντας API REST με (σύννεφο) ABAP
Το API σημαίνει διεπαφή προγραμματισμού εφαρμογών και περιλαμβάνει ένα σύνολο προτύπων που επιτρέπουν σε δύο εφαρμογές να μιλούν μεταξύ τους. Τα API REST είναι ένα συγκεκριμένο πρότυπο κτιρίων API. Βασίζονται στο πρωτόκολλο HTTP, που στέλνουν και λαμβάνουν δεδομένα JSON ή XML μέσω των URIs (Ομοιόμορφο αναγνωριστικό πόρων). Τα API REST με βάση το JSON είναι επικρατέστερα. Θα χρησιμοποιήσουμε επίσης ένα τέτοιο σε αυτό το σεμινάριο.
Το Odata, το οποίο είναι πολύ δημοφιλές στον κόσμο SAP, είναι το ίδιο API REST. Υπάρχουν πολλές πληροφορίες εκεί έξω για το πώς να παρέχετε ένα API REST από το ABAP (i.μι., για τη δημοσίευση μιας υπηρεσίας ODATA). Αλλά δεν υπάρχει’t πολύ για το πώς να καταναλώσετε ένα εξωτερικό API στο ABAP. Και από ό, τι λίγα υπάρχει, περιλαμβάνει μη φυλλοβόλα API API, i.μι., δεν μπορούν να χρησιμοποιηθούν με το σύννεφο ABAP. Έτσι, αποφάσισα να γράψω αυτό το σεμινάριο για την κατανάλωση API REST χρησιμοποιώντας το Cloud ABAP.
Σενάριο
Παροχέας API
Θα συνεργαστούμε με το Placherder JSON – α “ΔΩΡΕΑΝ να χρησιμοποιείτε ψεύτικο API Online REST για δοκιμές και πρωτότυπα”. Θα μας επιτρέψει να εκτελέσουμε όλες τις ενέργειες CRUD (δημιουργία, ανάγνωση, ενημέρωση, διαγραφή). Για να είμαστε δίκαιοι, η δημιουργία, η ενημέρωση και η διαγραφή δεν θα λειτουργούν πραγματικά, αλλά ο διακομιστής θα το πλαστογραφήσει σαν να το κάνουν. Που είναι εντελώς αρκετά για τη χρήση μας!
Πόροι
Ο πάροχος API μας εκθέτει θέσεις, Σχόλια, άλμπουμ, φωτογραφίες, todos, και χρήστες. Για απλότητα’χάρη, θα χρησιμοποιούμε μόνο το θέσεις πόρος και προσποιείτε ότι τα υπόλοιπα αρένα’εκεί. Η κύρια ιδέα του σεμιναρίου μου είναι να παράσχω έναν εξαιρετικά απλό οδηγό για το πώς να εκτελέσω τις ενέργειες CRUD σε ένα API REST. Και το κάνετε αυτό χρησιμοποιώντας API ABAP με λίστα με την πλατφόρμα SAP Cloud (CP). Αυτό σημαίνει ότι μπορείτε να εκτελέσετε αυτόν τον κωδικό σε έναν λογαριασμό SAP CP δοκιμής.
Θέσεις πόρος
Μια ανάρτηση έχει αναγνωριστικό, τίτλο, σώμα και αναγνωριστικό χρήστη, που σημαίνει το αναγνωριστικό του χρήστη που δημιούργησε την ανάρτηση. Το εκπροσωπούμε στο ABAP ως εξής:
Τύποι: Begin of Post_s, User_ID Τύπος Ι, ID Τύπος I, Τύπος Τίτλος Σειρά, Τύπος Σώματος Σειρά, Τέλος Post_s, Post_tt Τύπος Πίνακας post_s με κενό κλειδί, Begin of Post_without_id_s, User_ID Τύπος Ι, Τύπος Τίτλος String, String Τύπου Σώματος, Τέλος του post_without_id_s.
Χρειαζόμαστε τη δομή χωρίς ταυτότητα, επειδή το αναγνωριστικό ταχυδρομείου αντιστοιχεί αυτόματα από το REST API. Σημαίνει ότι δεν το παρέχουμε κατά τη δημιουργία μιας νέας ανάρτησης.
Χρησιμοποιήθηκαν τα API του Cloud ABAP
Αποστολή αιτήσεων HTTP
Όπως ανέφερα προηγουμένως, ο μικρός αριθμός των υφιστάμενων μαθημάτων για την κατανάλωση API REST σε ABAP χρησιμοποιεί κυρίως μη φυλλοβόλα API API. Για παράδειγμα, το if_http_client ένα, του οποίου η χρήση δεν επιτρέπεται στο σύννεφο ABAP. Ο τρόπος για να ελέγξετε τα API ABAP που έχουν υποστεί λευκώματα για την πλατφόρμα SAP Cloud είναι να περιηγηθείτε στο Απελευθερωμένα αντικείμενα κονίστρα. Είναι προσβάσιμο στο Eclipse ABAP Development Tools (ADT) -> Project Explorer -> Απελευθερωμένα αντικείμενα. Έτσι, το API ABAP έτοιμο για το σύννεφο για να στείλει το αίτημα HTTP είναι το if_web_http_client. Ορίζουμε την ακόλουθη μέθοδο για να λάβουμε έναν πελάτη:
Μέθοδοι: Create_Client Εισαγωγή Τύπος URL Τύπος Σειρά επιστροφής (αποτέλεσμα) Τύπος REF σε IF_WEB_HTTP_CLIENT RAUSING CX_STATIC_CHECK
Μέθοδος Create_Client. Δεδομένα (DEST) = CL_HTTP_DESTINIA_PROVIDER => CREATE_BY_URL (URL). Αποτέλεσμα = CL_WEB_HTTP_CLIENT_MANAGER => CREATE_BY_HTTP_DESTINIA. Endmethod.
Παρατηρήστε ότι η διεύθυνση URL είναι μια παράμετρος εισόδου. Το επιστρεφόμενο αποτέλεσμα είναι ο δημιουργημένος πελάτης Web HTTP.
Εργασία με το JSON
Για να συνεργαστούμε με το JSON, θα χρησιμοποιήσουμε την έκδοση πλατφόρμας cloud του XCO (Εξαρτήματα επέκτασης) βιβλιοθήκη. Διαβάστε περισσότερα για αυτό εδώ και εδώ. Η συγκεκριμένη τάξη, που σχετίζεται με την περίπτωση χρήσης μας XCO_CP_JSON. Κάτι εξαιρετικά πολύτιμο που παρέχει είναι η δυνατότητα να μεταμορφώνουν διαφορετικές συμβάσεις ονομασίας. Για παράδειγμα, camelcase σε under_score, και το αντίστροφο.
Καταναλώνοντας το API REST
Πριν φτάσουμε στο διασκεδαστικό μέρος, πρέπει απλώς να ορίσουμε μερικές σταθερές. Φυσικά, αυτό δεν είναι αυστηρά απαραίτητο, αλλά η συνεργασία με σταθερές σε αντίθεση με τα Literals String είναι μια καλύτερη πρακτική και επιτρέπει την επαναχρησιμοποίηση.
Σταθερές: τιμή συμβολοσειράς τύπου base_url 'https: // jsonplaceholder.τυπικός κώδικας.com/posts ', content_type Τύπος String Value' Content-Type ', JSON_CONTENT ΤΥΠΟΣ ΤΥΠΟΣ ΑΝΤΙΜΕΤΩΠΙΣΗ' Εφαρμογή/JSON; charset = utf-8 '.
Η διεύθυνση URL βάσης είναι απλά η διεύθυνση του θέσεις πόρος. Τις τελευταίες δύο σταθερές που χρειαζόμαστε για τις περιπτώσεις όπου θα στέλνουμε δεδομένα (i.μι., Δημιουργία και ενημέρωση) στον διακομιστή χρησιμοποιώντας το REST API. Πρέπει να ενημερώσουμε τον διακομιστή ότι στέλνουμε JSON.
Διαβάστε όλες τις δημοσιεύσεις
Η διεύθυνση URL για την ανάγνωση όλων των δημοσιεύσεων είναι μόνο η διεύθυνση URL βάσης. Έτσι, δημιουργούμε έναν πελάτη για αυτό, χρησιμοποιούμε τον πελάτη για να εκτελέσει ένα αίτημα GET, να κλείσετε τον πελάτη και να μετατρέψετε το ληφθέντα JSON σε έναν πίνακα δημοσιεύσεων. Ο πίνακας των στοιχείων τύπου ορίζεται στο Δημοσίευση πόρων παραπάνω. Μπορείτε επίσης να ανατρέξετε στον πλήρη κώδικα στο τέλος.
read_posts Επιστροφή Τιμή (αποτέλεσμα) Τύπος post_tt Ανύψωση CX_STATIC_CHECK
Μέθοδος read_posts. "Αποκτήστε το JSON όλων των δεδομένων δεδομένων (URL) = |< base_url >|. Δεδομένα (πελάτης) = create_client (url). Δεδομένα (απάντηση) = πελάτης-> execute (if_web_http_client => get)-> get_text (). Πελάτης-> Κλείσιμο (). "Μετατροπή JSON σε post Πίνακας XCO_CP_JSON => DATA-> FROM_STRING (Response)-> Εφαρμογή (τιμή #((xco_cp_json => μετασχηματισμός-> camel_case_to_underscore)))-> write_to (ref #(αποτέλεσμα)). Endmethod.
Διαβάστε μεμονωμένη ανάρτηση
Η μέθοδος για να διαβάσετε μία ανάρτηση είναι παρόμοια, με τις διαφορές που λαμβάνουμε ως εισροή ένα αναγνωριστικό της θέσης και επιστρέφει μια δομή (i.μι., μια ενιαία ανάρτηση,) αντί ενός πίνακα (i.μι., μια λίστα αναρτήσεων). Το REST API’Η διεύθυνση URL για την ανάγνωση μιας μόνο ανάρτησης έχει ως εξής:
read_single_post εισαγωγή ID τύπου I Επιστροφή τιμής (αποτέλεσμα) Τύπος post_s Ανύψωση CX_STATIC_CHECK
Μέθοδος read_single_post. "Αποκτήστε το JSON για δεδομένα εισόδου post ID (URL) = |< base_url >/< id >|. Δεδομένα (πελάτης) = create_client (url). Δεδομένα (απάντηση) = πελάτης-> execute (if_web_http_client => get)-> get_text (). Πελάτης-> Κλείσιμο (). "Μετατροπή JSON σε δομή post xco_cp_json => data-> from_string (απάντηση)-> Εφαρμογή (τιμή #((xco_cp_json => μετασχηματισμός-> camel_case_to_underscore)))-> write_to (ref #(αποτέλεσμα)). Endmethod.
Δημιουργία ανάρτησης
Όπως εξηγήθηκε προηγουμένως, δημοσιεύσεις’ Τα αναγνωριστικά αποδίδονται αυτόματα από το REST API. Έτσι, για να δημιουργήσουμε μια ανάρτηση θα χρησιμοποιήσουμε το post_without_id_s τύπος. Αυτή θα είναι η παράμετρος εισόδου μας. Θα μετατρέψουμε από αυτή τη δομή ABAP σε JSON, για άλλη μια φορά χρησιμοποιώντας τη βιβλιοθήκη XCO. Από εκεί, δημιουργούμε έναν πελάτη. Στη συνέχεια, θέσαμε το σώμα του αιτήματος HTTP που πρόκειται να στείλουμε για να είναι το JSON που μόλις δημιουργήσαμε και αφήνουμε τον διακομιστή να γνωρίζει ότι θα στέλνουμε τον τύπο περιεχομένου JSON. Τέλος, εκτελούμε ένα αίτημα δημοσίευσης και επιστρέφουμε τον διακομιστή’απάντηση. Εάν όλα πήγαν καλά, ο διακομιστής’Η απάντηση S θα μας επέστρεψε τη θέση μας, μαζί με το νεοαποκτηθέντες ID (101, επειδή υπάρχουν σήμερα 100 δημοσιεύσεις).
create_post Εισαγωγή post_without_id Τύπος post_without_id_s Επιστροφή Τιμή (αποτέλεσμα) Τύπος συμβολοσειράς Raising CX_STATIC_CHECK
Μέθοδος Create_Post. "Μετατροπή της ανάρτησης εισόδου σε δεδομένα JSON (json_post) = xco_cp_json => data-> from_abap (post_without_id)-> apply (τιμή #. "Στείλτε το JSON του Post στο Server και επιστρέψτε τα δεδομένα απόκρισης (URL) = |< base_url >|. Δεδομένα (πελάτης) = create_client (url). Δεδομένα (req) = πελάτης-> get_http_request (). req-> set_text (json_post). req-> set_header_field (i_name = content_type i_value = json_content). Αποτέλεσμα = Πελάτης-> Εκτέλεση (IF_WEB_HTTP_CLIENT => POST)-> get_text (). Πελάτης-> Κλείσιμο (). Endmethod.
Ενημέρωση
Θα ενημερώσουμε με αίτημα θέσης. Αυτό σημαίνει ότι θα παρέχουμε την πλήρη ανάρτηση. Το Patch, από την άλλη πλευρά, μας επιτρέπει να παρέχουμε μόνο το ενημερωμένο πεδίο (e.σολ., Μόνο τίτλος). Εάν το βρείτε ενδιαφέρον, θα μπορούσατε να προσπαθήσετε να κάνετε το αίτημα Patch μόνοι σας – πρέπει’να είμαι πολύ σκληρός με τους παρέχονται εδώ πόρους!
Ακολουθούμε μια παρόμοια λογική όπως με το δημιουργώ δράση. Παρέχουμε επίσης μια ανάρτηση ως παράμετρο εισόδου, αλλά αυτή τη φορά χρησιμοποιούμε την πλήρη δομή (με το αναγνωριστικό ταχυδρομείου). Η διεύθυνση URL για την ενημέρωση μιας ανάρτησης είναι η ίδια με την πρόσβαση σε αυτήν την (ενιαία) ανάρτηση:
Έτσι, οι μόνες διαφορές από δημιουργώ Συμπεριλάβετε τον μεταβαλλόμενο τύπο της παραμέτρου εισόδου post, της διεύθυνσης URL και της μεθόδου αίτησης HTTP (PUT).
UPDATE_POST ΕΙΣΑΓΩΓΗ POST TYPE POST_S Επιστημονική τιμή (αποτέλεσμα) Τύπος συμβολοσειράς Raising CX_STATIC_CHECK
Μέθοδος ενημέρωσης_Post. "Μετατρέψτε την ανάρτηση εισόδου σε δεδομένα JSON (JSON_POST) = XCO_CP_JSON => DATA-> FROM_ABAP (POST)-> Εφαρμογή (τιμή #((xco_cp_json => μετασχηματισμός-> howlcore_to_camel_case))-> to_string (). "Στείλτε το JSON του Post στο Server και επιστρέψτε τα δεδομένα απόκρισης (URL) = |< base_url >/< post-id >|. Δεδομένα (πελάτης) = create_client (url). Δεδομένα (req) = πελάτης-> get_http_request (). req-> set_text (json_post). req-> set_header_field (i_name = content_type i_value = json_content). αποτέλεσμα = πελάτης-> execute (IF_WEB_HTTP_CLIENT => PUT)-> get_text (). Πελάτης-> Κλείσιμο (). Endmethod.
Διαγραφή ανάρτησης
Η διαγραφή μιας ανάρτησης είναι το απλούστερο αίτημα. Απλά παίρνουμε το αναγνωριστικό και στείλουμε ένα αίτημα διαγραφής HTTP στη διεύθυνση URL της συγκεκριμένης ανάρτησης. Για να αφήσουμε τον χρήστη εάν κάτι πάει στραβά, ελέγξουμε τον διακομιστή’S Code Response (θα πρέπει να είναι 200 - σημαίνει OK).
delete_post Εισαγωγή ID Τύπος I Αύξηση CX_STATIC_CHECK
Μέθοδος delete_post. Δεδομένα (url) = |< base_url >/< id >|. Δεδομένα (πελάτης) = create_client (url). Δεδομένα (απάντηση) = πελάτης-> execute (IF_WEB_HTTP_CLIENT => DELETE). Εάν η απάντηση-> get_status () -code ne 200. Αυξήστε τον τύπο εξαίρεσης CX_WEB_HTTP_CLIENT_ERROR. ΤΕΛΟΣ ΕΑΝ. Endmethod.
Δοκιμάζοντας τον κωδικό μας
Τώρα που έχουμε παράσχει όλες τις λειτουργίες CRUD, ας’να τα ελέγξω! Για να το κάνουμε αυτό, θα εφαρμόσουμε το IF_OA_ADT_CLASSRUN διασύνδεση, η οποία επιτρέπει την εκτέλεση μιας κατηγορίας ως εφαρμογή κονσόλας. Έχει μια κύρια μέθοδο που εκτελείται – παρόμοια με την Java.
Μέθοδος IF_OO_ADT_CLASSRUN ~ MAIN. ΔΟΚΙΜΑΣΤΕ. "Διαβάστε τα δεδομένα (all_posts) = read_posts (). Δεδομένα (first_post) = read_single_post (1). "Δημιουργία δεδομένων (create_response) = create_post (τιμή #(user_id = 7 title = 'Γεια σας, κόσμος!'σώμα =' :) '))). "Ενημέρωση first_post-user_id = 777. Δεδομένα (update_response) = update_post (first_post). "Διαγραφή delete_post (9). "Αποτελέσματα εκτύπωσης out-> write (all_posts). out-> write (first_post). out-> write (create_response). out-> write (update_response). Catch CX_Root σε δεδομένα (exc). out-> write (exc-> get_text ()). Τελικός. Endmethod.
Τρέχοντας με το F9 εκτυπώνει την ακόλουθη έξοδο:
Αρχή της εξόδου στην κονσόλα ABAP
Τέλος της εξόδου στην κονσόλα ABAP
συμπέρασμα
Αυτό τελειώνει το σεμινάριο για τον τρόπο κατανάλωσης API REST στο Cloud ABAP. Ελπίζω να είναι χρήσιμο για εσάς. Εάν αισθάνεστε εκεί’S Οποιαδήποτε σημεία βελτιώσεων, ή έχετε οποιεσδήποτε ερωτήσεις ή σχόλια για μένα, ενημερώστε με στα σχόλια!
Πλήρης κωδικός
Class zss_tester_2 Ορισμός Δημόσια Τελική Δημιουργία Δημόσια. Δημόσιο τμήμα. Διεπαφές: IF_OO_ADT_CLASSRUN. Τύποι: Begin of Post_s, User_ID Τύπος Ι, ID Τύπος I, Τύπος Τίτλος Σειρά, Τύπος Σώματος Σειρά, Τέλος Post_s, Post_tt Τύπος Πίνακας post_s με κενό κλειδί, Begin of Post_without_id_s, User_ID Τύπος Ι, Τύπος Τίτλος String, String Τύπου Σώματος, Τέλος του post_without_id_s. Μέθοδοι: Create_Client Εισαγωγή Τύπος URL Τύπος Επιστροφή Τύπος Επιστροφής (Αποτέλεσμα) Τύπος Ref To IF_WEB_HTTP_CLIENT RAUSING CX_STATIC_CHECK, read_posts returning typaties_ttaties apost agotion _id_s Επιστημονική τιμή (αποτέλεσμα) Τύπος συμβολοσειράς CX_STATIC_CHECK, UPDATE_POST ΕΙΣΑΓΩΓΗ POST Τύπος post_s Επιστρέφοντας τιμή (αποτέλεσμα) Τύπος συμβολοσειράς ρύθμισης cx_static_check, delete_post Εισαγωγή ID τύπου I Raising_static_check. Ιδιωτική ενότητα. Σταθερές: τιμή συμβολοσειράς τύπου base_url 'https: // jsonplaceholder.τυπικός κώδικας.com/posts ', content_type Τύπος String Value' Content-Type ', JSON_CONTENT ΤΥΠΟΣ ΤΥΠΟΣ ΑΝΤΙΜΕΤΩΠΙΣΗ' Εφαρμογή/JSON; charset = utf-8 '. Τελικός κλάδος. Κατηγορία ZSS_TESTER_2 Εφαρμογή. Μέθοδος IF_OO_ADT_CLASSRUN ~ MAIN. ΔΟΚΙΜΑΣΤΕ. "Διαβάστε τα δεδομένα (all_posts) = read_posts (). Δεδομένα (first_post) = read_single_post (1). "Δημιουργία δεδομένων (create_response) = create_post (τιμή #(user_id = 7 title = 'Γεια σας, κόσμος!'σώμα =' :) '))). "Ενημέρωση first_post-user_id = 777. Δεδομένα (update_response) = update_post (first_post). "Διαγραφή delete_post (9). "Αποτελέσματα εκτύπωσης out-> write (all_posts). out-> write (first_post). out-> write (create_response). out-> write (update_response). Catch CX_Root σε δεδομένα (exc). out-> write (exc-> get_text ()). Τελικός. Endmethod. Μέθοδος Create_Client. Δεδομένα (DEST) = CL_HTTP_DESTINIA_PROVIDER => CREATE_BY_URL (URL). Αποτέλεσμα = CL_WEB_HTTP_CLIENT_MANAGER => CREATE_BY_HTTP_DESTINIA. Endmethod. Μέθοδος read_posts. "Αποκτήστε το JSON όλων των δεδομένων δεδομένων (URL) = |< base_url >|. Δεδομένα (πελάτης) = create_client (url). Δεδομένα (απάντηση) = πελάτης-> execute (if_web_http_client => get)-> get_text (). Πελάτης-> Κλείσιμο (). "Μετατροπή JSON σε post Πίνακας XCO_CP_JSON => DATA-> FROM_STRING (Response)-> Εφαρμογή (τιμή #((xco_cp_json => μετασχηματισμός-> camel_case_to_underscore)))-> write_to (ref #(αποτέλεσμα)). Endmethod. Μέθοδος read_single_post. "Αποκτήστε το JSON για δεδομένα εισόδου post ID (URL) = |< base_url >/< id >|. Δεδομένα (πελάτης) = create_client (url). Δεδομένα (απάντηση) = πελάτης-> execute (if_web_http_client => get)-> get_text (). Πελάτης-> Κλείσιμο (). "Μετατροπή JSON σε δομή post xco_cp_json => data-> from_string (απάντηση)-> Εφαρμογή (τιμή #((xco_cp_json => μετασχηματισμός-> camel_case_to_underscore)))-> write_to (ref #(αποτέλεσμα)). Endmethod. Μέθοδος Create_Post. "Μετατροπή της ανάρτησης εισόδου σε δεδομένα JSON (json_post) = xco_cp_json => data-> from_abap (post_without_id)-> apply (τιμή #. "Στείλτε το JSON του Post στο Server και επιστρέψτε τα δεδομένα απόκρισης (URL) = |< base_url >|. Δεδομένα (πελάτης) = create_client (url). Δεδομένα (req) = πελάτης-> get_http_request (). req-> set_text (json_post). req-> set_header_field (i_name = content_type i_value = json_content). Αποτέλεσμα = Πελάτης-> Εκτέλεση (IF_WEB_HTTP_CLIENT => POST)-> get_text (). Πελάτης-> Κλείσιμο (). Endmethod. Μέθοδος ενημέρωσης_Post. "Μετατρέψτε την ανάρτηση εισόδου σε δεδομένα JSON (JSON_POST) = XCO_CP_JSON => DATA-> FROM_ABAP (POST)-> Εφαρμογή (τιμή #((xco_cp_json => μετασχηματισμός-> howlcore_to_camel_case))-> to_string (). "Στείλτε το JSON του Post στο Server και επιστρέψτε τα δεδομένα απόκρισης (URL) = |< base_url >/< post-id >|. Δεδομένα (πελάτης) = create_client (url). Δεδομένα (req) = πελάτης-> get_http_request (). req-> set_text (json_post). req-> set_header_field (i_name = content_type i_value = json_content). αποτέλεσμα = πελάτης-> execute (IF_WEB_HTTP_CLIENT => PUT)-> get_text (). Πελάτης-> Κλείσιμο (). Endmethod. Μέθοδος delete_post. Δεδομένα (url) = |< base_url >/< id >|. Δεδομένα (πελάτης) = create_client (url). Δεδομένα (απάντηση) = πελάτης-> execute (IF_WEB_HTTP_CLIENT => DELETE). Εάν η απάντηση-> get_status () -code ne 200. Αυξήστε τον τύπο εξαίρεσης CX_WEB_HTTP_CLIENT_ERROR. ΤΕΛΟΣ ΕΑΝ. Endmethod. Τελικός κλάδος.
Δημιουργία API REST (κλήση μεθόδων λήψης & μετά την κλήση)
Ένα API REST είναι η διεπαφή προγραμματισμού εφαρμογών μεταφοράς αντιπροσωπευτικής κατάστασης που συμμορφώνεται με τους περιορισμούς του αρχιτεκτονικού στυλ ανάπαυσης και επιτρέπει την αλληλεπίδραση με τις υπηρεσίες RESTful Services.
Οι πιο συνηθισμένες μέθοδοι είναι: Get, Post, Put και Delete,
Αυτές οι μέθοδοι θα χρησιμοποιηθούν, ένα αίτημα GET για την ανάκτηση μιας εγγραφής, ένα αίτημα δημοσίευσης για δημιουργία ενός, ένα αίτημα για την ενημέρωση μιας εγγραφής και ένα αίτημα διαγραφής για διαγραφή ενός
Σενάριο -> Πρέπει να παρέχετε λεπτομέρειες οδηγού με βάση το αναγνωριστικό προγράμματος οδήγησης.
Βήμα 1 ->
Πίνακας βάσης δεδομένων οδηγού.
Βήμα 2 ->
Δημιουργία κλάσης χειριστή αιτήματος ‘ZCL_DRIVER_REQ_HANDLER’ και κληρονομούν με τυπική τάξη ‘Cl_resthttp_handler’
ΣΗΜΕΙΩΣΗ -> Είναι υποχρεωτικό να εφαρμόσετε τη μέθοδο GET_ROOT_HANDLER, διαφορετικά θα δώσει σφάλμα σύνταξης.
Βήμα 3 ->
Δημιουργία κατηγορίας παροχής αιτήσεων ‘Zcl_driver_req_provider’ και κληρονομούν με τυπική τάξη ‘Cl_rest_resource’
Βήμα 4 -> Τώρα εφαρμόστε τη μέθοδο IF_REST_RESOURCE ~ GET για την ανάγνωση των δεδομένων.
Αφού διαβάσετε τη μέθοδο Call /UI2 /CL_JSON => Serialize () για τη μετατροπή της δομής ABAP σε μορφή JSON.
Βήμα 5 -> Εφαρμόστε το GET_ROOT_HANDLER ΜΕΘΟΔΟΣ ΤΗΣ ΑΙΤΗΣΗΣ ΧΕΙΡΟΥΡΓΙΑΣ ΑΙΤΗΣΗΣ.
Εδώ πρέπει να συνδέσουμε την τάξη χειριστή αίτησης και την κατηγορία παροχής παροχής με βοήθεια δρομολογητή.
Βήμα 6 -> Δημιουργία στοιχείου υπηρεσίας, TCode SICF
Βήμα 7 -> Λίστα χειριστή συνδέσμων, εδώ πρέπει να καθορίσουμε την τάξη χειριστή αιτήματος μας ‘ZCL_DRIVER_REQ_HANDLER’.
Βήμα 8 -> Ενεργοποίηση υπηρεσίας.
Βήμα 9 -> Υπηρεσία δοκιμής.
Αποτέλεσμα -> Εδώ περνάμε το πρόγραμμα οδήγησης και με βάση τα δεδομένα ID εμφανίζονται σε μορφή JSON.
Μεθοδική κλήση ->>
Σενάριο -> Πρέπει να δημιουργήσουμε νέες λεπτομέρειες προγράμματος οδήγησης στη βάση δεδομένων. Όπως μπορείτε να δείτε αναγνωριστικό προγράμματος οδήγησης ‘002’ υπάρχει μόνο στο σύστημα και τώρα νέο αναγνωριστικό ‘001’ πρέπει να δημιουργηθεί.
Στη μεταβλητή LV_DATA, τα δεδομένα έρχονται σε συμβολοσειρά JSON
Call /UI2 /CL_JSON => Deserialize () Μέθοδος για τη μετατροπή της συμβολοσειράς JSON σε δομή ABAP.
Εδώ είναι η νέα καταχώρηση με ταυτότητα ‘001’
Συμπέρασμα ->
Αφού διαβάσετε αυτό το blog θα είστε σε θέση να δημιουργήσετε απλό API REST και θα έχετε επίσης μια ιδέα να διαβάζετε παραμέτρους στην κατηγορία παροχής αιτήσεων.
Μη διστάσετε να προτείνετε εάν απαιτείται οποιαδήποτε διόρθωση 🙂
Ανάπτυξη API REST στο ABAP
Σε δύο πρόσφατα ιστολόγια, έδειξα πώς να γράψω πελάτες ιστού των API REST – με XML (Demo Application Here) ή JSON (Demo Application Here) ως μορφή μεταφοράς δεδομένων. Σε αυτό το ιστολόγιο, θα επικεντρωθώ στην πλευρά του διακομιστή: Πώς να εφαρμόσετε ένα API REST ως χειριστή αιτήματος ABAP. Μπορείτε να επιθεωρήσετε όλο τον κωδικό που συζητώ εδώ στην ιστοσελίδα του Migros BSP: IT’όλα στην τάξη ZCL_JOB_DATA .
Το δέντρο ICF
Οι χειριστές αίτησης είναι κλάσεις που εφαρμόζουν τη διεπαφή IF_HTTP_EXTESION. Μια κλάση χειριστή αιτήματος μπορεί να συνδεθεί σε μια διαδρομή στη συναλλαγή SICF. Ένα εισερχόμενο αίτημα HTTP θα αναλυθεί από το πλαίσιο επικοινωνίας στο Διαδίκτυο, προσπαθώντας να ταιριάξει με τη διαδρομή αιτήματος έναντι της διαδρομής SICF. Η διαδικασία αντιστοίχισης σταματά μόλις βρεθεί ένας κόμβος με συνημμένο χειριστή αιτήματος. Εάν συμβαίνει αυτό, θα δημιουργηθεί μια παρουσία της κλάσης χειριστή και θα καλείται η μέθοδος handle_request.
Η υπηρεσία παραδείγματος είναι συνδεδεμένη στη διαδρομή /εργασία/χαρακτηριστικά. Η κλάση ZCL_JOB_DATA δηλώνεται ότι είναι υπεύθυνη για όλα τα εισερχόμενα αιτήματα όπου ξεκινά η διαδρομή αίτησης /εργασία/χαρακτηριστικά :
Πρώτη στρατηγική: Μέθοδος αιτήματος HTTP
Η εφαρμογή της μεθόδου διεπαφής if_http_extension ~ handle_request () σχηματίζει το ανώτατο επίπεδο επεξεργασίας. Ως εκ τούτου, η εφαρμογή δίνει μόνο τον τραχύ σκελετό επεξεργασίας: μια παρουσία για λειτουργίες βάσεων δεδομένων, καθώς και μια περίπτωση για την επεξεργασία της λειτουργίας των υπόλοιπων, ο χειρισμός των αιτήσεων μεταβιβάζεται σε αυτή την περίπτωση και υπάρχει ένα μπλοκ αλιευμάτων για την επεξεργασία σφαλμάτων σε περίπτωση που δεν μπορεί να καθοριστεί καμία περίπτωση για την επεξεργασία του αιτήματος. Μια τέτοια κατάσταση θα πρέπει να οδηγήσει σε απάντηση HTTP με κωδικό κατάστασης ‘400 – κακό αίτημα’.
Σε αυτό το μέρος, χρησιμοποιούμε το πρότυπο σχεδιασμού στρατηγικής: ανάλογα με τη μέθοδο HTTP (Get, Put, Post, Delete, Options), δημιουργείται μια συγκεκριμένη εμφάνιση. Κάθε πιθανή εμφάνιση αντιστοιχεί σε μια συγκεκριμένη στρατηγική.
Μέθοδος IF_HTTP_EXTENSING ~ HULLE_REQUEST . Δεδομένα: Τύπος LO_DB Ref to LIF_DB, LO_REST TYPE REF TO LIF_REST, LO_INVALID_METHOD Τύπος Αναφοράς στο ZCX_ERROR, LV_REASON TYPH String. δοκιμάστε. * Αντικείμενο για λειτουργίες βάσης δεδομένων LO_DB ?= get_db (io_server = διακομιστής). * Αποκτήστε τη σωστή εμφάνιση χειριστή ανάπαυσης, ανάλογα με το ρήμα (Get, Put, Post, Options, Delete) lo_rest ?= get_rest (io_server = server io_db = lo_db). * Κάντε τη λειτουργία lo_rest-> handle_request (). Πιάστε το ZCX_NOT_FOUND σε lo_invalid_method. lv_reason = lo_invalid_method-> get_text (). Server-> Response-> SET_STATUS (κωδικός = 400 "Bad Request Requies = LV_REASON). τελικός. endmethod.
Χρησιμοποιούμε μια σύμβαση ονομασίας για τον προσδιορισμό των στιγμιότυπων: το class lcl_rest_get θα συσχετιστεί με το ρήμα http get, lcl_rest_put με put και ούτω καθεξής. Όλες αυτές οι κατηγορίες εφαρμόζουν τη διεπαφή LIF_REST. Με αυτόν τον τρόπο, μπορούμε να χρησιμοποιήσουμε τη δημιουργία δυναμικής στιγμής. Εναλλακτικά, θα μπορούσαμε να γράψουμε μια μεγάλη υπόθεση… δήλωση με πολλούς όταν’μικρό. Το πλεονέκτημα της υπόθεσης θα ήταν ότι το Δημιουργία αντικειμένου Η δήλωση θα μπορούσε να ελεγχθεί στατικά για συντακτική ορθότητα. Έχω επιλέξει τη δυναμική παραλλαγή αφού το βρίσκω σαφέστερο και πιο ευανάγνωστο από ένα σωρό όταν κλαδιά.
Παρατηρήστε ότι η μέθοδος αίτησης HTTP (Get, Put, Post,…) είναι διαθέσιμη ως πεδίο ψευδοεξαρτώμενων κεφαλίδων με το όνομα ‘~ request_method’:
μέθοδος get_rest. Δεδομένα: LV_CLASSNAME Τύπος SEOCLSNAME, LV_METHOD Τύπος String, LV_Message Τύπος κειμένου255. lv_method = io_server-> request-> get_header_field ('~ request_method'). concatenate 'lcl_rest_' lv_method σε lv_classname. δοκιμάστε. Δημιουργία αντικειμένου eo_rest Τύπος (lv_classname) Εξαγωγή IO_Request = io_server-> Αίτημα io_response = io_server-> απάντηση IO_DB = io_db. Πιάσε CX_SY_CREATE_OBJECT_ERROR. lv_message = 'method' '' & '' Δεν υποστηρίζεται '(001). Αντικαταστήστε το '&' στο lv_message με lv_method. _raise_with_text zcx_not_found lv_message. τελικός. endmethod.
Δεύτερη στρατηγική: Μορφή μεταφοράς δεδομένων
Τώρα έχουμε διαφορετικές κατηγορίες χειριστή για τις διαφορετικές μεθόδους αιτήματος HTTP. Αλλά για όλους αυτούς τους χειριστές, υπάρχουν μερικές κοινές εργασίες. Ένα από αυτά τα κοινά καθήκοντα είναι: να προσδιοριστεί η τρέχουσα μορφή μεταφοράς δεδομένων και να μετατρέψουμε την είσοδο – εάν είναι διαθέσιμα – σε δεδομένα ABAP και αντίστροφα: να μετατρέψουμε τα δεδομένα αποτελεσμάτων ABAP στην έξοδο με την επιθυμητή μορφή μεταφοράς δεδομένων (XML ή JSON).
Τώρα, μερικές μέθοδοι αιτήματος όπως το GE δεν απαιτούν περιεχόμενο αίτησης. Έτσι, η μετατροπή των εισερχόμενων δεδομένων πραγματοποιείται από αυτούς τους χειριστές μεθόδων που γνωρίζουν ότι χρειάζονται δεδομένα περιεχομένου. Από την άλλη πλευρά, θα υπάρχει πάντα αποτέλεσμα του ακόλουθου τύπου δεδομένων:
Τύποι: Begin of Ty_Result, Msgtype Type SymsGty, ΜΗΝΥΜΑ ΜΗΝΥΜΑ C Μήκος 255, Τύπος εργασιών ZJOBS_TAB, ΤΕΛΟΣ ΤΟΥ ΤΥΠΟΥ_RESULT.
Μπορεί να μην υπάρχουν πάντα καταχωρήσεις στον πίνακα εργασίας. Αλλά όχι κάθε στοιχείο αυτής της δομής θα είναι αρχική. Εάν δεν υπάρχει πίνακας εργασίας, τότε συνήθως θα υπάρχει ένα μήνυμα. Έτσι, η μετατροπή του αποτελέσματος μπορεί πάντα να εκτελεστεί.
Είναι λογικό να δουλεύεις με μια αφηρημένη κλάση μετατροπέα, τις συγκεκριμένες υποκατηγορίες που περιέχουν τους αλγόριθμους μετατροπής ανά τύπο περιεχομένου. Αυτή είναι η δεύτερη εφαρμογή του προτύπου στρατηγικής.
class lcl_converter Ορισμός Περίληψη. δημόσιο τμήμα. ΤΥΠΟΣ ΤΥΠΟΥ CLASS-METHODS. μέθοδοι content_type αφηρημένη τιμή επιστροφής (ev_content_type). Μέθοδοι get_entered_data Περίληψη εισαγωγής IV_CDATA Τύπος συμβολοσειράς εξαγωγής ES_JOB Τύπος zjobs Ανύψωση ZCX_PARSE_ERROR. μέθοδοι result_to_cdata αφηρημένη εισαγωγή IS_Result Τύπος TY_RESULT Εξαγωγή συμβολοσειρά τύπου EV_CDATA. τελικός κλάδος. "Ορισμός lcl_converter
Η στατική μέθοδος LCL_CONVERTER => get_instance () κάνει τη διάκριση, ανάλογα με το Αποδέχομαι Πεδίο κεφαλίδας του αιτήματος HTTP:
Κατηγορία LCL_CONURTER Εφαρμογή. μέθοδος get_instance. Εάν το IV_Accept CS 'Application/JSON'. Δημιουργία αντικειμένου eo_instance Τύπος lcl_json_converter. αλλού. Δημιουργία αντικειμένου eo_instance Τύπος lcl_xml_converter. τέλος εαν. endmethod. "get_instance endclass. "Εφαρμογή LCL_CONVERTER
Το κοινό οικόπεδο για όλα τα αιτήματα
Μπορούμε να εξαγάγουμε κοινές εργασίες σε ένα superclass lcl_rest όλων των ειδικών χειριστών μεθόδων, εφαρμόζοντας τη διεπαφή lif_rest ~ handle_request () μία φορά για όλες τις υποκατηγορίες.
Ο κοινός κώδικας στο superclasse πρέπει να αναμιχθεί με συγκεκριμένο κώδικα, που εφαρμόζεται στην υποκατηγορία και καθορίζοντας τη συγκεκριμένη συμπεριφορά αυτής της υποκατηγορίας. Για να το επιτύχουμε, καλούμε το επιθυμητό χρονικό σημείο στο lif_rest ~ handle_request (), Μια αφηρημένη μέθοδος κάνω( ), που πρέπει να επαναπροσδιοριστεί στις υποκατηγορίες. Αυτή η μέθοδος DO () θα περιέχει τη συγκεκριμένη ενέργεια.
Τώρα, η κοινή υλοποίηση LIF_REST ~ λαβή () στην υπερκλάση ορίζει μόνο τη ροή της επεξεργασίας, αφήνοντας τις συγκεκριμένες ενέργειες στις υποκατηγορίες ή σε αντιπροσώπους όπως go_converter:
- Εκτελέστε τη συγκεκριμένη ενέργεια κάνοντας κλήση κάνω(),
- Χειρισμός σφαλμάτων, με κωδικό σφάλματος HTTP 400 “Κακό αίτημα” Σε περίπτωση σφάλματος μετατροπής (λάθος εισερχόμενα δεδομένα) ή ρύθμιση δεδομένων απόκρισης για ένα μήνυμα σφάλματος σε περίπτωση σφάλματος εφαρμογής,
- Η δομή αποτελεσμάτων αντιστοιχεί στη δομή δεδομένων απόκρισης (XML ή JSON), χρησιμοποιώντας την αντίστοιχη παρουσία μετατροπέα,
- Τέλος, τα δεδομένα απόκρισης τοποθετούνται στο σώμα της απόκρισης HTTP, καθώς και ο κατάλληλος τύπος απόκρισης έχει οριστεί: Application/JSON ή TEXT/XML.
Αυτό είναι το γενικό σκίτσο – η επεξεργασία απόκρισης που ισχύει για όλα Μέθοδοι αιτήματος HTTP και για όλα Τύποι περιεχομένου (XML καθώς και JSON). Οι λεπτομέρειες περιέχονται στις ονομασμένες μεθόδους.
Μέθοδος LIF_REST ~ HULLE_REQUEST. Δεδομένα: Τύπος LO_EX Ref στο CX_ROOT, LV_CDATA Τύπος String, LS_RESULT TY_RESULT. δοκιμάστε. * Εκτελέστε τη συγκεκριμένη λειτουργία DO (Εισαγωγή es_result = ls_result). Πιάστε το ZCX_PARSE_ERROR στο lo_ex. go_response-> set_status (κωδικός = 400 "Bad Request Requies = lo_ex-> get_text ()). set_response_parameters (). ΕΠΙΣΤΡΟΦΗ. Πιάστε το ZCX_ERROR στο lo_ex. ls_result-message = lo_ex-> get_text (). ls_result-msgtype = 'e'. τελικός. * Μετατρέψτε τη δομή αποτελεσμάτων σε JSON ή XML, αντίστοιχα μεθόδους κλήσης go_converter-> result_to_cdata Εξαγωγή IS_Result = ls_result Εισαγωγή eV_cdata = lv_cdata. * Τοποθετήστε το αποτέλεσμα στη μέθοδο κλήσης του σώματος απόκρισης set_response Εξαγωγή IV_CONTENT_TYPE = GO_CONVERTER-> CONTONT_TYPE () IV_CDATA = LV_CDATA. endmethod. "handle_request
Μια συγκεκριμένη εργασία – το αίτημα θέσης
Αφήνω’S εξετάστε μια συγκεκριμένη εργασία για την απεικόνιση: το αίτημα PUT – το οποίο είναι πάντα ένα έργο για την ενημέρωση ή την εισαγωγή χαρακτηριστικών εργασίας για ένα δεδομένο αναγνωριστικό στη βάση δεδομένων. Όπως προκύπτει από το σχεδιασμό, υπάρχει μια δική του τοπική κατηγορία LCL_REST_PUT HANDLING PUT αιτήσεις. Στην πραγματικότητα, για αυτόν τον χειριστή αιτήματος, υπήρχε μόνο το κάνω Η ίδια η μέθοδος για την εφαρμογή (που είναι το απόλυτο ελάχιστο για μια συγκεκριμένη κλάση εργασιών για εφαρμογή: κάνω() είναι αφηρημένη στην τάξη γονέων. Χωρίς εφαρμογή, δεν θα μπορούσαν να κατασκευαστούν περιπτώσεις.)
Κατηγορία LCL_REST_PUT Ορισμός που κληρονομεί από το lcl_rest. προστατευόμενο τμήμα. Οι μέθοδοι επαναπροσδιορίζουν. τελικός κλάδος. "Ορισμός LCL_REST_PUT
Η εφαρμογή πηγαίνει ως εξής:
- Η εργασία με το καθορισμένο αναγνωριστικό διαβάζεται από τη βάση δεδομένων (αν Προσδιορίστηκε ένα αναγνωριστικό – για νέες εργασίες, αυτό δεν συμβαίνει),
- Τα καταχωρημένα δεδομένα θα αναλυθούν σε δομή LS_JOB, χρησιμοποιώντας το κατάλληλο go_converter παράδειγμα,
- Και τέλος, το αποθηκεύσετε() Η μέθοδος καλείται. Εφαρμόζεται στην υπερκλάση, αφού άλλες μέθοδοι αίτησης το χρησιμοποιούν επίσης.
Κατηγορία LCL_REST_PUT Εφαρμογή. μέθοδος. Δεδομένα: Τύπος LS_JOB ZJOBS, LV_ID TYPE ZJOBS-ID. δοκιμάστε. get_job_by_id (εισαγωγή es_job = ls_job). lv_id = ls_job-id. Πιάστε το ZCX_NOT_FOUND. τελικός. Καθαρίστε το LS_JOB. Μέθοδος κλήσης go_converter-> get_entered_data Εξαγωγή iv_cdata = go_request-> get_cdata () Εισαγωγή es_job = ls_job. Εάν το ls_job δεν είναι αρχικό. Εάν το LV_ID δεν είναι αρχικό. ls_job-id = lv_id. τέλος εαν. Αποθήκευση (αλλαγή cs_job = ls_job). es_result-message = 'Job & έχει αποθηκευτεί' (002). Αντικαταστήστε το '&' στο es_result-message με το ls_job-id. es_result-msgtype = 's'. "Εισαγωγή μηνυμάτων επιτυχίας ls_job σε πίνακα es_result-jobs. τέλος εαν. endmethod. "Do Endclass. "Εφαρμογή LCL_REST_PUT
Σημειώστε ότι η εφαρμογή αυτής της εργασίας δεν’T Φροντίζει για τη δομή δεδομένων HTTP, τη μορφή που χρησιμοποιείται πραγματικά, ούτε για τις λεπτομέρειες της μορφής δεδομένων μεταφοράς. Απλά λειτουργεί με δομές δεδομένων ABAP ls_job για την είσοδο και es_result για την έξοδο.
Συνεδρία, ταυτότητα και κλείδωμα
Στις εφαρμογές δοκιμών (ούτε στην εφαρμογή JSON ούτε στην εφαρμογή XML), δεν υπάρχει ούτε σύνδεση ούτε enqueue των δεδομένων. Δεδομένου ότι οι εφαρμογές είναι ανοιχτές για όλους, αυτό λειτουργεί μόνο από τότε που δεν κάνω’Τ Πραγματικά Λειτουργήστε σε έναν πίνακα βάσης δεδομένων zjobs. Στην πραγματικότητα, κάθε πελάτης που καλεί την εφαρμογή συνεργάζεται με τα δικά του δεδομένα συνεδρίας, οπότε δεν το κάνει’δεν έρχεται σε σύγκρουση με άλλους χρήστες’ λειτουργίες και ο ίδιος δεν διαταράσσεται από άλλους χρήστες. Τα δεδομένα της περιόδου σύνδεσης διατηρούνται γι ‘αυτόν ως cookies από την πλευρά του διακομιστή, επιβιώνοντας το βήμα ενός διαλόγου (για παράδειγμα η επαναφόρτωση της σελίδας θα αναπαράγει την τρέχουσα κατάσταση των δεδομένων).
Όταν ένα web-client είναι γραμμένο ως BSP, υπάρχει ένα id-id που είναι διαθέσιμο στο χαρακτηριστικό runtime-> server_id. Αυτό το αναγνωριστικό συνεδρίας προσδιορίζει τη συγκεκριμένη παρουσία του προγράμματος περιήγησης που έκανε το αίτημα. Στην πλευρά του πελάτη, αυτό το id-id περιέχεται πάντα σε ένα cookie που ονομάζεται sap-appcontext. Εάν μια εφαρμογή έχει κατάσταση που πρέπει να διατηρηθεί με αναγνωριστικό περιόδου σύνδεσης, το αναγνωριστικό πρέπει να εξαχθεί από το cookie SAP-AppContext και πρέπει να περάσει ως παράμετρο ερωτήματος με όλα τα αιτήματα AJAX. Εδώ είναι η λειτουργία που εξάγει το SAP-AppContext από το Cookie:
λειτουργία get_appcontext () < var lAppcontextCookie = document.cookie.match(/sap-appcontext=(.*?)(?:;|$)/); return lAppcontextCookie && ( lAppcontextCookie.length >= 2) && unescape (lappcontextCookie [1]) || ""; >
Το AppContext που επέστρεψε από αυτή τη λειτουργία, μπορεί να περάσει ως παράμετρο ερωτήματος με κάθε αίτημα Ajax. Από την πλευρά του διακομιστή, το αναγνωριστικό περιόδου σύνδεσης μπορεί να εξαχθεί από αυτήν την παράμετρο:
μέθοδος get_session_id. Δεδομένα: LV_APP_Context Type String, LV_APP_CONTEXT64 Τύπος συμβολοσειράς. * Διαβάστε το πεδίο φόρμας, που παρέχεται από το αίτημα AJAX LV_APP_CONTEXT64 = IO_SERVER-> Αίτημα-> get_form_field ('sap_appcontext'). Εάν το lv_app_context64 δεν είναι αρχικό. * BASE64 DECODE LV_APP_CONTEXT = CL_HTTP_UTITICT => DECODE_BASE64 (LV_APP_CONTEXT64). * Εξαγάγετε το Session-ID Find regex 'SAP-SessionId = ([^,]+) (?: | $) 'Στο LV_APP_CONTEXT Submatches eV_session_id. τέλος εαν. Εάν το eV_session_id είναι αρχικό. ev_session_id = io_server-> session_id. τέλος εαν. endmethod.
Ως εναλλακτικό, στη γραμμή 22, χρησιμοποιείται το Server-> Session_id. Ωστόσο, θα υπάρξει ένας νέος διακομιστής-> session_id για κάθε αίτημα, το οποίο έχει ως αποτέλεσμα νέα δεδομένα περιόδου σύνδεσης με κάθε βήμα διαλόγου. Εάν χρειάζεστε πραγματικά διαχείριση περιόδου σύνδεσης, είναι σημαντικό το αναγνωριστικό περιόδου σύνδεσης να μεταβιβάζεται στο διακομιστή.
Είναι καλή ιδέα να συνδυάσετε το αναγνωριστικό περιόδου σύνδεσης με τη διαδικασία σύνδεσης: Εάν ο χρήστης πιστοποιεί, το πρόγραμμα περιήγησής του λαμβάνει ένα id-id με περιορισμένη εγκυρότητα. Αυτό το id-id πρέπει να περάσει με κάθε διαδοχική λειτουργία ανάπαυσης. Στο ABAP, μπορεί να χρησιμοποιηθεί για την αποθήκευση και την ανάκτηση ειδικών δεδομένων για τη συνεδρία στον πίνακα βάσης δεδομένων Sscookie, μέσω της κλάσης πρόσβασης στη βάση δεδομένων CL_BSP_SERVER_SIDE_COOKIE.
Αυτή η σύζευξη ενός αναγνωριστικού περιόδου σύνδεσης με σύνδεση είναι – περίπου – ο τρόπος με τον οποίο λειτουργεί το REST API για το κέντρο ποιότητας HP.
Χρησιμοποιώντας το ABAP’ΣΥΝΕΡΓΑΤΕΣ JSON CONVERTER
Ενώ η παρουσία του μετατροπέα XML είναι αρκετά απλή για να εφαρμοστεί -καλώντας έναν μετασχηματισμό XSLT για XML -> ABAP, και ένα άλλο για το δρόμο πίσω -μπορεί να αποτελεί έκπληξη το γεγονός ότι η μετατροπή JSON μπορεί να αντιμετωπιστεί ακριβώς με τον ίδιο τρόπο: με μετασχηματισμούς. Αυτό είναι δυνατό από το μετασχηματισμός κλήσεων Η δήλωση υποστηρίζει τη μορφή JSON (τουλάχιστον σύμφωνα με το SAP_BASIS 702). Το JSON είναι αυτόματο ανιχνευμένο και αναλυθεί σε μια ενδιάμεση μορφή JSON-XML. Αυτό μπορεί να υποβληθεί σε επεξεργασία με αυθαίρετο μετασχηματισμό XSLT και να μετατραπεί σε άλλα έγγραφα XML ή σε δεδομένα ABAP.
Για παράδειγμα, ένα αίτημα θέσης από τη δοκιμαστική μας εφαρμογή μπορεί να στείλει τα ακόλουθα δεδομένα JSON στο διακομιστή:
Εάν έχει περάσει μια συμβολοσειρά με αυτό το περιεχόμενο “Πηγή XML” προς τον Abap’S Μεταμόρφωση κλήσεων S, το JSON θα αναλυθεί σε μια εκπροσώπηση XML όπως αυτή (η μορφή είναι εύκολη στην κατανόηση – νομίζω ότι μια αποκλεισμένη εξήγηση δεν είναι απαραίτητη εδώ):
Κατά την επεξεργασία ενός αυθαίρετου μετασχηματισμού XSLT, με τη δήλωση μετασχηματισμού κλήσεων και τη μετάβαση σε μια συμβολοσειρά JSON ως πηγή, το XSLT θα λειτουργήσει σε αυτή την εσωτερική αναπαράσταση JSON-XML. Είναι εύκολο να μετατραπεί ένα τέτοιο έγγραφο JSON-XML σε δεδομένα ABAP-να είναι πιο ακριβής: να το μετατρέψετε σε μια εκπροσώπηση ASXML των δεδομένων ABAP. Για παράδειγμα, εξετάστε τον ακόλουθο μετασχηματισμό XSLT:
Όταν εφαρμόζεται στη συμβολοσειρά JSON, θα παράγει το ακόλουθο αποτέλεσμα:
0001 Rsnast00 Uxpd_kube_kv 2 Χ Rainer Zufall Εξάγετε όλες τις επιβεβαιώσεις παραγγελίας πωλήσεων
Αυτή είναι μια έγκυρη περιγραφή δεδομένων ABAP. Εάν ο μετασχηματισμός ονομάζεται ZJSON2JOB, τα δεδομένα μπορούν απλά να εισαχθούν σε μια δομή δεδομένων ABAP με το αναγνωριστικό στοιχείων, το repid και ούτω καθεξής – όπως και η δομή es_job στην ακόλουθη εφαρμογή του μετατροπέα JSON.
Κατηγορία LCL_JSON_CONVERTER ΕΦΑΡΜΟΓΗ. μέθοδος get_entered_data. Δεδομένα: Τύπος lo_ex ref στο cx_transformation_error. σαφές es_job. Ελέγξτε IV_CDATA CN Space. δοκιμάστε. Μετασχηματισμός κλήσης ZJSON2JOB Πηγή XML IV_CDATA Αποτέλεσμα εργασίας = ES_JOB. Πιάσε το CX_Transformation_error στο lo_ex. raise_parse_error (lo_ex). τελικός. endmethod. "get_entered_data
Πολλά πράγματα μπορούν να γίνουν με το αναγνωριστικό μετασχηματισμού ταυτότητας, χωρίς να χρειάζεται να ορίσετε ένα δικό σας μετασχηματισμό XSLT. Εάν μπορείτε να επιβάλλετε τη δομή δεδομένων JSON που θα χρησιμοποιηθεί στην εφαρμογή ιστού, είναι πλεονέκτημα να χρησιμοποιήσετε το τέτοιο “κανονικός” δομή. Για παράδειγμα, εξετάστε το ενδεχόμενο να τυλίξετε το hash JSON με τα χαρακτηριστικά εργασίας σε άλλο κατακερματισμό, καθιστώντας την αξία για κάποιο συμβολικό όνομα κλειδιού όπως “ΔΟΥΛΕΙΑ”:
Στη συνέχεια, τα δεδομένα θα μπορούσαν να αναλυθούν σε μια δομή χωρίς την ανάγκη ανάπτυξης ενός προσαρμοσμένου μετασχηματισμού XSLT, απλά χρησιμοποιώντας την ταυτότητα:
Πηγή αναγνωριστικού μετασχηματισμού κλήσεων XML IV_CDATA Αποτέλεσμα εργασίας = es_job.
Σε αυτό το παράδειγμα, δεδομένου ότι έχω γράψει το web-client και την επεξεργασία από την πλευρά του διακομιστή, θα μπορούσα να το επιλέξω περισσότερο “κανονικός” μορφή. Αλλά με το να μην το επιλέξω, έμαθα πώς να δουλεύω με πιο ευέλικτες μορφές δεδομένων JSON.
Υπάρχουν διάφοροι λόγοι για την εργασία “μη κανονικός” JSON αναπαραστάσεις των δεδομένων ABAP:
- Μια μορφή JSON μπορεί να σχεδιαστεί υπέρ της εφαρμογής Web – για τη βελτιστοποίηση της αναγνωσιμότητας του κώδικα JavaScript του πελάτη που λειτουργεί στα δεδομένα.
- Μπορεί να υπάρχουν εξαρτήματα πελάτη που απαιτούν συγκεκριμένες μορφές JSON. Για παράδειγμα, το jQuery DataTable απαιτεί τα δεδομένα πίνακα να περάσουν ως μια σειρά από συστοιχίες: http: // www.φουσκωτά.net/datatables/παραδείγματα/data_sources/ajax.HTML
- Οι υπηρεσίες τρίτων με βάση το JSON μπορούν να καλούνται από την πλευρά ABAP (με αντικείμενο πελάτη HTTP)
- Τα δεδομένα ABAP ενδέχεται να είναι αρμόδιος στα βασικά δεδομένα, μειώνοντας το μέγεθος του μηνύματος στα δεδομένα που πραγματικά χρειάζονται.
Απλώς για να το δείξω, ας’να ρίξετε μια ματιά στην άλλη μετατροπή – τη διέξοδο από το διακομιστή στον πελάτη. Και πάλι, η μορφή διαφέρει ελαφρώς από το “κανονικός” Format JSON, η οποία θα απλοποιήσει σημαντικά το χειρισμό της ABAP. Όπως αναφέρθηκε, περιέχει η δομή δεδομένων αποτελεσμάτων
- ένα μήνυμα,
- ένας τύπος μηνύματος,
- και έναν πίνακα χαρακτηριστικών εργασίας:
Τύποι: Begin of Ty_Result, Msgtype Type SymsGty, ΜΗΝΥΜΑ ΜΗΝΥΜΑ C Μήκος 255, Τύπος εργασιών ZJOBS_TAB, ΤΕΛΟΣ ΤΟΥ ΤΥΠΟΥ_RESULT.
Η ακόλουθη μορφή θα ήταν ένα τέλειο κρεμαστό κόσμημα για αυτή τη δομή. Θα μπορούσε απλώς να παράγεται με τον μετασχηματισμό ταυτότητας, περνώντας ως “Αποτέλεσμα πηγής = ls_result” (που ls_result είναι μια δομή τύπου ty_result)
- Όλα τα ονόματα εξαρτημάτων ταιριάζουν απόλυτα με τα ονόματα κλειδιών κατακερματισμού JSON,
- Ένας εσωτερικός πίνακας χαρτογραφείται ως μια σειρά από hashs JSON, κάθε hash που αντιπροσωπεύει μία καταχώρηση του πίνακα,
- Και υπάρχει ένα κορυφαίο hash με συμβολικό όνομα “ΑΠΟΤΕΛΕΣΜΑ” για το πλήρες πράγμα:
Αλλά η μορφή JSON που υποστηρίζει το REST API, διαφέρει σε ορισμένες λεπτομέρειες:
- Οι εργασίες δεν έχουν σχεδιαστεί ως πίνακας, αλλά ως hash, με το id ως κλειδί hash.
- Δεν υπάρχει περιττό hash, τυλίγοντας το όλο θέμα ως την αξία για κάποιο κλειδί.
- Το στοιχείο για το msgtype είναι διαφορετικό. Ονομάζεται απλά τύπος.
Ακολουθεί ένα παράδειγμα εμφάνισης:
< "JOBS": < "0001": < "REPID": "RSNAST00", "VARID": "UXPD_KUBE_KV", "PRIO": "2", "RESTART": "X", "CONTACT": "Rainer Zufall", "DESCR": "Output all sales order confirmations" >, "0002": < "REPID": "RBDAPP01", "VARID": "UXPD_EDI_GUT02", "PRIO": "3", "RESTART": "X", "CONTACT": "Herbert Hurtig", "DESCR": "Credit Memos" >>, "Μήνυμα": "", "Τύπος": "">
Προχωρούμε με παρόμοιο τρόπο όπως παραπάνω, μόνο προς την άλλη κατεύθυνση: με βάση τον τύπο δεδομένων ABAP ty_result, Γράφουμε έναν μετασχηματισμό XSLT για να αποκτήσουμε την εσωτερική μορφή JSON-XML που αντιστοιχεί σε αυτή τη συμβολοσειρά δεδομένων JSON.
Η μορφή δεδομένων JSON-XML της επιθυμητής συμβολοσειρά δεδομένων JSON μοιάζει με αυτό:
Αυτός είναι ο στόχος που πρέπει να ληφθεί ως αποτέλεσμα του μετασχηματισμού. Από την άλλη πλευρά, η μορφή ASXML της δομής ty_result μοιάζει με αυτό:
0001 Rsnast00 Uxpd_kube_kv 2 Χ Rainer Zufall Εξάγετε όλες τις επιβεβαιώσεις παραγγελίας πωλήσεων 0002 RBDAPP01 Uxpd_edi_gut02 3 Χ Herbert Hurtig Πιστωτικά σημεία Δοκιμή Εγώ
Και αυτό είναι το πρόγραμμα XSLT που θα εκτελέσει το μετασχηματισμό:
Το βλέπουμε, βασικά, για κάθε απόκλιση από το “κανονικός” Εκπροσώπηση JSON των δεδομένων ABAP, υπάρχει ένα πρότυπο στον μετασχηματισμό XSLT που χειρίζεται αυτή την απόκλιση. Για παράδειγμα, ο διαφορετικός τύπος ονόματος αντί του msgtype στον στόχο αντιμετωπίζεται με το πρότυπο
Το αναγνωριστικό πρέπει να αναδιαμορφωθεί: από το να είναι ένα απλό χαρακτηριστικό της δομής δεδομένων Zjobs, πρέπει να ανυψωθεί ένα επίπεδο υψηλότερο για να γίνει το κλειδί ενός κατακερματισμού. Όλα τα άλλα χαρακτηριστικά, εκτός από το ID, αντιγράφονται ως κόμβοι συμβολοσειράς στο αποτέλεσμα. Γι ‘αυτό, αυτά τα δύο πρότυπα είναι απαραίτητα:
Η χαρτογράφηση του αντικειμένου δεδομένων TY_RESULT σε μια σειρά JSON της αναμενόμενης μορφής, εκτελείται τώρα στο ABAP με τον ακόλουθο κωδικό:
μέθοδος result_to_cdata. Δεδομένα: Τύπος lo_writer ref στο cl_sxml_string_writer. lo_writer = cl_sxml_string_writer => Δημιουργία (type = if_sxml => co_xt_json). μετασχηματισμός κλήσεων zjobs2json source data = is_result αποτέλεσμα xml lo_writer. ev_cdata = cl_abap_codepage => convert_from (lo_writer-> get_output ()). endmethod. "Αποτέλεσμα_to_cdata
Οτι’S All: Το EV_CDATA θα περιέχει στη συνέχεια τη συμβολοσειρά δεδομένων JSON, που θα τοποθετηθεί στο σώμα απόκρισης HTTP.
Περίληψη
Περιέγραψα μερικά τυπικά θέματα σχετικά με την εφαρμογή των API REST στο ABAP. Είναι δυνατόν να διατηρείτε ξεχωριστές ανησυχίες σε ξεχωριστές (τοπικές ή παγκόσμιες) τάξεις εφαρμόζοντας μοτίβα όπως στρατηγική. Αυτός είναι ο τρόπος με τον οποίο οργανώνεται η τάξη ZCL_JOB_DATA, που εξυπηρετεί το Demo REST API, (οι βασικές ιδέες έχουν συζητηθεί σε αυτό το blog):
Πώς να δημιουργήσετε ένα API REST με το SAP ABAP και να εφαρμόσετε τη δρομολόγηση MVC1
Σε αυτήν την ανάρτηση ιστολογίου, θα ήθελα να δείξω πώς να δημιουργήσετε API REST και πώς να εφαρμόσετε τη δρομολόγηση MVC1 για να χειριστείτε διαφορετικά αίτημα απλά από μια κλάση ελεγκτή.
Γι ‘αυτό, πρώτα θα δημιουργήσουμε κλάση χειριστή και ελεγκτή για δομή ανάπαυσης. Στη συνέχεια, θα προσθέσουμε την κλάση και την κλάση μοντέλου MVC1 Controller για να επεξεργαστούμε την επιχειρηματική λογική.
Και τελικά θα δημιουργήσουμε μια υπηρεσία για να χειριστούμε τα αιτήματα ανάπαυσης.
Στο τέλος της θέσης, υπάρχουν παραδείγματα προγράμματος περιήγησης στο Web, Postman και ABAP για το ίδιο API REST.
Για να διαβάσετε περισσότερα για το SAP REST, ρίξτε μια ματιά στο σεμινάριο ανάπαυσης.
Δημιουργήστε τις ακόλουθες δομές;
- Zrest_s_resp_state
- Zrest_s_response
- Zrest_s_request
- Zrest_s_resp_state
- Zrest_s_response
Τώρα θα το κάνουμε Δημιουργία τάξεων.
Στοίβα κλήσεων για κλήση
- Zrest_cl_defs
- Zrest_cl_model
- Zrest_cl_req_controller
- Zrest_cl_req_http_handler
- Zrest_cl_http_handler
Class zrest_cl_defs Ορισμός Δημόσια Δημιουργία Δημόσιου . Δημόσιο τμήμα. Σταθερές C_STATE_SUCCESS Τύπος char1 Αξία '## no_text. CONTANTS C_STATE_WARNING Τύπος char1 Αξία 'w' ## no_text. CONTANTS C_STATE_ERROR Τύπος char1 Αξία 'e' ## no_text. Προστατευόμενο τμήμα. Ιδιωτική ενότητα. Τελικός κλάδος. Κατηγορία zrest_cl_defs Εφαρμογή. Τελικός κλάδος.
Class zrest_cl_model ορισμός δημόσια τελική Δημιουργία Δημόσια . Δημόσιο τμήμα. Μέθοδοι εξαγωγής get_datetime !response_body type zrest_s_response-body !Τύπος κατάστασης zrest_s_response-state . Προστατευόμενο τμήμα. Ιδιωτική ενότητα. Τελικός κλάδος. Κατηγορία zrest_cl_model υλοποίηση. * ---------------------------------------------------------------------------------------+ * Instance Public Method ZREST_CL_MODEL->GET_DATETIME * +-------------------------------------------------------------------------------------------------+ * | [Μέθοδος get_datetime. Δεδομένα: Τύπος EXREF Ref στο CX_ROOT. ΔΟΚΙΜΑΣΤΕ . Τύποι: Begin of Ty_res, DateTime Type Tzntimestp, End of Ty_res. Δεδομένα: Τύπος res ty_res. res-datetime = sy-datum && sy-uzeit. response_body = /ui2 /cl_json => serialize (data exporting = res). State-State = zrest_cl_defs => c_state_success. Πιάσε το CX_Root σε Exref. State-State = zrest_cl_defs => c_state_error. state-state_text = exref-> get_text (). Τελικός. Endmethod. Τελικός κλάδος.
Class zrest_cl_req_controller Ορισμός Δημόσια Τελική Δημόσια Δημόσια Δημόσια . Δημόσιο τμήμα. Μέθοδοι Process_Request Εισαγωγή !Εξαγωγή συμβολοσειράς τύπου Req_json !response_json Τύπος συμβολοσειράς !response_stc Τύπος zrest_s_response . Προστατευόμενο τμήμα. Ιδιωτική ενότητα. Σταθερές: C_REQ_GET_DATETIME TYPE ZREST_E_REQ_ID Τιμή '1001'. Μέθοδοι CONV_STC_TO_JSON ΕΙΣΑΓΩΓΗ ΑΠΑΝΤΗΣΗ_STC Τύπος ZREST_S_RESPONSE Επιστροφή τιμής (αποτέλεσμα) Τύπος συμβολοσειράς. Τελικός κλάδος. Κατηγορία zrest_cl_req_controller Εφαρμογή. * ---------------------------------------------------------------------------------------+ * Instance Ιδιωτική μέθοδος zrest_cl_req_controller-> conv_stc_to_json * + ------------------------------------------------------------------------------------------------------------------------------------------. [--->] response_stc Τύπος zrest_s_response * | [Μέθοδος conv_stc_to_json. Δεδομένα: Τύπος EXREF Ref στο CX_ROOT. ΔΟΚΙΜΑΣΤΕ . αποτέλεσμα = /ui2 /cl_json => serialize (εξαγωγή δεδομένων = response_stc). Πιάσε CX_Root. Αποτέλεσμα = exref-> get_text (). Τελικός. Endmethod. * ---------------------------------------------------------------------------------------+ * Instance Public Method ZREST_CL_REQ_CONTROLLER->PROCESS_REQUEST * +-------------------------------------------------------------------------------------------------+ * | [--->] REQ_JSON Τύπος συμβολοσειρά * | [Μέθοδος Process_Request. Δεδομένα: Τύπος EXREF Ref στο CX_ROOT. ΔΟΚΙΜΑΣΤΕ . Δεδομένα Req_stc Τύπος ZRest_S_Request. /ui2/cl_json => deserialize (Εξαγωγή json = req_json αλλαγή δεδομένων = req_stc). Εάν το req_stc-id δεν είναι αρχικό. Δεδομένα (μοντέλο) = νέο ZRest_Cl_Model (). Εάν req_stc-id eq c_req_get_datetime. μοντέλο-> get_datetime (εισαγωγή response_body = response_stc-body state = response_stc-state). ΑΛΛΟΥ. Response_stc-State-State = zrest_cl_defs => c_state_warning. Μήνυμα S001 (ZREST_MSG) σε response_stc-state-state_text. ΤΕΛΟΣ ΕΑΝ. ΑΛΛΟΥ. "Συμπληρώστε το ψεύτικο περιεχόμενο ως δείγμα req_stc-id = 999999. req_stc-body = 'κάποιο περιεχόμενο json'. response_stc-body = /ui2 /cl_json => serialize (data exporting = req_stc). Response_stc-State-State = zrest_cl_defs => c_state_warning. Μήνυμα S002 (ZREST_MSG) σε response_stc-state-state_text. ΤΕΛΟΣ ΕΑΝ. response_json = conv_stc_to_json (response_stc = response_stc). Πιάσε CX_Root. Response_stc-State-State = zrest_cl_defs => c_state_error. response_stc-state-state_text = exref-> get_text (). response_json = conv_stc_to_json (response_stc = response_stc). Τελικός. Endmethod. Τελικός κλάδος.
Τάση zrest_cl_req_http_handler ορισμός δημόσια που κληρονομεί από το cl_rest_resource τελικό Δημιουργία Δημόσιου . Δημόσιο τμήμα. Μέθοδοι if_rest_resource ~ Επαναπροσδιορισμός . Μέθοδοι if_rest_resource ~ post redefinition . Προστατευόμενο τμήμα. Ιδιωτική ενότητα. Τελικός κλάδος. Κατηγορία zrest_cl_req_http_handler υλοποίηση. * ---------------------------------------------------------------------------------------+ * ΔΗΜΟΣΙΑ ΜΕΘΟΔΟΣ zrest_cl_req_http_handler-> if_rest_resource ~ get * + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-------------------------------------------------------------------------------------- Μέθοδος IF_Rest_Resource ~ GET. Δεδομένα (req_json) = mo_request-> get_uri_query_parameter (iv_name = 'req' iv_encoded = abap_false). Δεδομένα (ελεγκτής) = νέο ZRest_Cl_Req_Controller (). Controller-> Process_Request (Εξαγωγή req_json = req_json εισαγωγή response_json = δεδομένα (response_json))). mo_response-> create_entity ()-> set_string_data (iv_data = response_json). Endmethod. * ---------------------------------------------------------------------------------------+ * Instance Public Method ZREST_CL_REQ_HTTP_HANDLER->IF_REST_RESOURCE~POST * +-------------------------------------------------------------------------------------------------+ * | [--->] io_entity ref to if_rest_entity * +-------------------------------------------------------------------------------------- Μέθοδος IF_Rest_Resource ~ Post. Δεδομένα (req_json) = mo_request-> get_entity ()-> get_string_data (). Δεδομένα (ελεγκτής) = νέο ZRest_Cl_Req_Controller (). Controller-> Process_Request (Εξαγωγή req_json = req_json εισαγωγή response_json = δεδομένα (response_json))). mo_response-> create_entity ()-> set_string_data (iv_data = response_json). Endmethod. Τελικός κλάδος.
Το CSRF είναι απενεργοποιημένο στον χειριστή παρακάτω. Η απενεργοποίηση του από τις παραμέτρους της υπηρεσίας GUI δεν λειτουργεί. Πρέπει να εφαρμόσετε το handle_csrf_token για να το απενεργοποιήσετε για ξεκούραση.
τάση zrest_cl_http_handler ορισμός δημόσια που κληρονομεί από το cl_rest_http_handler δημιουργία δημόσιου . δημόσιο τμήμα. "Παρέχει δρομολόγηση. Οι διαδρομές δρομολόγησης εκχωρούνται σε ελεγκτές σε αυτές τις μεθόδους μεθόδους IF_REST_APPLICATIO . προστατευόμενο τμήμα. "Αν θέλετε να απενεργοποιήσετε, επαναπροσδιορίστε αυτήν τη μέθοδο. Ακριβώς όπως μια κενή μέθοδος. Μέθοδοι HALLE_CSRF_TOKEN REDEFINITION . Ιδιωτική ενότητα. Τελικός κλάδος. Κατηγορία ZRest_Cl_Http_Handler Εφαρμογή. * ---------------------------------------------------------------------------------------+ * Instance Protected Method ZREST_CL_HTTP_HANDLER->HANDLE_CSRF_TOKEN * +-------------------------------------------------------------------------------------------------+ * | [--->] io_csrf_handler Τύπος ref στο IF_Rest_CSRF_Handler * | [--->] IO_Request Type Ref to IF_Rest_Request * | [--->] io_response Τύπος ref στο if_rest_response * +-------------------------------------------------------------------------------------- μέθοδος χειριστή_csrf_token. * Μέθοδος κλήσης Super-> handle_csrf_token * Εξαγωγή * io_csrf_handler = * io_request = * io_response = * . endmethod. * ---------------------------------------------------------------------------------------+ * Παράρτημα δημόσια μέθοδος zrest_cl_http_handler-> if_rest_application ~ get_root_handler * + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [Μέθοδος if_rest_application ~ get_root_handler. "Παρέχει δρομολόγηση. "Service Path/SAP/BC/REST" Δείγμα URL http: // vhcalnplci: 8000/sap/bc/rest/zrest/rest?sap-client = 001 & req = δεδομένα (root_handler) = νέο cl_rest_router (). root_handler-> attach (Εξαγωγή IV_Template = '/REST' '"Ενιαίο Όνομα για Πόρους IV_Handler_Class =' ZRest_Cl_Req_Http_Handler ''" Όνομα τύπου αντικειμένου). * "Μπορείτε να προσθέσετε περισσότερες κατηγορίες χειριστή αιτήματος *" Διαδρομή εξυπηρέτησης/SAP/BC/REST * "Δείγμα URL http: // vhcalnplci: 8000/sap/bc/rest/zrest/rest2?sap-client = 001 & req = * root_handler-> attach ( * Εξαγωγή * iv_template = '/rest2' "ενοποιημένο όνομα για πόρους * IV_Handler_Class = 'ZRest_Cl_Req_Http_Handler2'" Όνομα αντικειμένου *). ro_root_handler = root_handler. Endmethod. Τελικός κλάδος.
Και τελικό βήμα, Δημιουργήστε μια υπηρεσία.
Ανοίξτε το SICF TCODE και εκτελέστε.
Μεταβείτε στο/SAP/BC/REST και προσθέστε νέο υπο -στοιχείο
Προσθέστε την περιγραφή και μεταβείτε στην καρτέλα Λίστα Χειριστή και την τάξη μας, zrest_cl_http_handler, ως χειριστής.
Ενεργοποίηση υπηρεσίας. Κάντε δεξί κλικ και κάντε κλικ στην επιλογή Δοκιμή. Θα ανοίξει το πρόγραμμα περιήγησης. Αλλάξτε τη διεύθυνση URL για χειρισμό /ανάπαυση αιτήματα.
Στην περίπτωσή μου, http: // vhcalnplci: 8000/sap/bc/rest/zrest/Υπόλοιπο
Εάν θέλετε να περάσετε μερικές παραμέτρους στο αίτημα GE ‘http: // vhcalnplci: 8000/sap/bc/rest/zrest/rest?sap-client = 001 & req =’
Εάν δεν απενεργοποιήσετε το CSRF στον χειριστή, θα έχετε προβλήματα που καλούν μεθόδους μη-get, όπως μέθοδοι μετά τον Postman ή από έναν πελάτη διαφορετικό από τον ίδιο τον διακομιστή.
Επομένως στο παράδειγμά μου έχω απενεργοποιήσει το CSRF.
Παραδείγματα ταχυδρομείου
Βασικές παραμέτρους ελέγχου ταυτότητας
Λάβετε παράδειγμα και αποτέλεσμα
Παράδειγμα και αποτέλεσμα ανάρτησης
Για να καταναλώσετε από το ABAP
Θα χρησιμοποιήσουμε ένα httpclient για να κάνουμε κλήση και θα αναλύσουμε το JSON στη δομή ABAP με παράδειγμα Get_Datetime.
Κωδικός πελάτη HTTP
Τάση zutil_cl_rest_ws Ορισμός Δημόσια Δημιουργία Δημόσιου . "Κατηγορία περιτύλιγμα για την πραγματοποίηση κλήσεων υπηρεσίας REST Δημόσια ενότητα. "Σταθερές σταθερές: c_content_type_json Τύπος String Value 'Application/Json;. "Κάνει τις μεθόδους κλήσεων WS Call_ws Εισαγωγή τιμής (I_URL) Τύπος Τύπος Τύπος (i_content_type) Τύπος συμβολοσειράς C_Content_Type_json Value (i_request_method) Τύπος string default c_request_method_get value (i_username) Τύπος stringal value (i_password) Τύπος) Τύπος αξίας (i_request_method) Τύπος string value (i_pasword) _cl_defs => τιμή GTY_STATE (e_response_str). Προστατευόμενο τμήμα. Ιδιωτική ενότητα. Δεδομένα http_client ref to if_http_client. Μέθοδοι fill_warning Επιστημονική τιμή (κατάσταση) Τύπος zutil_cl_defs => gty_state. Τελικός κλάδος. Κατηγορία zutil_cl_rest_ws υλοποίηση. * ---------------------------------------------------------------------------------------+ * Instance Public Method ZUTIL_CL_REST_WS->CALL_WS * +-------------------------------------------------------------------------------------------------+ * | [--->] i_url Τύπος συμβολοσειρά * | [--->] i_content_type Τύπος συμβολοσειράς (προεπιλογή = c_content_type_json) * | [--->] i_request_method type type (default = c_request_method_get) * | [--->] i_username Τύπος συμβολοσειράς (προαιρετικό) * | [--->] i_password typle string (προαιρετικό) * | [--->] i_payload Τύπος συμβολοσειράς (προαιρετικό) * | [GTY_STATE * | [Μέθοδος call_ws. Δεδομένα: Τύπος EXREF Ref στο CX_ROOT. ΔΟΚΙΜΑΣΤΕ. "Η χρήση του This Create_By_Url μπορεί να απλοποιήσει ορισμένες πτυχές της χρήσης αυτής της κατηγορίας δωρεάν http_client. cl_http_client => create_by_url (Εξαγωγή url = i_url importing client = http_client εξαιρέσεις argument_not_found = 1 plugin_not_active = 2 internor_error = 3 άλλοι = 4). Εάν Sy-Subrc <> 0. e_state-state = fill_warning (). ΕΠΙΣΤΡΟΦΗ. ΤΕΛΟΣ ΕΑΝ. "Η λογική μου χρησιμοποιήθηκε αρχικά, αλλά θα πρέπει να μπορείτε να αλλάξετε για να δημοσιεύσετε http_client-> request-> set_method (i_request_method). http_client-> request-> set_content_type (i_content_type). "Θυμηθείτε να πιστοποιήσετε τον έλεγχο ταυτότητας εάν το όνομα του uusern δεν είναι αρχικό ή το i_password δεν είναι αρχικό. http_client-> authenticate (username = i_username password = i_password). ΤΕΛΟΣ ΕΑΝ. "Εάν υπάρχει, προετοιμάστε το ωφέλιμο φορτίο και εκχωρήστε εάν το i_payload δεν είναι αρχικό. "Μετατρέψτε αυτό το ωφέλιμο φορτίο στο XSTRING. Δεδομένα LV_Payload_x Τύπος xstring. Λειτουργία κλήσης 'SCMS_STRING_TO_XSTRING' Εξαγωγή κειμένου = i_payload Εισαγωγή buffer = lv_payload_x εξαιρέσεις απέτυχε = 1 άλλα = 2. Εάν Sy-Subrc <> 0. e_state-state = zutil_cl_defs => c_state_warning. E_STATE-STATE = 'Σφάλμα κωδικοποίησης!". ΕΠΙΣΤΡΟΦΗ. ΑΛΛΟΥ. http_client-> request-> set_data (lv_payload_x). "Δυαδικά δεδομένα endif. ΤΕΛΟΣ ΕΑΝ. "Αποστολή του αιτήματος http_client-> αποστολή (εξαιρέσεις http_communication_failure = 1 http_invalid_state = 2). Εάν Sy-Subrc <> 0. e_state-state = fill_warning (). ΕΠΙΣΤΡΟΦΗ. ΤΕΛΟΣ ΕΑΝ. "Λήψη της απόκρισης http_client-> λήψη (Εξαιρέσεις http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3). Εάν Sy-Subrc <> 0. e_state-state = fill_warning (). ΕΠΙΣΤΡΟΦΗ. ΤΕΛΟΣ ΕΑΝ. "Ελέγξτε την απάντηση. Ας ελπίσουμε ότι θα επιστρέψετε μια απάντηση JSON. e_response_str = http_client-> response-> get_cdata (). Εάν το e_response_str είναι αρχικό. e_response_str = http_client-> response-> get_data (). ΤΕΛΟΣ ΕΑΝ. e_state-state = zutil_cl_defs => c_state_success. e_state-state_text = 'Ολοκληρώθηκε με επιτυχία.". Πιάσε το CX_Root σε Exref. e_state-state = zutil_cl_defs => c_state_error. e_state-state_text = exref-> get_text (). Τελικός. Endmethod. * ---------------------------------------------------------------------------------------+ * Instance Private Method ZUTIL_CL_REST_WS->FILL_WARNING * +-------------------------------------------------------------------------------------------------+ * | [GTY_STATE * +-------------------------------------------------------------------------------------- Μέθοδος fill_warning. State-State = zutil_cl_defs => c_state_warning. http_client-> get_last_error (μήνυμα εισαγωγής = δεδομένα (msg) "μήνυμα σφάλματος). state-state_text = msg. Endmethod. Τελικός κλάδος.
Καταναλωτικός κωδικός κλάσης. Πρώτα ξεδιπλώνεται η δομή απόκρισης και ελέγχει την κατάσταση. Εάν είναι επιτυχία τότε ξεδιπλώνετε το τμήμα JSON BODY για το αποτέλεσμα της κλήσης ID 1001.
Class zrest_cl_consumer ορισμός δημόσια τελική Δημιουργία Δημόσιου . Δημόσιο τμήμα. Μέθοδοι get_datetime Εξαγωγή Τύπος κατάστασης zutil_cl_defs => gty_state dt type tzntimestp. Προστατευόμενο τμήμα. Ιδιωτική ενότητα. Τελικός κλάδος. Κατηγορία zrest_cl_consumer Εφαρμογή. * ---------------------------------------------------------------------------------------+ * Instance Public Method ZREST_CL_CONSUMER->GET_DATETIME * +-------------------------------------------------------------------------------------------------+ * | [GTY_STATE * | [Μέθοδος get_datetime. "Μέθοδος δείγματος για την κατανάλωση δεδομένων API REST Web: exref type ref στο cx_root. ΔΟΚΙΜΑΣΤΕ. "CONTANTS: C_Uname Τύπος String Value" Developer ", C_Pass Τύπος String Value 'Down1oad'. "Δημιουργία δεδομένων λήψης κλήσεων: τιμή συμβολοσειράς url" http: // vhcalnplci: 8000/sap/bc/rest/zrest/rest?sap-client = 001 '. Δεδομένα Req_stc Τύπος ZRest_S_Request. req_stc-id = '1001'. Δεδομένα (req_json) = /ui2 /cl_json => serialize (data exporting = req_stc). url = url && '& req =' && req_json. "Καλέστε το Web API νέο Zutil_Cl_Rest_Ws ()-> Call_ws (Εξαγωγή I_Url = url i_username = c_uname i_password = c_pass Εισαγωγή e_state = κατάσταση e_response_str = δεδομένα (json_response)). Εάν η κατάσταση κατάστασης EQ zutil_cl_defs => C_STATE_SUCCESS. Δεδομένα: resp_stc type zrest_s_response. /ui2/cl_json => deserialize (Εξαγωγή json = json_response αλλαγή δεδομένων = resp_stc). Εάν resp_stc-state-state eq zutil_cl_defs => c_state_success. Τύποι: Begin of Ty_res, DateTime Type Tzntimestp, End of Ty_res. Δεδομένα: resp_1001 Τύπος ty_res. /ui2/cl_json => deserialize (Εξαγωγή JSON = resp_stc-body αλλαγή δεδομένων = resp_1001). dt = resp_1001-datetime. ΤΕΛΟΣ ΕΑΝ. ΤΕΛΟΣ ΕΑΝ. Πιάσε το CX_Root σε Exref. State-State = zutil_cl_defs => c_state_error. state-state_text = exref-> get_text (). Τελικός. Endmethod. Τελικός κλάδος.
Αυτό είναι όλο. Με αυτόν τον τρόπο, μπορείτε να ενσωματώσετε οποιοδήποτε περιβάλλον, σύστημα στο SAP.
Ελπίζω να βοηθήσει.
Ευχαριστώ για την ανάγνωση.
σχετικοί σύνδεσμοι