Apakah getah menggunakan API REST?
Mengkonsumsi API istirahat dengan ABAP (cloud)
Panggilan metode posting
Saat bekerja dengan API REST, SAP memang menggunakan API REST untuk komunikasi antar aplikasi. Dalam artikel ini, kami akan mengeksplorasi cara mengkonsumsi API REST menggunakan ABAP, khususnya dengan fungsionalitas cloud ABAP. Berikut adalah poin utama yang perlu Anda ketahui:
- API adalah singkatan dari antarmuka pemrograman aplikasi dan memungkinkan dua aplikasi untuk berkomunikasi satu sama lain.
- REST API adalah pola membangun API menggunakan protokol HTTP dan mengirim/menerima data JSON atau XML melalui URIS.
- Odata, populer di dunia SAP, adalah jenis API REST.
- Ada informasi terbatas yang tersedia untuk mengonsumsi API eksternal di ABAP, terutama API yang masuk daftar putih untuk ABAP cloud.
- Dalam tutorial ini, kami akan menggunakan API placeholder JSON untuk tujuan demonstrasi.
- Penyedia API menawarkan sumber daya seperti posting, komentar, album, foto, todos, dan pengguna.
- Kami akan fokus pada sumber daya posting untuk kesederhanaan.
- Posting memiliki ID, judul, tubuh, dan ID pengguna.
- Untuk mengkonsumsi API istirahat di ABAP, kami akan menggunakan API ABAP yang masuk daftar putih yang disebut IF_WEB_HTTP_CLIENT.
- Kami juga akan menggunakan Perpustakaan XCO untuk bekerja dengan JSON.
Pertanyaan:
- Apa yang diperjuangkan API?
API adalah singkatan dari antarmuka pemrograman aplikasi. - Apa REST API?
REST API adalah pola membangun API menggunakan protokol HTTP dan mengirim/menerima data JSON atau XML melalui URIS. - Apa itu Odata?
Odata adalah jenis API REST yang populer di dunia SAP. - Apakah ada banyak informasi yang tersedia untuk mengonsumsi API eksternal di ABAP?
Tidak, ada informasi terbatas yang tersedia, terutama untuk API yang masuk daftar putih untuk ABAP cloud. - Penyedia API apa yang akan kami gunakan dalam tutorial ini?
Kami akan menggunakan API placeholder JSON untuk tujuan demonstrasi. - Sumber daya apa yang ditawarkan API placeholder JSON?
JSON Placeholder API menawarkan sumber daya seperti posting, komentar, album, foto, todos, dan pengguna. - Sumber daya mana yang akan kami fokuskan dalam tutorial ini?
Kami akan fokus pada sumber daya posting untuk kesederhanaan. - Atribut apa yang dimiliki sebuah posting?
Posting memiliki ID, judul, tubuh, dan ID pengguna. - API ABAP yang masuk daftar putih apa yang akan kami gunakan untuk mengkonsumsi API REST?
Kami akan menggunakan API if_web_http_client. - Perpustakaan apa yang akan kami gunakan untuk bekerja dengan JSON?
Kami akan menggunakan perpustakaan XCO.
Jawaban terperinci:
- Apa yang diperjuangkan API?
API adalah singkatan dari antarmuka pemrograman aplikasi. Ini adalah satu set standar yang memungkinkan dua aplikasi untuk berkomunikasi satu sama lain. - Apa REST API?
REST API adalah pola bangunan API menggunakan protokol HTTP. Mereka memungkinkan aplikasi untuk mengirim dan menerima data JSON atau XML melalui URIS. API REST berbasis JSON banyak digunakan. - Apa itu Odata?
Odata adalah jenis API istirahat yang sangat populer di dunia SAP. Ini memungkinkan akses mudah dan manipulasi data yang disimpan dalam sistem SAP. - Apakah ada banyak informasi yang tersedia untuk mengonsumsi API eksternal di ABAP?
Tidak, ada informasi terbatas yang tersedia untuk mengonsumsi API eksternal di ABAP, terutama untuk API yang masuk daftar putih yang dapat digunakan dengan ABAP cloud. Tutorial ini bertujuan untuk memberikan panduan tentang mengonsumsi API REST menggunakan cloud ABAP. - Penyedia API apa yang akan kami gunakan dalam tutorial ini?
Kami akan menggunakan API placeholder JSON, yang merupakan API REST online palsu gratis untuk pengujian dan prototipe. Ini memungkinkan kami untuk melakukan tindakan crud (buat, baca, perbarui, hapus). - Sumber daya apa yang ditawarkan API placeholder JSON?
JSON Placeholder API menawarkan sumber daya seperti posting, komentar, album, foto, todos, dan pengguna. Dalam tutorial ini, kami akan fokus pada sumber daya posting. - Sumber daya mana yang akan kami fokuskan dalam tutorial ini?
Kami akan fokus pada sumber daya posting dari API placeholder JSON. Ini akan memungkinkan kami untuk menunjukkan cara menjalankan tindakan CRUD pada API REST menggunakan API ABAP yang masuk daftar putih di Platform SAP Cloud. - Atribut apa yang dimiliki sebuah posting?
Posting memiliki ID, judul, tubuh, dan ID pengguna. ID mewakili pengidentifikasi unik dari postingan, dan ID pengguna mewakili ID pengguna yang membuat posting. - API ABAP yang masuk daftar putih apa yang akan kami gunakan untuk mengkonsumsi API REST?
Untuk mengkonsumsi API istirahat di ABAP, kami akan menggunakan API IF_WEB_HTTP_CLIEN. Ini adalah API ABAP yang masuk daftar putih yang diizinkan untuk digunakan dalam platform SAP Cloud. - Perpustakaan apa yang akan kami gunakan untuk bekerja dengan JSON?
Untuk bekerja dengan JSON, kami akan menggunakan Cloud Platform Edition dari perpustakaan XCO (Extension Components). Perpustakaan ini menyediakan fungsionalitas yang berguna untuk mengubah data JSON antara konvensi penamaan yang berbeda, seperti Camelcase ke Under_score, dan sebaliknya.
Dengan mengikuti tutorial ini, Anda akan dapat mengkonsumsi API REST menggunakan ABAP, khususnya dengan fungsionalitas cloud ABAP.
Mengkonsumsi API istirahat dengan ABAP (cloud)
POST METODE CALL ->
Apakah getah menggunakan API REST?
Об этой страницental
Ы заре kondecedit. С помощю этой страницы с сожем определить, что запросы о о ancing оеет иенно ы,. Почем это мопо произойтиonya?
Ээ страница отображается в тех слчаях, когда автомически систе secara google ристрюи uman рисисilan рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рии и menelepon которые наршают уловия исполззованияisah. Страница перестанет отображаться после то A, как эти запросы прекратяupanisah яяisah ancing ancing. До это A.
Источником запросов может слжить Врддносно secara п, пар иа бас00 иасазаз) ыылку запросов. Если Вы исползеет общий дсст в и итернет, проблем м ы ы ip ip ip00 ip ip ip ip ip uman ip ip ip ip ip ip uman ip ip ip ip ip ip ip uman ip ip ip ip ip ip ip ON ip ip ip ip ip ip ON. Обратитесь к своем системном аинистратору. Подробнее secara.
Пожет такжeda появлят secara, если Вы Вонот A рлжвввв dari рыч о оаilat оыч о оаilat, еами, ии же Водитedit запросы чень часто засто.
Mengkonsumsi API istirahat dengan ABAP (cloud)
API adalah singkatan dari antarmuka pemrograman aplikasi, dan terdiri dari serangkaian standar yang memungkinkan dua aplikasi untuk berbicara satu sama lain. REST API adalah pola tertentu dalam membangun API. Mereka didasarkan pada protokol HTTP, mengirim dan menerima data JSON atau XML melalui URI (seragam pengidentifikasi sumber daya). API REST berbasis JSON lazim. Kami juga akan menggunakan yang seperti itu di tutorial ini.
Odata, yang sangat populer di dunia getah, itu sendiri adalah API istirahat. Ada banyak informasi di luar sana tentang cara memberikan API istirahat dari ABAP (i.e., Untuk menerbitkan layanan Odata). Tapi tidak ada’t banyak tentang cara mengkonsumsi API eksternal di ABAP. Dan dari sedikit yang ada, itu termasuk API ABAP yang tidak whitelisted, I.e., mereka tidak dapat digunakan dengan cloud abap. Jadi, saya memutuskan untuk menulis tutorial ini tentang mengonsumsi API REST menggunakan cloud abap.
Skenario
Penyedia API
Kami akan bekerja dengan placeholder JSON – a “bebas menggunakan API istirahat online palsu untuk pengujian dan prototipe”. Ini akan memungkinkan kita untuk melakukan semua tindakan crud (buat, baca, perbarui, hapus). Agar adil, pembaruan, perbarui, dan hapus tidak akan benar -benar berfungsi, tetapi server akan memalsukannya seolah -olah mereka melakukannya. Yang benar-benar cukup untuk kasus penggunaan kami!
Sumber daya
Penyedia API kami terpapar Posting, Komentar, Album, Foto, Todos, Dan pengguna. Untuk kesederhanaan’sake, kami hanya akan menggunakan Posting sumber daya, dan berpura -pura sisanya’t disana. Gagasan utama dari tutorial saya adalah memberikan panduan yang sangat sederhana tentang cara menjalankan tindakan CRUD pada API REST. Dan lakukan ini menggunakan API ABAP yang masuk daftar putih di SAP Cloud Platform (CP). Ini berarti Anda dapat menjalankan kode ini pada akun uji coba SAP CP.
Posting sumber
Posting memiliki ID, judul, Badan, dan ID Pengguna, yang berarti ID pengguna yang membuat postingan. Kami mewakili itu di ABAP sebagai berikut:
Jenis: Mulai dari Post_s, User_ID Tipe I, ID Tipe I, Judul Jenis String, String Jenis Tubuh, Akhir Post_s, Post_tt Tipe Tabel Post_s Dengan Kunci Kosong, Mulai dari Post_Without_ID_S, User_ID TYPE I, Judul Jenis String, String Jenis Tubuh, Akhir Post_Without_id_s.
Kami membutuhkan struktur tanpa ID karena ID postingan secara otomatis ditetapkan oleh REST API. Artinya kami tidak menyediakannya saat membuat posting baru.
API API ABAP Cloud
Mengirim permintaan HTTP
Seperti yang saya sebutkan sebelumnya, sejumlah kecil tutorial yang ada untuk mengonsumsi API istirahat di ABAP terutama menggunakan API ABAP yang tidak dihitarkan. Misalnya, if_http_client satu, yang penggunaannya tidak diizinkan di cloud abap. Cara untuk memeriksa API ABAP yang masuk daftar putih untuk platform SAP Cloud adalah dengan menjelajahi Objek yang dirilis Daftar. Dapat diakses dalam Eclipse ABAP Development Tools (ADT) -> Project Explorer -> Objek yang Dirilis. Jadi, API ABAP siap-awan untuk mengirim permintaan http adalah if_web_http_client. Kami mendefinisikan metode berikut untuk mendapatkan klien:
Metode: create_client mengimpor Jenis URL String Nilai Pengembalian (Hasil) Ketik ref ke IF_WEB_HTTP_Client Raising CX_STATIC_CHECK
Metode create_client. Data (dest) = cl_http_destination_provider => create_by_url (url). hasil = cl_web_http_client_manager => create_by_http_destination (dest). Endmethod.
Perhatikan bahwa URL adalah parameter input. Hasil yang dikembalikan adalah klien web http yang dibuat.
Bekerja dengan JSON
Untuk bekerja dengan JSON, kami akan menggunakan Cloud Platform Edition dari XCO (Komponen ekstensi) perpustakaan. Baca lebih lanjut tentang ini di sini dan di sini. Kelas spesifik, relevan dengan kasus penggunaan kami adalah xco_cp_json. Sesuatu yang sangat berharga yang disediakannya adalah kemampuan untuk mengubah konvensi penamaan yang berbeda. Misalnya, Camelcase ke Under_score, dan sebaliknya.
Mengkonsumsi API REST
Sebelum sampai ke bagian yang menyenangkan, kita hanya perlu mendefinisikan beberapa konstanta. Tentu saja, ini tidak sepenuhnya diperlukan, tetapi bekerja dengan konstanta yang bertentangan dengan literal string adalah praktik yang lebih baik, dan memungkinkan untuk digunakan kembali.
Konstanta: base_url Jenis Nilai String 'https: // jsonplaceHolder.tipikode.com/POST ', Content_Type Jenis Nilai String' Tipe Konten ', JSON_Content Tipe Nilai String' Aplikasi/JSON; Charset = UTF-8 '.
URL dasar hanyalah alamat Posting sumber. Dua konstanta terakhir yang kita butuhkan untuk kasus di mana kita akan mengirim data (i.e., Buat dan perbarui) ke server menggunakan API REST. Kami harus memberi tahu server kami mengirim JSON.
Baca semua posting
URL untuk membaca semua posting hanyalah URL dasar. Jadi, kami membuat klien untuk itu, menggunakan klien untuk melaksanakan permintaan GET, tutup klien, dan mengonversi JSON yang diterima ke tabel posting. Tabel jenis posting didefinisikan di Sumber Daya Posting bagian di atas. Anda juga dapat merujuk ke kode lengkap di akhir.
read_posts value returning (hasil) ketik post_tt raising cx_static_check
Metode read_posts. "Dapatkan JSON dari semua posting data (url) = |< base_url >|. Data (klien) = create_client (url). Data (respons) = client-> execute (if_web_http_client => get)-> get_text (). klien-> tutup (). "Konversi JSON ke Tabel Posting XCO_CP_JSON => data-> from_string (respons)-> apply (nilai #((xco_cp_json => transformasi-> camel_case_to_underscore)))-> write_to (ref #(hasil)))). Endmethod.
Baca Single Post
Metode untuk membaca satu posting adalah serupa, dengan perbedaan yang kami ambil sebagai input ID pos, dan mengembalikan struktur (i.e., satu posting,) bukan tabel (i.e., daftar posting). API REST’S url membaca satu posting adalah sebagai berikut:
read_single_post mengimpor ID Tipe I Nilai Pengembalian (Hasil) Ketik Post_s Meningkatkan CX_STATIC_CHECK
Metode read_single_post. "Dapatkan JSON untuk input data post id (url) = |< base_url >/< id >|. Data (klien) = create_client (url). Data (respons) = client-> execute (if_web_http_client => get)-> get_text (). klien-> tutup (). "Konversi JSON ke Posting Struktur XCO_CP_JSON => data-> from_string (respons)-> apply (nilai #((xco_cp_json => transformasi-> camel_case_to_underscore)))-> write_to (ref #(hasil)))). Endmethod.
Buat posting
Seperti dijelaskan sebelumnya, posting’ ID secara otomatis ditetapkan oleh API REST. Jadi, untuk membuat posting, kami akan menggunakan post_without_id_s jenis. Ini akan menjadi parameter input kami. Kami akan mengonversi dari struktur ABAP ini ke JSON, sekali lagi menggunakan perpustakaan XCO. Dari sana, kami membuat klien. Kemudian, kami mengatur tubuh permintaan HTTP yang akan kami kirim ke JSON yang baru saja kami buat dan kami memberi tahu server bahwa kami akan mengirim tipe konten JSON. Terakhir, kami menjalankan permintaan pos, dan mengembalikan server’respons s. Jika semuanya berjalan dengan baik, server’Respons S akan mengembalikan posting kami kami, bersama dengan ID yang baru dihasilkan (101, karena saat ini ada 100 posting).
create_post mengimpor post_without_id type post_without_id_s nilai pengembalian (hasil) ketik string raising cx_static_check
Metode create_post. "Konversi posting input ke data JSON (json_post) = xco_cp_json => data-> from_abap (post_without_id)-> apply (value #((xco_cp_json => transformasi-> underscore_to_camel_case)))-> to_string (). "Kirim JSON POST ke server dan kembalikan data respons (url) = |< base_url >|. Data (klien) = create_client (url). Data (req) = klien-> get_http_request (). req-> set_text (json_post). req-> set_header_field (i_name = content_type i_value = json_content). hasil = klien-> eksekusi (if_web_http_client => post)-> get_text (). klien-> tutup (). Endmethod.
Perbarui posting
Kami akan memperbarui dengan permintaan put. Ini berarti kami akan memberikan posting lengkap. Patch, di sisi lain, memungkinkan kami untuk hanya menyediakan bidang yang diperbarui (e.G., hanya judul). Jika Anda menganggap ini menarik, Anda dapat mencoba membuat permintaan patch sendiri – itu seharusnya’T terlalu sulit dengan sumber daya yang disediakan di sini!
Kami mengikuti logika serupa seperti halnya membuat tindakan. Kami juga menyediakan posting sebagai parameter input, tetapi kali ini kami menggunakan struktur penuh (dengan post id). URL untuk memperbarui posting sama dengan mengakses posting ini (tunggal):
Jadi, satu -satunya perbedaan dari membuat Sertakan jenis yang diubah dari parameter input pos, URL, dan metode permintaan HTTP (put).
update_post mengimpor type post post_s nilai pengembalian (hasil) ketik string raising cx_static_check
Metode update_post. "Konversi posting input ke data JSON (json_post) = xco_cp_json => data-> from_abap (post)-> apply (nilai #((xco_cp_json => transformasi-> underscore_to_camel_case)))-> to_string (). "Kirim JSON POST ke server dan kembalikan data respons (url) = |< base_url >/< post-id >|. Data (klien) = create_client (url). Data (req) = klien-> get_http_request (). req-> set_text (json_post). req-> set_header_field (i_name = content_type i_value = json_content). hasil = klien-> eksekusi (if_web_http_client => put)-> get_text (). klien-> tutup (). Endmethod.
Hapus posting
Menghapus posting adalah permintaan paling sederhana. Kami cukup mengambil ID, dan mengirim permintaan HTTP Hapus ke URL dari posting spesifik. Untuk membiarkan pengguna jika ada yang salah, kami memeriksa server’Kode respons S (harus 200 – artinya ok).
delete_post mengimpor ID tipe I Raising cx_static_check
Metode delete_post. Data (url) = |< base_url >/< id >|. Data (klien) = create_client (url). Data (respons) = client-> execute (if_web_http_client => hapus). Jika respons-> get_status () -code ne 200. Naikkan Jenis Pengecualian CX_WEB_HTTP_CLIENT_ERROR. BERAKHIR JIKA. Endmethod.
Menguji kode kami
Sekarang kami telah menyediakan semua fungsionalitas yang kasar, biarkan’s Lihat mereka! Untuk melakukan ini, kami akan menerapkan if_oo_adt_classrun antarmuka, yang memungkinkan untuk menjalankan kelas sebagai aplikasi konsol. Ini memiliki metode utama yang dieksekusi – mirip dengan Java.
Metode if_oo_adt_classrun ~ main. MENCOBA. "Baca data (all_posts) = read_posts (). Data (first_post) = read_single_post (1). "Buat data (create_response) = create_post (nilai #(user_id = 7 title = 'halo, dunia!'tubuh =' :) ')). "Perbarui first_post-uSer_id = 777. Data (update_response) = update_post (first_post). "Hapus delete_post (9). "Cetak Hasil Out-> Tulis (All_Posts). out-> write (first_post). out-> write (create_response). out-> write (update_response). Tangkap CX_root ke dalam data (exc). out-> write (exc-> get_text ()). Endtry. Endmethod.
Berlari dengan F9 mencetak output berikut:
Awal output di konsol ABAP
Akhir output di konsol ABAP
Kesimpulan
Ini mengakhiri tutorial cara mengkonsumsi API istirahat di cloud abap. Saya harap ini berguna untuk Anda. Jika Anda merasa di sana’s Minyak perbaikan apa pun, atau Anda memiliki pertanyaan atau umpan balik untuk saya, beri tahu saya di komentar!
Kode penuh
Kelas ZSS_TESTER_2 Definisi Final publik Buat publik. Bagian Publik. Antarmuka: if_oo_adt_classrun. Jenis: Mulai dari Post_s, User_ID Tipe I, ID Tipe I, Judul Jenis String, String Jenis Tubuh, Akhir Post_s, Post_tt Tipe Tabel Post_s Dengan Kunci Kosong, Mulai dari Post_Without_ID_S, User_ID TYPE I, Judul Jenis String, String Jenis Tubuh, Akhir Post_Without_id_s. Metode: create_client mengimpor Jenis URL String Nilai Pengembalian (Hasil) Ketik ref ke IF_WEB_HTTP_Client Raising cx_static_check, read_posts nilai pengembalian (hasil) type post_tt raising cx_static_check, read_single_post mengimpor ID tipe I ID Tipe Nilai Kembali (Hasil) POSTCECTS, POSTSCECTE_CHOUTS POSTECLE_POTS IDSTIK_POCK ID TYPE (Hasil) ID_S Nilai Pengembalian (Hasil) Ketik String Meningkatkan CX_STATIC_CHECK, UPDATE_POST Impor Posting Jenis POST_S Nilai pengembalian (Hasil) Ketik string peningkatan cx_static_check, delete_post mengimpor ID tipe I Raising CX_STATIC_CHECK. Bagian Pribadi. Konstanta: base_url Jenis Nilai String 'https: // jsonplaceHolder.tipikode.com/POST ', Content_Type Jenis Nilai String' Tipe Konten ', JSON_Content Tipe Nilai String' Aplikasi/JSON; Charset = UTF-8 '. Endclass. Implementasi Kelas ZSS_TESTER_2. Metode if_oo_adt_classrun ~ main. MENCOBA. "Baca data (all_posts) = read_posts (). Data (first_post) = read_single_post (1). "Buat data (create_response) = create_post (nilai #(user_id = 7 title = 'halo, dunia!'tubuh =' :) ')). "Perbarui first_post-uSer_id = 777. Data (update_response) = update_post (first_post). "Hapus delete_post (9). "Cetak Hasil Out-> Tulis (All_Posts). out-> write (first_post). out-> write (create_response). out-> write (update_response). Tangkap CX_root ke dalam data (exc). out-> write (exc-> get_text ()). Endtry. Endmethod. Metode create_client. Data (dest) = cl_http_destination_provider => create_by_url (url). hasil = cl_web_http_client_manager => create_by_http_destination (dest). Endmethod. Metode read_posts. "Dapatkan JSON dari semua posting data (url) = |< base_url >|. Data (klien) = create_client (url). Data (respons) = client-> execute (if_web_http_client => get)-> get_text (). klien-> tutup (). "Konversi JSON ke Tabel Posting XCO_CP_JSON => data-> from_string (respons)-> apply (nilai #((xco_cp_json => transformasi-> camel_case_to_underscore)))-> write_to (ref #(hasil)))). Endmethod. Metode read_single_post. "Dapatkan JSON untuk input data post id (url) = |< base_url >/< id >|. Data (klien) = create_client (url). Data (respons) = client-> execute (if_web_http_client => get)-> get_text (). klien-> tutup (). "Konversi JSON ke Posting Struktur XCO_CP_JSON => data-> from_string (respons)-> apply (nilai #((xco_cp_json => transformasi-> camel_case_to_underscore)))-> write_to (ref #(hasil)))). Endmethod. Metode create_post. "Konversi posting input ke data JSON (json_post) = xco_cp_json => data-> from_abap (post_without_id)-> apply (value #((xco_cp_json => transformasi-> underscore_to_camel_case)))-> to_string (). "Kirim JSON POST ke server dan kembalikan data respons (url) = |< base_url >|. Data (klien) = create_client (url). Data (req) = klien-> get_http_request (). req-> set_text (json_post). req-> set_header_field (i_name = content_type i_value = json_content). hasil = klien-> eksekusi (if_web_http_client => post)-> get_text (). klien-> tutup (). Endmethod. Metode update_post. "Konversi posting input ke data JSON (json_post) = xco_cp_json => data-> from_abap (post)-> apply (nilai #((xco_cp_json => transformasi-> underscore_to_camel_case)))-> to_string (). "Kirim JSON POST ke server dan kembalikan data respons (url) = |< base_url >/< post-id >|. Data (klien) = create_client (url). Data (req) = klien-> get_http_request (). req-> set_text (json_post). req-> set_header_field (i_name = content_type i_value = json_content). hasil = klien-> eksekusi (if_web_http_client => put)-> get_text (). klien-> tutup (). Endmethod. Metode delete_post. Data (url) = |< base_url >/< id >|. Data (klien) = create_client (url). Data (respons) = client-> execute (if_web_http_client => hapus). Jika respons-> get_status () -code ne 200. Naikkan Jenis Pengecualian CX_WEB_HTTP_CLIENT_ERROR. BERAKHIR JIKA. Endmethod. Endclass.
Penciptaan API REST (Panggilan Metode Get & Post)
API REST adalah antarmuka pemrograman aplikasi transfer negara representasional yang sesuai dengan kendala gaya arsitektur REST dan memungkinkan interaksi dengan layanan yang tenang.
Metode yang paling umum adalah: dapatkan, posting, put, dan hapus,
Metode ini akan digunakan, permintaan get untuk mengambil catatan, permintaan pos untuk membuat satu, permintaan put untuk memperbarui catatan, dan permintaan hapus untuk menghapus satu
Skenario -> perlu memberikan detail driver berdasarkan ID driver.
Langkah 1 ->
Tabel dasar data driver.
Langkah 2 ->
Buat Kelas Penangan Permintaan ‘Zcl_driver_req_handler’ dan mewarisi dengan kelas standar ‘Cl_resthttp_handler’
Catatan -> wajib untuk mengimplementasikan metode get_root_handler jika tidak, ia akan memberikan kesalahan sintaksis.
Langkah 3 ->
Buat Kelas Penyedia Permintaan ‘Zcl_driver_req_provider’ dan mewarisi dengan kelas standar ‘Cl_rest_resource’
Langkah 4 -> Sekarang terapkan if_rest_resource ~ Dapatkan metode untuk membaca data.
Setelah membaca data panggilan data /ui2 /cl_json => serialize () untuk mengubah struktur ABAP menjadi format JSON.
Langkah 5 -> Menerapkan Get_root_Handler Metode Kelas Penangan Permintaan.
Di sini kita perlu menautkan kelas penangan permintaan dan meminta kelas penyedia dengan bantuan router.
Langkah 6 -> Buat Elemen Layanan, Tcode SICF
Langkah 7 -> Daftar penangan tautan, di sini kita perlu menentukan kelas penangan permintaan kami ‘Zcl_driver_req_handler’.
Langkah 8 -> Aktifkan Layanan.
Langkah 9 -> Layanan Uji.
Hasil -> Di sini kami melewati driver dan berdasarkan data ID ditampilkan dalam format JSON.
POST METODE CALL ->
Skenario -> Kita perlu membuat detail driver baru di basis data. Seperti yang Anda dapat melihat ID driver ‘002’ hanya ada dalam sistem dan sekarang id baru ‘001’ harus dibuat.
Dalam variabel lv_data, data datang dalam string json
CALL /UI2 /CL_JSON => metode deserialize () untuk mengubah string JSON menjadi struktur ABAP.
Ini entri baru dengan ID ‘001’
Kesimpulan ->
Setelah membaca blog ini, Anda akan dapat membuat API REST sederhana dan Anda juga akan memiliki ide membaca parameter di kelas penyedia permintaan.
Silakan menyarankan jika ada koreksi yang diperlukan 🙂
Mengembangkan API istirahat di ABAP
Di dua blog terbaru, saya mendemonstrasikan cara menulis klien web API REST – dengan XML (aplikasi demo di sini) atau JSON (aplikasi demo di sini) sebagai format transfer data. Di blog ini, saya akan fokus pada sisi server: cara menerapkan API REST sebagai penangan permintaan ABAP. Anda dapat memeriksa semua kode yang saya diskusikan di sini di situs web BSP Migros: It’s all in class zcl_job_data .
Pohon ICF
Penangan permintaan adalah kelas yang mengimplementasikan antarmuka if_http_extension, yang terdiri dari satu metode tunggal handle_request. Kelas penangan permintaan dapat dilampirkan ke jalur dalam transaksi SICF. Permintaan HTTP yang masuk akan dianalisis dengan kerangka komunikasi internet, mencoba mencocokkan jalur permintaan dengan jalur SICF. Proses pertandingan dihentikan segera setelah simpul dengan penangan permintaan terlampir. Jika ini masalahnya, instance dari kelas penangan akan dibuat, dan metode handle_request akan dipanggil.
Layanan contoh kami dilampirkan ke jalur /pekerjaan/atribut. Kelas zcl_job_data dinyatakan bertanggung jawab atas semua permintaan yang masuk di mana jalur permintaan dimulai /pekerjaan/atribut :
Strategi Pertama: Metode Permintaan HTTP
Implementasi metode antarmuka if_http_extension ~ handle_request () membentuk tingkat pemrosesan paling atas. Oleh karena itu, implementasi hanya memberikan kerangka pemrosesan yang kasar: instance untuk operasi basis data, serta instance untuk pemrosesan operasi istirahat, penanganan permintaan didelegasikan ke instance tersebut, dan ada blok tangkapan untuk pemrosesan kesalahan jika tidak ada contoh yang dapat ditentukan untuk memproses permintaan tersebut, dan ada permintaan tersebut jika tidak ada contoh untuk memproses permintaan tersebut, dan tidak ada instance untuk memproses permintaan tersebut. Situasi seperti itu harus menghasilkan respons HTTP dengan kode status ‘400 permintaan Buruk’.
Di tempat ini, kami menggunakan pola desain strategi: tergantung pada metode http (get, letakkan, posting, hapus, opsi), instance tertentu dibuat. Setiap instance yang mungkin sesuai dengan strategi tertentu.
Metode if_http_extension ~ handle_request . Data: LO_DB TYPE REF TO LIF_DB, LO_REST TYPE REF TO LIF_REST, LO_INVALID_METHOD TYPE REF ke ZCX_ERROR, string tipe LV_REASON. mencoba. * Objek untuk Operasi Basis Data LO_DB ?= get_db (io_server = server). * Dapatkan instance handler istirahat yang benar, tergantung pada kata kerja (dapatkan, put, posting, opsi, hapus) lo_rest ?= get_rest (io_server = server io_db = lo_db). * Lakukan operasi lo_rest-> handle_request (). Tangkap zcx_not_found ke lo_invalid_method. lv_reason = lo_invalid_method-> get_text (). server-> respons-> set_status (kode = 400 "alasan permintaan buruk = lv_reason). endtry. endmethod.
Kami menggunakan konvensi penamaan untuk penentuan instance: kelas lcl_rest_get akan dikaitkan dengan kata kerja http get, lcl_rest_put dengan put, dan sebagainya. Semua kelas ini mengimplementasikan antarmuka lif_rest. Dengan cara ini, kita dapat menggunakan pembuatan instance dinamis. Atau, kami bisa menulis pernyataan besar ..’S. Keuntungan dari kasusnya adalah buat objek Pernyataan dapat diperiksa secara statis untuk kebenaran sintaksis. Saya telah memilih varian dinamis karena saya merasa lebih jelas dan lebih mudah dibaca daripada sekelompok cabang saat.
Perhatikan bahwa metode permintaan http (get, put, post, …) tersedia sebagai bidang header semu dengan nama ‘~ request_method’:
metode get_rest. Data: lv_classname Type seoclsname, lv_method type string, lv_message type text255. lv_method = io_server-> request-> get_header_field ('~ request_method'). concatenate 'lcl_rest_' lv_method ke lv_classname. mencoba. Buat Objek EO_REST TYPE (lv_classname) mengekspor io_request = io_server-> permintaan io_response = io_server-> respons io_db = io_db. Tangkap cx_sy_create_object_error. lv_message = 'Metode' '&' 'tidak didukung' (001). ganti '&' di lv_message dengan lv_method. _raise_with_text zcx_not_found lv_message. endtry. endmethod.
Strategi Kedua: Format Transfer Data
Sekarang kami memiliki kelas penangan yang berbeda untuk metode permintaan HTTP yang berbeda. Tetapi untuk semua penangan ini, ada beberapa tugas umum. Salah satu tugas umum ini adalah: untuk menentukan format transfer data saat ini, dan untuk mengonversi input – jika tersedia – menjadi data ABAP, dan sebaliknya: untuk mengubah data hasil ABAP menjadi output dengan format transfer data yang diinginkan (XML atau JSON).
Sekarang, beberapa metode permintaan seperti GET tidak memerlukan konten permintaan apapun. Jadi konversi data yang masuk dilakukan oleh penangan metode yang tahu mereka memerlukan data konten. Di sisi lain, akan selalu ada hasil dari tipe data berikut:
Jenis: Mulai dari TY_RESULT, tipe msgtype symsgty, jenis pesan C panjang 255, JOBS TYPE ZJOBS_TAB, akhir TY_RESULT.
Mungkin tidak selalu ada entri di meja kerja. Tetapi tidak setiap komponen dari struktur ini akan menjadi awal. Jika tidak ada meja kerja, maka biasanya akan ada pesan. Jadi konversi hasilnya selalu dapat dilakukan.
Masuk akal untuk bekerja dengan kelas konverter abstrak, subclass spesifik yang berisi algoritma konversi per tipe konten. Ini adalah aplikasi kedua dari pola strategi.
Kelas lcl_converter definisi abstrak. Bagian Publik. Metode kelas get_instance mengimpor IV_Accept Type String Value Returning (EO_INSTANCE) Ketik ref ke LCL_Converter. Metode Content_Type Nilai Pengembalian Abstrak (EV_CONTENT_TYPE) Jenis String. Metode get_entered_data Abstrak Mengimpor IV_CData Jenis String Ekspor ES_JOB Tipe Zjobs Meningkatkan ZCX_PARSE_ERROR. metode result_to_cdata abstrak mengimpor is_result type ty_result mengekspor ev_cdata tipe string. endclass. "Definisi LCL_Converter
Metode statis lcl_converter => get_instance () membuat perbedaan, tergantung pada Menerima Bidang header dari permintaan HTTP:
Implementasi LCL_Converter kelas. metode get_instance. Jika iv_accept cs 'aplikasi/json'. Buat Objek EO_INSTANCE TYPE LCL_JSON_CONVERTER. kalau tidak. Buat Objek EO_INSTANCE TYPE LCL_XML_CONVERTER. berakhir jika. endmethod. "Get_instance endclass. "Implementasi LCL_Converter
Plot umum untuk semua permintaan
Kita dapat mengekstrak tugas umum ke dalam lcl_rest superclass dari semua penangan metode tertentu, menerapkan antarmuka lif_rest ~ handle_request () Sekali untuk semua subkelas.
Kode umum dalam superclasse perlu dicampur dengan kode spesifik, diimplementasikan dalam subkelas dan mendefinisikan perilaku spesifik dari subkelas itu. Untuk mencapai ini, kami menelepon pada titik waktu yang diinginkan lif_rest ~ handle_request (), metode abstrak Mengerjakan( ), yang harus didefinisikan ulang di subkelas. Metode do () ini akan berisi tindakan spesifik.
Sekarang, implementasi umum lif_rest ~ handle () di superclass hanya mendefinisikan aliran pemrosesan, menyerahkan tindakan konkret ke subkelas atau untuk delegasi seperti go_converter:
- Menjalankan tindakan spesifik dengan menelepon Mengerjakan(),
- Penanganan kesalahan, dengan kode kesalahan HTTP 400 “Permintaan yang buruk” Dalam hal kesalahan konversi (data masuk yang salah), atau mengatur data respons untuk pesan kesalahan jika terjadi kesalahan aplikasi,
- Struktur hasil dipetakan ke struktur data respons (XML atau JSON), menggunakan instance konverter yang sesuai,
- Akhirnya, data respons ditempatkan ke dalam tubuh respons HTTP, dan juga jenis respons yang tepat diatur: Aplikasi/JSON, atau Teks/XML.
Ini adalah sketsa umum – pemrosesan respons yang valid untuk semua Metode permintaan http dan untuk semua Jenis Konten (XML serta JSON). Detailnya terkandung dalam metode yang disebut.
metode lif_rest ~ handle_request. Data: LO_EX TYPE REF ke CX_ROOT, LV_CDATA TYPE String, LS_RESULT TYPE TY_RESULT. mencoba. * Jalankan operasi spesifik DO (mengimpor ES_RESULT = LS_RESULT). Tangkap zcx_parse_error ke lo_ex. go_response-> set_status (kode = 400 "alasan permintaan buruk = lo_ex-> get_text ()). set_response_parameters (). kembali. Tangkap zcx_error ke lo_ex. ls_result-message = lo_ex-> get_text (). ls_result-msgtype = 'e'. endtry. * Konversi struktur hasil menjadi JSON atau XML, masing-masing metode panggilan go_converter-> result_to_cdata ekspor is_result = ls_result mengimpor ev_cdata = lv_cdata. * Tempatkan hasil di metode panggilan badan respons set_response mengekspor iv_content_type = go_converter-> content_type () iv_cdata = lv_cdata. endmethod. "Handle_request
Tugas tertentu – permintaan put
Membiarkan’Lihatlah tugas khusus untuk ilustrasi: Permintaan put – yang selalu merupakan tugas untuk memperbarui atau memasukkan atribut pekerjaan untuk ID yang diberikan pada database. Sebagai berikut dari desain, ada kelas lokal LCL_REST_PUT menangani permintaan put. Sebenarnya, untuk penangan permintaan ini, hanya ada Mengerjakan Metode itu sendiri untuk diimplementasikan (yang merupakan minimum absolut untuk kelas tugas tertentu untuk diimplementasikan: Mengerjakan() abstrak di kelas induk. Tanpa implementasi, tidak ada contoh yang bisa dibangun.):
Kelas lcl_rest_put Definisi yang mewarisi dari lcl_rest. bagian yang dilindungi. Metode melakukan redefinisi. endclass. "Definisi lcl_rest_put
Implementasinya berjalan sebagai berikut:
- Pekerjaan dengan ID yang ditentukan dibaca dari database (jika ID ditentukan – untuk pekerjaan baru, ini bukan masalahnya),
- Data yang dimasukkan akan diuraikan ke dalam struktur LS_JOB, menggunakan yang sesuai go_converter contoh,
- Dan akhirnya, menyimpan() metode dipanggil. Itu diimplementasikan di superclass, karena metode permintaan lainnya menggunakannya juga.
Kelas LCL_REST_PUT IMPLEMENTASI. metode lakukan. Data: LS_JOB TYPE ZJOBS, LV_ID TYPE ZJOBS-ID. mencoba. get_job_by_id (mengimpor ES_JOB = LS_JOB). lv_id = ls_job-id. Tangkap zcx_not_found. endtry. Hapus ls_job. Metode panggilan go_converter-> get_entered_data mengekspor iv_cdata = go_request-> get_cdata () mengimpor es_job = ls_job. Jika ls_job tidak awal. Jika LV_ID tidak awal. ls_job-id = lv_id. berakhir jika. Simpan (mengubah cs_job = ls_job). es_result-message = 'job & telah disimpan' (002). ganti '&' di es_result-message dengan ls_job-id. ES_RESULT-MSGTYPE = 'S'. "Pesan Sukses Masukkan ls_job ke tabel es_result-jobs. berakhir jika. endmethod. "Lakukan endclass. "Implementasi LCL_REST_PUT
Perhatikan bahwa implementasi tugas ini tidak’T peduli tentang struktur data HTTP, format yang sebenarnya digunakan, atau tentang detail format data transfer. Itu hanya bekerja dengan struktur data ABAP ls_job untuk input dan ES_RESULT untuk output.
Sesi, identitas dan penguncian
Dalam aplikasi pengujian (baik di aplikasi JSON maupun di aplikasi XML), tidak ada login maupun enqueue data. Karena aplikasi terbuka untuk semua orang, ini hanya berfungsi karena saya tidak’T Sungguh beroperasi pada tabel basis data zjobs. Sebenarnya, setiap klien yang memanggil aplikasi bekerja dengan data sesi sendiri, jadi dia tidak’t bertentangan dengan pengguna lain’ operasi, dan dirinya sendiri tidak terganggu oleh pengguna lain. Data sesi dipertahankan untuknya sebagai cookie sisi server, selamat dari langkah dialog tunggal (misalnya memuat ulang halaman akan mereproduksi keadaan data saat ini).
Saat Web-Client ditulis sebagai BSP, ada Sesi-ID yang tersedia di atribut runtime-> server_id. ID sesi ini mengidentifikasi instance browser tertentu yang membuat permintaan. Di sisi klien, Sesi-ID ini selalu terkandung dalam cookie yang disebut SAP-APPCONTEXT. Jika suatu aplikasi memiliki status yang harus dilestarikan dengan ID sesi, ID harus diekstraksi dari cookie SAP-APPCONTEXT dan harus dilewati sebagai parameter kueri dengan semua permintaan AJAX. Berikut adalah fungsi yang mengekstraksi APPCContext SAP dari cookie:
function get_appcontext () < var lAppcontextCookie = document.cookie.match(/sap-appcontext=(.*?)(?:;|$)/); return lAppcontextCookie && ( lAppcontextCookie.length >= 2) && unescape (LappContextCookie [1]) || ""; >
AppContext yang dikembalikan dari fungsi ini, dapat dilewati sebagai parameter kueri dengan setiap permintaan AJAX. Di sisi server, ID sesi dapat diekstraksi dari parameter itu:
Metode get_session_id. Data: lv_app_context tipe string, lv_app_context64 type string. * Baca bidang formulir, disediakan oleh permintaan AJAX LV_App_Context64 = io_server-> request-> get_form_field ('SAP_AppContext'). Jika lv_app_context64 tidak awal. * Base64 decode lv_app_context = cl_http_utility => decode_base64 (lv_app_context64). * Ekstrak sesi-id temukan regex 'gap sessiesid = ([^;]+) (?:; | $) 'Di lv_app_context mengirimkan ev_session_id. berakhir jika. Jika ev_session_id adalah awal. ev_session_id = io_server-> session_id. berakhir jika. endmethod.
Sebagai fallback, di baris 22, server-> session_id digunakan. Namun, akan ada server baru-> session_id untuk setiap permintaan, yang menghasilkan data sesi baru dengan setiap langkah dialog. Jika Anda benar -benar membutuhkan manajemen sesi, sangat penting bahwa ID sesi diteruskan ke server.
Merupakan ide yang baik untuk menggabungkan ID sesi dengan prosedur login: Jika pengguna mengotentikasi, browsernya menerima Sesi-ID dengan validitas terbatas. Sesi-ID itu harus dilewati dengan setiap operasi istirahat berturut-turut. Di ABAP, dapat digunakan untuk menyimpan dan mengambil data khusus sesi di tabel database SScookie, melalui kelas akses basis data CL_BSP_SERVER_SIDE_COOKIE.
Kopling ID sesi ini dengan login ini – kira -kira – cara bagaimana API REST untuk Pusat Kualitas HP bekerja.
Menggunakan ABAP’S konverter JSON built-in
Sementara instance konverter XML cukup mudah untuk diterapkan -memanggil transformasi XSLT untuk XML -> ABAP, dan satu lagi untuk jalan ke belakang -mungkin mengejutkan bahwa konversi JSON dapat ditangani dengan cara yang persis sama: dengan transformasi. Ini dimungkinkan karena panggilan transformasi Pernyataan mendukung format JSON (setidaknya sesuai SAP_BASIS 702). JSON terdeteksi secara otomatis dan diuraikan ke dalam format JSON-XML menengah. Ini dapat diproses dengan transformasi XSLT yang sewenang -wenang, dan dikonversi menjadi dokumen XML lainnya atau menjadi data ABAP.
Misalnya, permintaan put dari aplikasi pengujian kami dapat mengirim data JSON berikut ke server:
Jika string dengan konten ini dilewatkan sebagai “Sumber XML” ke ABAP’Pernyataan Transformasi Panggilan, JSON akan diuraikan ke dalam representasi XML seperti ini (formatnya mudah dimengerti – saya pikir penjelasan yang tidak diperlukan di sini):
Saat memproses transformasi XSLT yang sewenang-wenang, dengan pernyataan transformasi panggilan, dan meneruskan string JSON sebagai sumber, XSLT akan beroperasi pada representasi JSON-XML internal ini. Mudah untuk mengubah dokumen JSON-XML seperti itu menjadi data ABAP-lebih tepatnya: mengubahnya menjadi representasi ASXML dari data ABAP. Misalnya, pertimbangkan transformasi XSLT berikut:
Ketika diterapkan pada string JSON, itu akan menghasilkan hasil berikut:
0001 RSNAST00 Uxpd_kube_kv 2 X Rainer Zufall Keluaran semua konfirmasi pesanan penjualan
Ini adalah deskripsi data ABAP yang valid. Jika transformasi bernama ZJSON2JOB, data dapat dengan mudah diimpor ke dalam struktur data ABAP dengan ID Komponen, Repid, dan sebagainya – seperti halnya struktur ES_JOB dalam implementasi konverter JSON berikut berikut.
Implementasi LCL_JSON_CONVERTER Kelas. Metode get_entered_data. Data: lo_ex type ref ke cx_transformation_error. Hapus ES_JOB. Periksa ruang CN iv_cdata. mencoba. Transformasi Panggilan ZJSON2JOB Sumber XML IV_CDATA Hasil Job = ES_JOB. Tangkap cx_transformation_error ke lo_ex. raise_parse_error (lo_ex). endtry. endmethod. "get_entered_data
Banyak hal yang dapat dilakukan dengan ID transformasi identitas, tanpa perlu mendefinisikan transformasi XSLT sendiri sama sekali. Jika Anda dapat memaksakan struktur data JSON untuk digunakan dalam aplikasi web, itu adalah keuntungan untuk menggunakan “resmi” struktur. Misalnya, pertimbangkan untuk membungkus hash json dengan atribut pekerjaan ke hash lain, menjadikannya nilai untuk beberapa nama kunci simbolik seperti “PEKERJAAN”:
Maka data dapat diuraikan ke dalam struktur tanpa perlu mengembangkan transformasi XSLT khusus, sederhana menggunakan identitas:
Sumber ID Transformasi Panggilan XML IV_CDATA Hasil Job = ES_JOB.
Dalam contoh ini, karena saya telah menulis Web-Client dan pemrosesan sisi server, saya bisa memilih ini lagi “resmi” format. Tetapi dengan tidak memilihnya, saya belajar cara bekerja dengan format data JSON yang lebih fleksibel.
Ada beberapa alasan untuk bekerja dengannya “non-kanonik” Representasi JSON dari data ABAP:
- Format JSON dapat dirancang untuk aplikasi web – untuk mengoptimalkan keterbacaan kode JavaScript klien yang bekerja pada data.
- Mungkin ada komponen klien yang membutuhkan format JSON tertentu. Misalnya, jQuery DataTable mengharuskan data tabel untuk dilewati sebagai array array: http: // www.DataTables.net/rilis-datatables/contoh/data_sources/ajax.html
- Layanan pihak ketiga yang berbasis di JSON dapat dipanggil dari sisi ABAP (dengan objek klien HTTP)
- Data ABAP mungkin diproyeksikan ke data penting, mengurangi ukuran pesan ke data yang benar -benar dibutuhkan.
Hanya untuk ilustrasi, biarkan’s lihat konversi lain – jalan keluar dari server ke klien. Sekali lagi, formatnya sedikit berbeda dari “resmi” Format json, yang akan menyederhanakan penanganan sisi ABAP. Seperti disebutkan, struktur data hasil berisi
- sebuah pesan,
- jenis pesan,
- dan tabel atribut pekerjaan:
Jenis: Mulai dari TY_RESULT, tipe msgtype symsgty, jenis pesan C panjang 255, JOBS TYPE ZJOBS_TAB, akhir TY_RESULT.
Format berikut akan menjadi liontin JSON yang sempurna untuk struktur ini. Itu bisa hanya diproduksi dengan transformasi identitas, lewat sebagai “Hasil Sumber = LS_RESULT” (Di mana LS_RESULT adalah struktur jenis TY_RESULT):
- Semua nama komponen sangat cocok dengan nama kunci JSON Hash,
- Tabel internal dipetakan sebagai serangkaian hash JSON, masing -masing hash mewakili satu entri tabel,
- Dan ada hash tingkat atas dengan nama simbolis “HASIL” untuk hal yang lengkap:
Tetapi format JSON yang didukung API REST, sebenarnya berbeda dalam beberapa detail:
- Pekerjaan dirancang bukan sebagai array, tetapi sebagai hash, dengan ID sebagai kunci hash.
- Tidak ada hash yang berlebihan, membungkus semuanya sebagai nilai untuk beberapa kunci.
- Komponen untuk msgType berbeda. Itu hanya disebut tipe.
Berikut adalah contoh contoh:
< "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" >>, "Pesan": "", "type": "">
Kami melanjutkan dengan cara yang sama seperti di atas, hanya ke arah lain: berdasarkan tipe data ABAP TY_RESULT, Kami menulis transformasi XSLT untuk mendapatkan format JSON-XML internal yang sesuai dengan string data JSON ini.
Format data JSON-XML dari string data JSON yang diinginkan terlihat seperti ini:
Jadi ini adalah target yang harus diperoleh sebagai hasil dari transformasi. Di sisi lain, format ASXML dari struktur Ty_result terlihat seperti ini:
0001 RSNAST00 Uxpd_kube_kv 2 X Rainer Zufall Keluaran semua konfirmasi pesanan penjualan 0002 Rbdapp01 Uxpd_edi_gut02 3 X Herbert Hurtig Memo kredit Tes SAYA
Dan ini adalah program XSLT yang akan melakukan transformasi:
Kami melihat itu, pada dasarnya, untuk setiap penyimpangan dari “resmi” Representasi JSON dari data ABAP, ada templat dalam transformasi XSLT yang menangani penyimpangan ini. Misalnya, jenis nama yang berbeda alih -alih msgType di target ditangani dengan template
ID harus disusun ulang: dari menjadi atribut sederhana dari struktur data Zjobs, ia harus dinaikkan satu tingkat lebih tinggi untuk menjadi kunci hash. Semua atribut lainnya, kecuali ID, disalin sebagai node string ke dalam hasilnya. Untuk ini, kedua templat ini diperlukan:
Memetakan objek data TY_RESULT ke dalam string JSON dari format yang diharapkan, sekarang dilakukan di ABAP dengan kode berikut:
metode result_to_cdata. Data: LO_WRITER TYPE REF ke CL_SXML_STRING_WRITER. lo_writer = cl_sxml_string_writer => create (type = if_sxml => co_xt_json). Transformasi Panggilan Data Sumber ZJOBS2JSON = IS_RESULT Hasil XML LO_WRITER. ev_cdata = cl_abap_codepage => convert_from (lo_writer-> get_output ()). endmethod. "result_to_cdata
Itu’S ALL: EV_CDATA kemudian akan berisi string data JSON, untuk ditempatkan di badan respons HTTP.
Ringkasan
Saya menguraikan beberapa topik khas tentang implementasi API REST di ABAP. Dimungkinkan untuk menjaga kekhawatiran terpisah di kelas yang terpisah (lokal atau global) dengan menerapkan pola seperti strategi. Beginilah cara kelas ZCL_JOB_DATA, melayani API Demo REST saya, disusun (ide -ide dasar telah dibahas dalam blog ini):
Cara Membuat API REST dengan SAP ABAP dan terapkan routing MVC1
Di posting blog ini, saya ingin menunjukkan cara membuat REST API dan cara menerapkan routing MVC1 untuk menangani permintaan yang berbeda hanya dari kelas pengontrol.
Untuk itu, pertama -tama kita akan membuat kelas penangan dan pengontrol untuk struktur istirahat. Kemudian kami akan menambahkan kelas pengontrol MVC1 dan kelas model untuk memproses logika bisnis.
Dan akhirnya kami akan membuat layanan untuk menangani permintaan istirahat.
Di akhir posting, ada browser web, tukang pos dan contoh yang memakan waktu untuk API REST yang sama.
Untuk membaca lebih lanjut tentang SAP REST, lihat tutorial istirahat.
Buat struktur berikut;
- ZREST_S_RESP_STATE
- Zrest_s_response
- Zrest_s_request
- ZREST_S_RESP_STATE
- Zrest_s_response
Sekarang kami akan melakukannya Buat kelas.
Hubungi tumpukan untuk panggilan
- Zrest_cl_defs
- Zrest_cl_model
- Zrest_cl_req_controller
- Zrest_cl_req_http_handler
- Zrest_cl_http_handler
Kelas zrest_cl_defs definisi publik membuat publik . Bagian Publik. Constants c_state_success Tipe Char1 nilai '## no_text. Konstanta c_state_warning Jenis nilai char1 'w' ## no_text. Konstanta c_state_error Jenis nilai char1 'e' ## no_text. Bagian yang dilindungi. Bagian Pribadi. Endclass. Implementasi kelas zrest_cl_defs. Endclass.
Kelas zrest_cl_model definisi publik final create public . Bagian Publik. Metode get_dateTime mengekspor !response_body type zrest_s_response-body !Tipe status zrest_s_response-state . Bagian yang dilindungi. Bagian Pribadi. Endclass. Implementasi kelas zrest_cl_model. * ---------------------------------------------------------------------------------------+ * | Instance Metode Publik ZREST_CL_MODEL-> GET_DATETIME * + ----------------------------------------------------------------------------------------------- + * | [Metode get_dateTime. Data: EXREF TYPE REF ke CX_ROOT. MENCOBA . Jenis: Mulai dari Ty_res, datetime type tznTimestp, akhir ty_res. Data: Res Type Ty_res. res-datetime = sy-datum && sy-uzeit. response_body = /ui2 /cl_json => serialize (mengekspor data = res). state-state = zrest_cl_defs => c_state_success. Menangkap cx_root ke exref. state-state = zrest_cl_defs => c_state_error. state-state_text = exref-> get_text (). Endtry. Endmethod. Endclass.
Kelas ZREST_CL_REQ_CONTROLLER DEFINISI PUBLIK PUBLIC CREATE PUBLIK PUBLIK . Bagian Publik. Metode Process_request Mengimpor !req_json type string ekspor !string tipe response_json !response_stc type zrest_s_response . Bagian yang dilindungi. Bagian Pribadi. Konstanta: C_REQ_GET_DATETIME TYPE ZREST_E_REQ_ID Nilai '1001'. Metode conv_stc_to_json mengimpor respons_stc type zrest_s_response nilai pengembalian (hasil) Jenis string. Endclass. Implementasi Kelas ZREST_CL_REQ_CONTROLLER. * ---------------------------------------------------------------------------------------+ * | Instance Metode Privat ZREST_CL_REQ_CONTROLLER-> conv_stc_to_json * + --------------------------------------------------------------------------------------------------- + | | [--->] response_stc type zrest_s_response * | [Metode conv_stc_to_json. Data: EXREF TYPE REF ke CX_ROOT. MENCOBA . hasil = /ui2 /cl_json => serialize (mengekspor data = response_stc). Tangkap CX_ROOT. hasil = exref-> get_text (). Endtry. Endmethod. * ---------------------------------------------------------------------------------------+ * | Instance Metode Publik ZREST_CL_REQ_CONTROLLER-> Proses_Request * + ----------------------------------------------------------------------------------------------- + * | [--->] REQ_JSON TYPE STRING * | [Metode Process_Request. Data: EXREF TYPE REF ke CX_ROOT. MENCOBA . Data req_stc tipe zrest_s_request. /ui2/cl_json => deserialize (mengekspor json = req_json mengubah data = req_stc). Jika req_stc-id tidak awal. Data (model) = zrest_cl_model () baru. Jika req_stc-id eq c_req_get_datetime. model-> get_dateTime (mengimpor response_body = response_stc-body state = response_stc-state). KALAU TIDAK. response_stc-state-state = zrest_cl_defs => c_state_warning. Pesan S001 (ZREST_MSG) menjadi response_stc-state_text. BERAKHIR JIKA. KALAU TIDAK. "Isi konten dummy sebagai sampel req_stc-id = 999999. req_stc-body = 'beberapa konten json'. response_stc-body = /ui2 /cl_json => serialize (mengekspor data = req_stc). response_stc-state-state = zrest_cl_defs => c_state_warning. Pesan S002 (ZREST_MSG) menjadi response_stc-state_text. BERAKHIR JIKA. response_json = conv_stc_to_json (response_stc = response_stc). Tangkap 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). Endtry. Endmethod. Endclass.
Kelas zrest_cl_req_http_handler definisi publik warisan dari cl_rest_resource final create public . Bagian Publik. Metode if_rest_resource ~ Dapatkan redefinisi . Metode if_rest_resource ~ post redefinition . Bagian yang dilindungi. Bagian Pribadi. Endclass. Kelas zrest_cl_req_http_handler implementasi. * ---------------------------------------------------------------------------------------+ * | Instance Metode Publik ZREST_CL_REQ_HTTP_HANDLER-> if_rest_resource ~ Get * + --------------------------------------------------------------------------------------------------- + * +-------------------------------------------------------------------------------------- Metode if_rest_resource ~ dapatkan. Data (req_json) = mo_request-> get_uri_query_parameter (iv_name = 'req' iv_encoded = abap_false). Data (pengontrol) = zrest_cl_req_controller () baru. controller-> process_request (mengekspor req_json = req_json mengimpor response_json = data (response_json)). mo_response-> create_entity ()-> set_string_data (iv_data = response_json). Endmethod. * ---------------------------------------------------------------------------------------+ * | Instance Metode Publik ZREST_CL_REQ_HTTP_HANDLER-> if_rest_resource ~ Posting * + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ [--->] io_entity type ref ke if_rest_entity * +-------------------------------------------------------------------------------------- Metode IF_REST_RESOURCE ~ POST. Data (req_json) = mo_request-> get_entity ()-> get_string_data (). Data (pengontrol) = zrest_cl_req_controller () baru. controller-> process_request (mengekspor req_json = req_json mengimpor response_json = data (response_json)). mo_response-> create_entity ()-> set_string_data (iv_data = response_json). Endmethod. Endclass.
CSRF dinonaktifkan di handler di bawah ini. Menonaktifkannya dari parameter layanan GUI tidak berhasil. Anda perlu menerapkan handle_csrf_token untuk menonaktifkannya untuk istirahat.
kelas zrest_cl_http_handler definisi publik warisan dari cl_rest_http_handler membuat publik . Bagian Publik. "Menyediakan perutean. Jalur perutean ditetapkan untuk pengontrol dalam metode metode ini IF_REST_APPLICATION ~ get_root_handler redefinition . bagian yang dilindungi. "Jika Anda ingin menonaktifkan, mendefinisikan kembali metode itu. Sama seperti metode kosong. Metode handle_csrf_token redefinisi . Bagian Pribadi. Endclass. Kelas ZREST_CL_http_handler Implementasi. * ---------------------------------------------------------------------------------------+ * | Metode Protected Contoh Zrest_Cl_http_handler-> handle_csrf_token * + --------------------------------------------------------------------------------------------- + * | [--->] io_csrf_handler Jenis ref ke IF_REST_CSRF_HANDLER * | [--->] IO_REQUEST TYPE REF ke IF_REST_REQUEST * | [--->] IO_RESPONSE TYPE REF ke IF_REST_RESPONSE * +-------------------------------------------------------------------------------------- metode handle_csrf_token. * Metode panggilan super-> handle_csrf_token * mengekspor * io_csrf_handler = * io_request = * io_response = * . endmethod. * ---------------------------------------------------------------------------------------+ * | Instance Metode Publik ZREST_CL_HTTP_HANDLER-> if_rest_application ~ get_root_handler * + --------------------------------------------------------------------------------------------------- [Metode if_rest_application ~ get_root_handler. "Menyediakan perutean. "Layanan Jalur/SAP/BC/REST" URL Sampel http: // vhcalnplci: 8000/getah/bc/istirahat/zrest/istirahat?SAP-CLIENT = 001 & req = data (root_handler) = cl_rest_router baru (). root_handler-> lampirkan (mengekspor iv_template = '/rest' "nama terpadu untuk sumber daya iv_handler_class = 'zrest_cl_req_http_handler'" nama tipe objek). * "Anda dapat menambahkan lebih banyak permintaan kelas penangan *" Jalur layanan/SAP/BC/REST * "URL Sampel http: // vhcalnplci: 8000/getah/bc/rest/zrest/rest2?SAP-CLIENT = 001 & req = * root_handler-> lampirkan ( * mengekspor * iv_template = '/rest2' "nama terpadu untuk sumber daya * iv_handler_class = 'zrest_cl_req_http_handler2'" nama tipe objek *). ro_root_handler = root_handler. Endmethod. Endclass.
Dan langkah terakhir, Buat Layanan.
Buka tcode siCf dan jalankan.
Pergi ke/SAP/BC/istirahat dan tambahkan sub elemen baru
Tambahkan deskripsi dan buka tab Daftar Handler dan kelas kami, zrest_cl_http_handler, sebagai penangan.
Aktifkan Layanan. Layanan klik kanan dan klik tes. Itu akan membuka browser. Ubah URL untuk menangani /istirahat permintaan.
Dalam kasus saya, http: // vhcalnplci: 8000/getah/bc/istirahat/zrest/Istirahat
Jika Anda ingin melewati beberapa params di Get Request, tambahkan parameter string kueri seperti ‘http: // vhcalnplci: 8000/getah/bc/istirahat/zrest/istirahat?SAP-CLIENT = 001 & req =’
Jika Anda tidak menonaktifkan CSRF di Handler, Anda akan memiliki masalah yang memanggil metode non-get, seperti metode pos dari tukang pos atau dari klien yang berbeda dari server itu sendiri.
Oleh karena itu dalam contoh saya, saya telah menonaktifkan CSRF.
Contoh Pos
Parameter Otentikasi Dasar
Dapatkan contoh dan hasilnya
Contoh posting dan hasil
Untuk mengkonsumsi dari ABAP
Kami akan menggunakan httpClient untuk melakukan panggilan dan kami akan mengurai struktur ABAP dengan contoh get_datetime.
Kode Klien HTTP
Kelas zutil_cl_rest_ws definisi publik menciptakan publik . "Pembungkus kelas untuk membuat layanan Publik Layanan Web REST. "Konstanta Konstanta: c_content_type_json Jenis nilai string 'Aplikasi/json; charset = utf-8', c_content_type_xml type nilai string 'aplikasi/xml; charset = utf-8', c_request_method_get tipe string 'get', c_request_geest_post_get value 'get', C_REQUEST_REQUEST_POOD_GET POSTOT '. "Make WS Call Metode Call_WS Impor Nilai (I_URL) Ketik Nilai String (i_content_type) Ketik String Default C_Content_Type_JSON Nilai (i_request_method) Jenis string Nilai opsional (i_peting nilai export (i_usname) Nilai string (i_peting) Nilai Export (I_USERNAME) IL_CL_DEFS => nilai gty_state (e_response_str) Jenis string. Bagian yang dilindungi. Bagian Pribadi. Data http_client type ref ke if_http_client. Metode Fill_warning Nilai Pengembalian (Negara) Ketik zutil_cl_defs => gty_state. Endclass. Kelas ZUTIL_CL_REST_WS Implementasi. * ---------------------------------------------------------------------------------------+ * | Instance Metode Publik ZUTIL_CL_REST_WS-> call_ws * + --------------------------------------------------------------------------------------------------- + * | [--->] i_url Type String * | [--->] i_content_type string tipe (default = c_content_type_json) * | [--->] i_request_method Jenis string (default = c_request_method_get) * | [--->] i_username Type String (opsional) * | [--->] I_PASSWORD Jenis String (Opsional) * | [--->] i_payload type string (opsional) * | [Gty_state * | [Metode call_ws. Data: EXREF TYPE REF ke CX_ROOT. MENCOBA. "Menggunakan create_by_url ini dapat menyederhanakan aspek tertentu dari menggunakan kelas ini gratis http_client. cl_http_client => create_by_url (mengekspor url = i_url mengimpor klien = http_client pengecualian argument_not_found = 1 plugin_not_active = 2 internal_error = 3 lainnya = 4). Jika sy-subrc <> 0. e_state-state = Fill_warning (). KEMBALI. BERAKHIR JIKA. "Logika saya awalnya menggunakan put, tetapi Anda harus dapat mengubah untuk memposting http_client-> request-> set_method (i_request_method). http_client-> request-> set_content_type (i_content_type). "Ingatlah untuk mengotentikasi jika i_username bukan awal atau I_Password bukan inisial. http_client-> otentikasi (username = i_username password = i_password). BERAKHIR JIKA. "Jika ada, siapkan muatan dan tetapkan jika i_payload tidak awal. "Konversi muatan itu ke xstring. Data lv_payload_x type xstring. Fungsi panggilan 'scms_string_to_xstring' ekspor teks = i_payload mengimpor buffer = lv_payload_x pengecualian gagal = 1 lainnya = 2. Jika sy-subrc <> 0. e_state-state = zutil_cl_defs => c_state_warning. E_State-state = 'kesalahan pengkodean!'. KEMBALI. KALAU TIDAK. http_client-> request-> set_data (lv_payload_x). "Data biner endif. BERAKHIR JIKA. "Mengirim permintaan http_client-> kirim (pengecualian http_communication_failure = 1 http_invalid_state = 2). Jika sy-subrc <> 0. e_state-state = Fill_warning (). KEMBALI. BERAKHIR JIKA. "Menerima respons http_client-> terima (pengecualian http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3). Jika sy-subrc <> 0. e_state-state = Fill_warning (). KEMBALI. BERAKHIR JIKA. "Periksa responsnya. Semoga Anda mendapatkan kembali respons JSON. e_response_str = http_client-> response-> get_cdata (). Jika E_RESPONSE_STR adalah awal. e_response_str = http_client-> respons-> get_data (). BERAKHIR JIKA. e_state-state = zutil_cl_defs => c_state_success. e_state-state_text = 'berhasil diselesaikan.'. Menangkap cx_root ke exref. e_state-state = zutil_cl_defs => c_state_error. e_state-state_text = exref-> get_text (). Endtry. Endmethod. * ---------------------------------------------------------------------------------------+ * | Instance Metode Privat Zutil_Cl_Rest_WS-> Fill_warning * + ----------------------------------------------------------------------------------------------- + * | [Gty_state * +-------------------------------------------------------------------------------------- Metode fill_warning. state-state = zutil_cl_defs => c_state_warning. http_client-> get_last_error (mengimpor pesan = data (msg) "pesan kesalahan). state-state_text = msg. Endmethod. Endclass.
Kode Kelas Konsumen. Pertama membuka bungkus struktur respons dan memeriksa negara bagian. Jika berhasil maka membuka bagian tubuh JSON untuk hasil Call ID 1001.
Kelas ZREST_CL_CONSUMER DEFINISI PUBLIK PUBLIC CREATE PUBLIK PUBLIK . Bagian Publik. Metode get_dateTime mengekspor status tipe zutil_cl_defs => gty_state dt type tznTimestp. Bagian yang dilindungi. Bagian Pribadi. Endclass. Implementasi kelas zrest_cl_consumer. * ---------------------------------------------------------------------------------------+ * | Instance Metode Publik ZREST_CL_CONSUMER-> GET_DATETIME * + --------------------------------------------------------------------------------------------------- + | | [Gty_state * | [Metode get_dateTime. "Metode Sampel untuk Mengonsumsi Data API Web REST: Exref Type Ref ke CX_ROOT. MENCOBA. "Konstanta: C_uname Tipe Nilai String 'Pengembang', C_Pass Jenis Nilai String 'Down1oad'. "Build Get Call Data: URL Jenis Nilai String 'http: // vhcalnplci: 8000/getah/bc/istirahat/zrest/istirahat?SAP-CLIENT = 001 '. Data req_stc tipe zrest_s_request. req_stc-id = '1001'. Data (req_json) = /ui2 /cl_json => serialize (mengekspor data = req_stc). url = url && '& req =' && req_json. "Call Web API New Zutil_CL_REST_WS ()-> call_ws (mengekspor i_url = url i_username = c_uname i_password = c_pass mengimpor e_state = state e_response_str = data (json_response))). Jika state-state eq zutil_cl_defs => c_state_success. Data: resp_stc Tipe zrest_s_response. /ui2/cl_json => deserialize (mengekspor json = json_response mengubah data = resp_stc). If resp_stc-state-state eq zutil_cl_defs => c_state_success. Jenis: Mulai dari Ty_res, datetime type tznTimestp, akhir ty_res. Data: RESP_1001 TYPE TY_RES. /ui2/cl_json => deserialize (mengekspor json = resp_stc-body mengubah data = resp_1001). dt = resp_1001-datetime. BERAKHIR JIKA. BERAKHIR JIKA. Menangkap cx_root ke exref. state-state = zutil_cl_defs => c_state_error. state-state_text = exref-> get_text (). Endtry. Endmethod. Endclass.
Itu semuanya. Dengan cara itu, Anda dapat mengintegrasikan lingkungan apa pun, sistem ke SAP.
Berharap itu membantu.
Terima kasih sudah membaca.
tautan yang berhubungan