SAP REST API kullanıyor mu?
(Bulut) ABAP ile dinlenme API’lerini tüketmek
Yöntem çağrısı
REST API’leri ile çalışırken SAP, uygulamalar arasında iletişim için REST API kullanıyor. Bu makalede, ABAP kullanarak, özellikle bulut ABAP işlevselliği ile dinlenme API’lerinin nasıl tüketileceğini araştıracağız. Bilmeniz gereken kilit noktalar:
- API, uygulama programlama arayüzü anlamına gelir ve iki uygulamanın birbiriyle iletişim kurmasına izin verir.
- REST API’leri, HTTP protokolünü kullanarak API’lerin oluşturulması ve URI’ler aracılığıyla JSON veya XML verilerini gönderme/alma modelidir.
- SAP dünyasında popüler olan odata, bir tür dinlenme API.
- ABAP’de harici API’lerin tüketilmesinde sınırlı bilgi mevcuttur, özellikle bulut ABAP için beyaz liste API’ler.
- Bu öğreticide, gösteri amacıyla JSON Placeholder API’sını kullanacağız.
- API sağlayıcısı yayınlar, yorumlar, albümler, fotoğraflar, todos ve kullanıcılar gibi kaynaklar sunar.
- Basitlik için yayın kaynağına odaklanacağız.
- Bir yayının kimliği, başlığı, gövdesi ve kullanıcı kimliği var.
- ABAP’ta dinlenme API’lerini tüketmek için, IF_WEB_HTTP_CLIent adlı beyaz liste API API’sını kullanacağız.
- JSON ile çalışmak için XCO kütüphanesini de kullanacağız.
Sorular:
- API neyi temsil ediyor?
API uygulama programlama arayüzü anlamına gelir. - REST API’leri nedir?
REST API’leri, HTTP protokolünü kullanarak API’lerin oluşturulması ve URI’ler aracılığıyla JSON veya XML verilerini gönderme/alma modelidir. - Odata nedir?
OData, SAP dünyasında popüler olan bir tür dinlenme API’sıdır. - ABAP’ta harici API’lerin tüketilmesinde çok fazla bilgi var mı?
Hayır, özellikle bulut abap için beyaz liste API’ler için sınırlı bilgi mevcut. - Bu öğreticide hangi API sağlayıcısını kullanacağız??
JSON Placeholder API’sını gösteri amacıyla kullanacağız. - JSON Placeholder API hangi kaynakları sunuyor??
JSON Placeholder API, yayınlar, yorumlar, albümler, fotoğraflar, todos ve kullanıcılar gibi kaynaklar sunar. - Bu öğreticiye hangi kaynağa odaklanacağız??
Basitlik için yayın kaynağına odaklanacağız. - Bir gönderi hangi özelliklere sahiptir?
Bir yayının kimliği, başlığı, gövdesi ve kullanıcı kimliği var. - Beyaz liste ABAP API’sını REST API’lerini tüketmek için kullanacağız?
IF_WEB_HTTP_CLIent API’sını kullanacağız. - JSON ile çalışmak için hangi kütüphaneyi kullanacağız?
XCO kütüphanesini kullanacağız.
Ayrıntılı cevaplar:
- API neyi temsil ediyor?
API uygulama programlama arayüzü anlamına gelir. İki uygulamanın birbiriyle iletişim kurmasına izin veren bir dizi standarttır. - REST API’leri nedir?
REST API’leri, HTTP protokolünü kullanarak API oluşturma modelidir. Uygulamaların URIS aracılığıyla JSON veya XML verilerini göndermesine ve almasına izin verirler. JSON tabanlı dinlenme API’leri yaygın olarak kullanılır. - Odata nedir?
OData, SAP dünyasında çok popüler olan bir tür dinlenme API’sıdır. SAP sistemlerinde depolanan verilerin kolay erişimine ve manipülasyonunu sağlar. - ABAP’ta harici API’lerin tüketilmesinde çok fazla bilgi var mı?
Hayır, ABAP’ta harici API’lerin tüketilmesinde, özellikle bulut ABAP ile kullanılabilecek beyaz liste API’ler için sınırlı bilgi mevcuttur. Bu öğretici, bulut ABAP kullanarak dinlenme API’lerinin tüketilmesi konusunda rehberlik sağlamayı amaçlamaktadır. - Bu öğreticide hangi API sağlayıcısını kullanacağız??
Test ve prototipleme için ücretsiz kullanımı sahte bir çevrimiçi dinlenme API’sı olan JSON Placeholder API’sını kullanacağız. Crud (Oluştur, Okuma, Güncelleme, Sil) eylemleri yapmamıza izin verir. - JSON Placeholder API hangi kaynakları sunuyor??
JSON Placeholder API, yayınlar, yorumlar, albümler, fotoğraflar, todos ve kullanıcılar gibi kaynaklar sunar. Bu öğreticide, yayın kaynağına odaklanacağız. - Bu öğreticiye hangi kaynağa odaklanacağız??
JSON Placeholder API’sinden yayın kaynağına odaklanacağız. Bu, SAP Cloud platformunda Whitelisted ABAP API’lerini kullanarak bir REST API’sında CUD eylemlerinin nasıl yürütüleceğini göstermemize izin verecektir. - Bir gönderi hangi özelliklere sahiptir?
Bir yayının kimliği, başlığı, gövdesi ve kullanıcı kimliği var. Kimlik, yayının benzersiz tanımlayıcısını temsil eder ve kullanıcı kimliği, yayını oluşturan kullanıcının kimliğini temsil eder. - Beyaz liste ABAP API’sını REST API’lerini tüketmek için kullanacağız?
ABAP’de dinlenme API’lerini tüketmek için IF_WEB_HTTP_CLIent API’sını kullanacağız. Bu, SAP Cloud platformunda kullanılmasına izin verilen beyaz listeli bir ABAP API’sıdır. - JSON ile çalışmak için hangi kütüphaneyi kullanacağız?
JSON ile çalışmak için XCO (Uzatma Bileşenleri) Kütüphanesinin Cloud Platform Edition’ı kullanacağız. Bu kütüphane, JSON verilerini Camelcase gibi farklı adlandırma kuralları arasında Under_score’a dönüştürmek için yararlı işlevsellik sağlar,.
Bu öğreticiyi takip ederek, özellikle bulut ABAP işlevselliği ile ABAP kullanarak dinlenme API’lerini tüketebileceksiniz.
(Bulut) ABAP ile dinlenme API’lerini tüketmek
Post yöntemi çağrısı ->
SAP REST API kullanıyor mu?
О э э с сне
М з з рарегистрировали подозрительный тик, исходящий из Вашей сий. С п с о ы ы с п п с xм ы с с ы xм ы ы с с о x ыи с с ои от от от оз пе пе от от оз он оны от оны онныы онныы онн вы, а н, а нбн Вы,. Поч yatırıl?
Эта страница отображается в тех случаях, когда автоматическими системами Google регистрируются исходящие из вашей сети запросы, которые нарушают Условия использования. Сраница перестанет отображаться после того, как эи запросы прекратяттся. До эого момента дл Ekim ил исползования служб Google нобходим çar.
Источником запросов может служить вредоносное ПО, подключаемые модули браузера или скрипт, настроенный на автоматических рассылку запросов. Если вы используете общий доступ в Интернет, проблема может быть с компьютером с таким же IP-адресом, как у вас. Обратитесь к своемtern. Подробнее.
Проверка по со может luV пе появляться, ео е Вводия, оожо Вы воде сн ыыыые ае iri ае ае iri ае ае iri пе ае iri ае ае iri пе ае iri пе ае iri пе ае iri пе ае ае ае ае iri пе аотототыыыыыыыыыыыететет ]p anauma аете keluma емами, или же водите запросы очень часто.
(Bulut) ABAP ile dinlenme API’lerini tüketmek
API, uygulama programlama arayüzü anlamına gelir ve iki uygulamanın birbiriyle konuşmasına izin veren bir dizi standart içerir. REST API’leri, API’lerin oluşturulmasının belirli bir modelidir. HTTP protokolüne dayanıyor, URIS (Tekdüzen Kaynak Tanımlayıcısı) aracılığıyla JSON veya XML verilerini gönderiyor ve alıyorlar. JSON merkezli dinlenme API’leri yaygındır. Bu öğreticide de böyle bir tane kullanacağız.
SAP dünyasında çok popüler olan Odata. ABAP’den bir dinlenme API’sının nasıl sağlanacağına dair çok fazla bilgi var (i.e., bir OData hizmeti yayınlamak için). Ama yok’T ABAP’ta harici bir API’nın nasıl tüketileceğine dair çok fazla. Ve ne kadar az şeyden, beyazlaşmamış ABAP API’leri içerir, i.e., bulut abap ile kullanılamazlar. Bu yüzden, bu öğreticiyi bulut abap kullanarak dinlenme API’lerini tüketmeye karar verdim.
Senaryo
API sağlayıcısı
JSON Placeholder ile çalışacağız – “Test ve prototipleme için sahte çevrimiçi dinlenme API’sını kullanmak için ücretsiz”. Tüm Crud (Oluştur, Oku, Güncelleme, Sil) Eylemleri gerçekleştirmemize izin verecek. Adil olmak gerekirse, oluşturma, güncelleme ve silme gerçekten işe yaramayacak, ancak sunucu sanki bunu yapıyormuş gibi taklit edecek. Kullanım durumumuz için tamamen yeterli!
Kaynaklar
API sağlayıcımız ortaya çıkar gönderiler, Yorumlar, albümler, fotoğraflar, todos, Ve kullanıcılar. Basitlik için’uğruna, sadece kullanacağız gönderiler kaynak ve gerisini taklit etmek’orada. Eğiticimin ana fikri, bir REST API’sında CUD eylemlerinin nasıl yürütüleceğine dair son derece basit bir rehber sağlamaktır. Ve bunu SAP Cloud Platformunda (CP) beyaz liste ABAP API’lerini kullanarak yapın. Bu, bu kodu bir SAP CP deneme hesabında çalıştırabileceğiniz anlamına gelir.
Gönderiler kaynak
Bir yayının kimliği, başlığı, gövdesi ve kullanıcı kimliği vardır, yani yayını oluşturan kullanıcının kimliği. ABAP’ta aşağıdaki gibi temsil ediyoruz:
Türler: Post_s, User_ID Type I, Id Tip I, Başlık Türü String, gövde tipi dizesi, Post_s sonu, Post_tt Tip Post_s tablosunun Boş tuşlu, Post_without_id_s, User_id Tip I, Başlık Türü String, Gövde Türü, Sonu Post_without_id_s Sonu.
Yapıya kimliksiz ihtiyacımız var çünkü posta kimliği geri kalan API tarafından otomatik olarak atandı. Yani yeni bir gönderi oluştururken bunu sağlamadığımız.
Bulut ABAP API’leri kullanıldı
HTTP istekleri gönderme
Daha önce de belirttiğim gibi, ABAP’ta dinlenme API’lerini tüketmek için az sayıda mevcut öğretici öncelikle beyazlaşmamış ABAP API’lerini kullanıyor. Örneğin, if_http_client Bulut ABAP’de kullanımına izin verilmeyen biri. SAP Cloud platformu için beyaz listeye alınmış ABAP API’lerini kontrol etmenin yolu, Yayınlanan Nesneler listeler. Eclipse ABAP Geliştirme Araçlarında (ADT) -> Project Gezgini -> Yayınlanan Nesneler. Yani, HTTP isteği göndermek için buluta hazır ABAP API’si if_web_http_client. Bir müşteri almak için aşağıdaki yöntemi tanımlarız:
Yöntemler: Create_client İçe Aktarma URL Türü String Döndürme Değeri (sonuç) IF_WEB_HTTP_CLIENT REF CX_STATIC_CHECK
Yöntem create_client. Veri (Dest) = cl_http_destination_provider => create_by_url (url). sonuç = cl_web_http_client_manager => create_by_http_destination (Dest). Son metod.
URL’nin bir giriş parametresi olduğuna dikkat edin. İade edilen sonuç, oluşturulan Web HTTP istemcisidir.
JSON ile çalışmak
JSON ile çalışmak için XCO’nun (Uzatma bileşenleri) kütüphane. Burada ve burada daha fazla bilgi edinin. Kullanım durumumuzla ilgili belirli sınıf xco_cp_json. Sağladığı son derece değerli bir şey, farklı adlandırma kurallarını dönüştürme yeteneğidir. Örneğin, Camelcase’den Under_score’a ve başka bir şekilde.
Gerisi API’sını tüketmek
Eğlenceye girmeden önce, sadece birkaç sabit tanımlamalıyız. Tabii ki, bu kesinlikle gerekli değildir, ancak String değişmezlerinin aksine sabitlerle çalışmak daha iyi bir uygulamadır ve yeniden kullanılabilirliğe izin verir.
Sabitler: Base_url Türü Dize Değeri 'https: // jsonplaceholder.tipik kod.com/yayınlar ', content_type türü dize değeri' Content-Type ', json_content type String değeri' uygulaması/json; Charset = UTF-8 '.
Temel URL, basitçe adresidir gönderiler kaynak. Veri göndereceğimiz vakalar için ihtiyacımız olan son iki sabit (i.e., Oluşturun ve Güncelleme) Geri kalan API’yi kullanarak sunucuya. Sunucuya JSON gönderdiğimizi bildirmeliyiz.
Tüm gönderileri okuyun
Tüm gönderileri okumak için URL sadece temel URL’dir. Bu nedenle, bunun için bir müşteri oluşturuyoruz, bir GET isteği yürütmek, istemciyi kapatmak ve alınan JSON’u bir yayın tablosuna dönüştürmek için istemciyi kullanıyoruz. Post Türü Tablosu, Kaynak Yayınlar Yukarıdaki bölüm. Sondaki tam koda başvurabilirsiniz.
Read_posts Döndüren Değer (sonuç) Post_tt Türü CX_STATIC_CHECK
Yöntem Read_posts. "Tüm Gönderilerin JSON'unu alın (URL) = |< base_url >|. Veri (istemci) = create_client (url). Veri (yanıt) = client-> execute (if_web_http_client => get)-> get_text (). istemci-> close (). "JSON'u XCO_CP_JSON => Veri-> from_string (yanıt)-> uygula (((xco_cp_json => dönüşüm-> camel_case_to_underscore)))))-> write_to (sonuç)). Son metod.
Tek gönderiyi okuyun
Tek bir gönderi okuma yöntemi benzerdir, giriş olarak aldığımız farklılıklar yayının kimliği ve bir yapı döndürür (i.e., tek bir yazı, bir masa yerine (i.e., yayınların bir listesi). Geri kalan API’Tek bir gönderi okuma URL’si aşağıdaki gibidir:
Read_single_post İçe Aktarma Kimliği Tür I Döndürme Değeri (sonuç) Post_s yükseltme CX_STATIC_CHECK
Yöntem Read_single_post. "Giriş Gönderme Kimliği Verileri (URL) için JSON'u alın = |< base_url >/< id >|. Veri (istemci) = create_client (url). Veri (yanıt) = client-> execute (if_web_http_client => get)-> get_text (). istemci-> close (). "JSON'u XCO_CP_JSON => Veri-> from_string (yanıt)-> uygula (((xco_cp_json => dönüşüm-> camel_case_to_underscore)))))-> write_to (sonuç)). Son metod.
Gönderi Oluştur
Daha önce açıklandığı gibi, yayınlar’ IDS, REST API tarafından otomatik olarak atanır. Yani, bir gönderi oluşturmak için kullanacağız Post_without_id_s tip. Bu bizim giriş parametremiz olacak. XCO kütüphanesini bir kez daha kullanarak bu ABAP yapısından JSON’a dönüştüreceğiz. Oradan bir müşteri yaratıyoruz. Ardından, yeni oluşturduğumuz JSON olarak göndereceğimiz HTTP isteğinin gövdesini belirledik ve sunucuya JSON İçerik Tipi göndereceğimizi bildiriyoruz. Son olarak, bir yazı isteği yürütüyoruz ve sunucuyu iade ediyoruz’S. Her şey yolunda giderse, sunucu’S yanıtı bize yeni oluşturulan kimliği ile birlikte gönderimizi iade eder (101, çünkü şu anda 100 gönderi vardır).
create_post ithalating post_without_id type post_without_id_s dönen değer (sonuç) tür dize yükseltme cx_static_check
Yöntem create_post. "Girdi gönderisini json verilerini (json_post) = xco_cp_json => data-> from_abap (post_without_id)-> uygulama ((xco_cp_json => dönüşüm-> altscore_to_camel_case)-> to_string (). "Post JSON'u sunucuya gönderin ve yanıt verilerini (url) döndürür = |< base_url >|. Veri (istemci) = create_client (url). Veri (Req) = istemci-> get_http_request (). req-> set_text (json_post). req-> set_header_field (i_name = content_type i_value = json_content). sonuç = client-> execute (if_web_http_client => post)-> get_text (). istemci-> close (). Son metod.
GÜNCELLEME POST
Bir isteği ile güncelleme yapacağız. Bu, tüm gönderiyi sağlayacağımız anlamına gelir. Öte yandan yama, yalnızca güncellenmiş alanı sağlamamıza izin verir (e.G., sadece başlık). Bunu ilginç bulursanız, yama talebini kendiniz yapmaya çalışabilirsiniz -’sağlanan kaynaklarla çok zor olmak!
Benzer bir mantığı takip ediyoruz yaratmak aksiyon. Ayrıca bir giriş parametresi olarak bir gönderi de sunuyoruz, ancak bu sefer tam yapıyı kullanıyoruz (posta kimliği ile). Bir yayını güncellemek için URL, bu (tek) gönderiye erişmekle aynıdır:
Yani, tek farklılık yaratmak Post giriş parametresinin, URL’nin ve HTTP istek yönteminin değiştirilen türünü ekleyin (PUT).
Update_post Post_s Post_s Döndürme Değeri (sonuç) Tür Dize Yükseltme CX_STATIC_CHECK
Yöntem Update_post. "Girdi gönderisini JSON verilerine dönüştürün (json_post) = xco_cp_json => data-> from_abap (post)-> uygulama ((xco_cp_json => dönüşüm-> underscore_to_camel_case)))-> to_string ()). "Post JSON'u sunucuya gönderin ve yanıt verilerini (url) döndürür = |< base_url >/< post-id >|. Veri (istemci) = create_client (url). Veri (Req) = istemci-> get_http_request (). req-> set_text (json_post). req-> set_header_field (i_name = content_type i_value = json_content). sonuç = client-> execute (if_web_http_client => put)-> get_text (). istemci-> close (). Son metod.
Gönderi Sil
Bir yayını silmek en basit istekdir. Sadece kimliği alıyoruz ve belirli gönderinin URL’sine bir Sil HTTP isteği gönderiyoruz. Bir şeyler ters giderse kullanıcıya izin vermek için sunucuyu kontrol ediyoruz’S Yanıt Kodu (200 olmalı – yani Tamam).
DELETE_POST İçe Aktarma Kimliği Türü CX_static_check yükseltme
Yöntem delete_post. Veri (URL) = |< base_url >/< id >|. Veri (istemci) = create_client (url). Veri (yanıt) = istemci-> yürütme (if_web_http_client => sil). Yanıt-> get_status () -code NE 200. İstisna Türünü Yükle CX_WEB_HTTP_CLIENT_ERROR. Endif. Son metod.
Kodumuzu test etmek
Şimdi tüm CRUD işlevlerini sağladığımıza göre,’S Onları kontrol et! Bunu yapmak için, if_oo_adt_classrun Bir sınıfı konsol uygulaması olarak çalıştırmaya izin veren arayüz. Yürütülen bir ana yönteme sahiptir – Java’ya benzer.
Yöntem if_oo_adt_classrun ~ ana. DENEMEK. "Veri Oku (All_posts) = Read_posts (). Veri (first_post) = read_single_post (1). "Veri Oluştur (create_response) = create_post (değer #(user_id = 7 başlık = 'Merhaba, dünya!'Body =' :) ')). "Güncelle First_post-User_id = 777. Data (update_response) = update_post (first_post). "Delete_post (9). "Sonuçları Yazdır-> Yaz (All_posts). Out-> Yaz (First_post). Out-> Yaz (create_response). Out-> Yaz (update_response). CX_ROOT'u verilere yakalayın (hariç). Out-> Yaz (exc-> get_text ()). Sonbahar. Son metod.
F9 ile çalışmak aşağıdaki çıktıyı yazdırır:
ABAP konsolundaki çıktının başlangıcı
ABAP konsolundaki çıktının sonu
Çözüm
Bu, Bulut ABAP’de dinlenme API’lerinin nasıl tüketileceğine dair öğreticiyi sona erdirir. Umarım senin için yararlı olmuştur. Orada hissediyorsan’Herhangi bir iyileştirme noktası veya benim için herhangi bir sorunuz veya geri bildiriminiz var, yorumlarda bana bildirin!
Tam kod
Sınıf ZSS_TESTER_2 Tanım Kamu Finali Kamu Oluştur. Kamuya açık bölüm. Arayüzler: if_oo_adt_classrun. Türler: Post_s, User_ID Type I, Id Tip I, Başlık Türü String, gövde tipi dizesi, Post_s sonu, Post_tt Tip Post_s tablosunun Boş tuşlu, Post_without_id_s, User_id Tip I, Başlık Türü String, Gövde Türü, Sonu Post_without_id_s Sonu. Yöntemler: Create_client URL Türü Dize Döndürme Değer (sonuç) Tür Ref'e IF_WEB_HTTP_CLIent yükseltme CX_STATIC_CHECK, Read_Posts Döndüren Değer (sonuç) Türü Post_tt Post_tt yükseltme CX_STICHECK, Readsingle_Post Importing Id Tür I Döndürme Değer (sonuç) Post_s Raising Icting (sonuç) Post_s Raising Cx_Station Icting (sonuç posta (sonuç) Post_s Raising Cx_Station I. Out_id_s Döndüren Değer (sonuç) Tür Dize CX_STATIC_CHECK, UPDURE_POST Post_s Döndürme Değeri İçe Aktarma (sonuç) Tür Dize Cx_static_check, Delete_Post İçe Aktarma Kimliği Türü CX_STATIC_CHECK. Özel bölüm. Sabitler: Base_url Türü Dize Değeri 'https: // jsonplaceholder.tipik kod.com/yayınlar ', content_type türü dize değeri' Content-Type ', json_content type String değeri' uygulaması/json; Charset = UTF-8 '. Son sınıf. Sınıf ZSS_TESTER_2 Uygulaması. Yöntem if_oo_adt_classrun ~ ana. DENEMEK. "Veri Oku (All_posts) = Read_posts (). Veri (first_post) = read_single_post (1). "Veri Oluştur (create_response) = create_post (değer #(user_id = 7 başlık = 'Merhaba, dünya!'Body =' :) ')). "Güncelle First_post-User_id = 777. Data (update_response) = update_post (first_post). "Delete_post (9). "Sonuçları Yazdır-> Yaz (All_posts). Out-> Yaz (First_post). Out-> Yaz (create_response). Out-> Yaz (update_response). CX_ROOT'u verilere yakalayın (hariç). Out-> Yaz (exc-> get_text ()). Sonbahar. Son metod. Yöntem create_client. Veri (Dest) = cl_http_destination_provider => create_by_url (url). sonuç = cl_web_http_client_manager => create_by_http_destination (Dest). Son metod. Yöntem Read_posts. "Tüm Gönderilerin JSON'unu alın (URL) = |< base_url >|. Veri (istemci) = create_client (url). Veri (yanıt) = client-> execute (if_web_http_client => get)-> get_text (). istemci-> close (). "JSON'u XCO_CP_JSON => Veri-> from_string (yanıt)-> uygula (((xco_cp_json => dönüşüm-> camel_case_to_underscore)))))-> write_to (sonuç)). Son metod. Yöntem Read_single_post. "Giriş Gönderme Kimliği Verileri (URL) için JSON'u alın = |< base_url >/< id >|. Veri (istemci) = create_client (url). Veri (yanıt) = client-> execute (if_web_http_client => get)-> get_text (). istemci-> close (). "JSON'u XCO_CP_JSON => Veri-> from_string (yanıt)-> uygula (((xco_cp_json => dönüşüm-> camel_case_to_underscore)))))-> write_to (sonuç)). Son metod. Yöntem create_post. "Girdi gönderisini json verilerini (json_post) = xco_cp_json => data-> from_abap (post_without_id)-> uygulama ((xco_cp_json => dönüşüm-> altscore_to_camel_case)-> to_string (). "Post JSON'u sunucuya gönderin ve yanıt verilerini (url) döndürür = |< base_url >|. Veri (istemci) = create_client (url). Veri (Req) = istemci-> get_http_request (). req-> set_text (json_post). req-> set_header_field (i_name = content_type i_value = json_content). sonuç = client-> execute (if_web_http_client => post)-> get_text (). istemci-> close (). Son metod. Yöntem Update_post. "Girdi gönderisini JSON verilerine dönüştürün (json_post) = xco_cp_json => data-> from_abap (post)-> uygulama ((xco_cp_json => dönüşüm-> underscore_to_camel_case)))-> to_string ()). "Post JSON'u sunucuya gönderin ve yanıt verilerini (url) döndürür = |< base_url >/< post-id >|. Veri (istemci) = create_client (url). Veri (Req) = istemci-> get_http_request (). req-> set_text (json_post). req-> set_header_field (i_name = content_type i_value = json_content). sonuç = client-> execute (if_web_http_client => put)-> get_text (). istemci-> close (). Son metod. Yöntem delete_post. Veri (URL) = |< base_url >/< id >|. Veri (istemci) = create_client (url). Veri (yanıt) = istemci-> yürütme (if_web_http_client => sil). Yanıt-> get_status () -code NE 200. İstisna Türünü Yükle CX_WEB_HTTP_CLIENT_ERROR. Endif. Son metod. Son sınıf.
REST API’sının Oluşturulması (Get & Post yöntemi çağrısı)
REST API, REST mimari stilinin kısıtlamalarına uygun olan ve RESTful hizmetleriyle etkileşime izin veren temsili durum transfer uygulama programlama arayüzüdür.
En yaygın yöntemler: Get, Post, Put ve Sil,
Bu yöntemler kullanılacak, bir kayıt almak için bir talep, bir tane oluşturmak için bir isteği, bir kaydı güncellemek için bir isteği ve birini silmek için bir isteği silme isteği
Senaryo -> Sürücü Kimliğine dayalı sürücü detayı sağlamanız gerekiyor.
Adım 1 ->
Sürücü Veri Taban Tablosu.
2. Adım ->
İstek işleyici sınıfı oluştur ‘Zcl_driver_req_handler’ ve standart sınıfla miras al ‘CL_RESTHTTP_HANDLER’
Not -> get_root_handler yöntemini uygulamak zorunludur, aksi takdirde sözdizimi hatası verir.
Adım 3 ->
İstek sağlayıcı sınıfı oluştur ‘Zcl_driver_req_provider’ ve standart sınıfla miras al ‘Cl_rest_resource’
Adım 4 -> Şimdi IF_REST_RESOURCE ~ Verileri okumak için yöntem al.
Veri çağrısını okuduktan sonra /UI2 /CL_JSON => ABAP yapısını JSON formatına dönüştürmek için Serialize () Yöntemi.
Adım 5 -> Get_root_handler İstek İşleyici Sınıfı yöntemini uygulayın.
Burada, isteği işleyici sınıfını bağlamamız ve sağlayıcı sınıfını yönlendiricinin yardımıyla istemek gerekir.
Adım 6 -> Servis öğesi oluştur, tcode sicf
Adım 7 -> Bağlantı İşleyici Listesi, burada istek işleyici sınıfımızı tanımlamamız gerekiyor ‘Zcl_driver_req_handler’.
Adım 8 -> Hizmeti Etkinleştir.
Adım 9 -> Test hizmeti.
Sonuç -> Burada sürücüyü geçiyoruz ve kimlik verilerine dayalı JSON formatında görüntüleniyor.
Post yöntemi çağrısı ->
Senaryo -> Veri tabanında yeni sürücü detayı oluşturmamız gerekiyor. Sürücü kimliğini görebileceğiniz gibi ‘002’ sadece sistemde var ve şimdi yeni kimlik ‘001’ oluşturulmalı.
Değişken lv_data’da veriler json dizesinde geliyor
JSON String’i ABAP yapısına dönüştürmek için /UI2 /CL_JSON => Deserialize () Yöntemi.
İşte kimliğe sahip yeni giriş ‘001’
Sonuç ->
Bu blogu okuduktan sonra Basit Rest API’sını oluşturabileceksiniz ve ayrıca istek sağlayıcı sınıfında parametreleri okuma fikriniz olacak.
Lütfen herhangi bir düzeltmeye ihtiyaç duyulduğunu önermekten çekinmeyin 🙂
ABAP’ta bir REST API’sını geliştirmek
Son iki blogda, REST API’lerinin web istemcilerini nasıl yazacağımı gösterdim – XML (burada demo uygulaması) veya JSON (burada demo uygulaması) veri aktarım formatı olarak. Bu blogda, sunucu tarafına odaklanacağım: ABAP İstek Handler olarak bir REST API’sının nasıl uygulanacağı. Migros BSP web sitesinde tartıştığım tüm kodu inceleyebilirsiniz:’S Sınıfında ZCL_JOB_DATA .
ICF ağacı
İstek işleyicileri, tek bir yöntem Handle_Request’ten oluşan IF_http_extension arabirimini uygulayan sınıflardır. SICF işlemindeki bir yola bir istek işleyici sınıfı eklenebilir. Gelen bir HTTP isteği, SICF yoluna karşı istek yolunu eşleştirmeye çalışan İnternet İletişim Çerçevesi ile analiz edilecektir. Ekli bir istek işleyicisi olan bir düğüm bulunur bulunmaz eşleşme işlemi durdurulur. Bu durumda, işleyici sınıfının bir örneği oluşturulacak ve Handle_Request yöntemi olarak adlandırılacaktır.
Örnek hizmetimiz yola eklenmiştir /iş/öznitelikler. ZCL_JOB_DATA sınıfının, istek yolunun başladığı tüm gelen taleplerden sorumlu olduğu bildirildi /iş/öznitelikler :
İlk Strateji: HTTP istek yöntemi
Arayüz yönteminin uygulanması if_http_extension ~ hile_request () en üst düzey işlem seviyesini oluşturur. Bu nedenle, uygulama yalnızca kaba işleme iskeletini verir: veritabanı işlemleri için bir örnek ve dinlenme işleminin işlenmesi için bir örnek oluşturulur, istek işleme bu örneğe devredilir ve talebin işlenmesi için hiçbir örneğin belirlenememesi durumunda bir yakalama bloğu vardır. Böyle bir durum, durum kodu ile bir HTTP yanıtı ile sonuçlanmalıdır ‘400 – Kötü Talep’.
Bu yerde, strateji tasarım modelini kullanıyoruz: HTTP yöntemine (Get, Put, Post, Sil, Seçenekler) bağlı olarak, belirli bir örnek oluşturuldu. Olası her örnek belirli bir stratejiye karşılık gelir.
yöntem if_http_extension ~ hone_request . Veri: lo_db türü Ref - LIF_DB, Lo_Rest Type Ref - LIF_REST, LO_INVALID_METHOD Tür Ref Ref - ZCX_ERROR, LV_REASON TİPİ STRING. denemek. * Veritabanı İşlemleri Nesnesi LO_DB ?= get_db (io_server = sunucu). * Fiil (Get, Put, Post, Seçenekler, Sil) LO_REST'e bağlı olarak doğru dinleyici örneğini alın ?= get_rest (io_server = sunucu io_db = lo_db). * Lo_rest-> handle_request () işlemini yapın. lo_invalid_method içine zcx_not_found catch. lv_reason = lo_invalid_method-> get_text (). Sunucu-> yanıt-> set_status (kod = 400 "Kötü istek nedeni = lv_reason). sonbahar. son metod.
Örnek belirleme için bir adlandırma sözleşmesi kullanıyoruz: LCL_REST_GET sınıfı, HTTP fiil GET, LCL_REST_PUT ile PUT ile ilişkilendirilecektir. Tüm bu sınıflar LIF_REST arayüzünü uygular. Bu şekilde dinamik örnek oluşturma kullanabiliriz. Alternatif olarak, büyük bir vaka yazabilirdik… birçok kişi ile’S. Davanın avantajı, Nesne Oluştur İfade, sözdizimsel doğruluk açısından statik olarak kontrol edilebilir. Dinamik varyantı seçtim, çünkü şubeden bir sürüden daha net ve daha okunabilir bulduğum için.
HTTP istek yönteminin (Get, Put, Post,…) adıyla sahte başlık alanı olarak mevcut olduğunu gözlemleyin ‘~ request_method’:
yöntem get_rest. Veri: lv_classname türü seoclsname, lv_method türü dize, lv_message türü text255. lv_method = io_server-> request-> get_header_field ('~ request_method'). lv_method 'lcl_rest_' lv_classname. denemek. Nesne Oluştur EO_REST TÜRÜ (LV_ClassName) IO_REQUEST = iO_Server-> İstek IO_RESPONSE = io_server-> Yanıt IO_DB = io_db. cx_sy_create_object_error yakala. lv_message = 'yöntem' '&' 'Desteklenmiyor' (001). LV_MESSAGE içinde LV_Method ile Değiştirin '&'. _raise_with_text zcx_not_found lv_message. sonbahar. son metod.
İkinci Strateji: Veri Aktarım Biçimi
Şimdi farklı HTTP istek yöntemleri için farklı işleyici sınıflarımız var. Ancak tüm bu işleyiciler için bazı yaygın görevler var. Bu yaygın görevlerden biri: geçerli veri aktarım biçimini belirlemek ve girişi – varsa – ABAP verilerine dönüştürmek için ve bunun tersi de geçerli: ABAP sonuç verilerini istenen veri aktarım formatı (XML veya JSON) ile çıktıya dönüştürmek için.
Şimdi, Get gibi bazı istek yöntemleri herhangi bir istek içeriği gerektirmez. Dolayısıyla, gelen verilerin dönüştürülmesi, içerik verilerine ihtiyaç duyduklarını bilen yöntem işleyicileri tarafından gerçekleştirilir. Öte yandan, her zaman aşağıdaki veri türünün bir sonucu olacaktır:
Türler: Ty_result'un başlangıcı, msgtype tipi Symsgty, Mesaj Tipi uzunluk 255, iş türü zjobs_tab, ty_result'un sonu.
İş masasında her zaman giriş olmayabilir. Ancak bu yapının her bileşeni başlangıçta olmayacak. İş masası yoksa, genellikle bir mesaj olacaktır. Böylece sonucun dönüşümü her zaman gerçekleştirilebilir.
Soyut bir dönüştürücü sınıfı, içerik türü başına dönüşüm algoritmalarını içeren belirli alt sınıflarla çalışmak mantıklıdır. Bu, strateji modelinin ikinci uygulamasıdır.
Sınıf LCL_Converter Tanımı Özet. kamuya açık bölüm. Class-metods get_instance ithalating iv_accept type dize döndürme değeri (eo_instance) type ref lcl_converter. Yöntemler Content_type Özet dönen Değer (EV_CONTENT_TYPE) Tür Dize. Yöntemler get_entered_data soyut içe aktarma iv_cdata türü Dize dışa aktarma ES_JOB Türü Zjobs yükseltme zcx_parse_error. Yöntemler Sonuç_to_cdata Soyut İçe Aktarma IS_RESULT TÜR TY_RESULT Dışa Aktarma EV_CDATA TÜR STRING. son sınıf. "LCL_Converter Tanımı
LCL_Converter => get_instance () statik yöntemi, Kabul etmek HTTP isteğinin başlık alanı:
Sınıf LCL_Converter uygulaması. yöntem get_instance. IV_ACECTE CS 'Uygulaması/JSON'. Nesne Oluştur EO_INSTANCE TÜRÜ LCL_JSON_CONVERTER. başka. Nesne Oluştur EO_INSTANCE TÜRÜ LCL_XML_CONVERTER. endif. son metod. "get_instance endclass. "LCL_Converter uygulaması
Tüm istekler için ortak arsa
Arayüzü uygulayarak tüm belirli yöntem işleyicilerinin üst sınıfı LCL_REST’e ortak görevleri çıkarabiliriz lif_rest ~ handle_request () Tüm alt sınıflar için bir kez.
Superclasse’daki ortak kodun, alt sınıfta uygulanan ve bu alt sınıfın belirli davranışlarını tanımlayan belirli kodlarla karıştırılması gerekir. Bunu başarmak için istenen zaman noktasını ararız lif_rest ~ handle_request (), soyut bir yöntem Yapmak( ), alt sınıflarda yeniden tanımlanması gereken. Bu DO () yöntemi belirli eylemi içerecektir.
Şimdi, üst sınıftaki ortak uygulama LIF_REST ~ HAND () yalnızca işleme akışını tanımlar, somut eylemleri alt sınıflara veya delegelere bırakır go_converter:
- Arayarak belirli eylemi yürütün Yapmak(),
- HTTP Hata Kodu 400 ile Hata İşleme “Geçersiz istek” Dönüşüm hatası (yanlış gelen veriler) veya bir uygulama hatası durumunda bir hata mesajı için yanıt verilerinin ayarlanması durumunda,
- Sonuç yapısı, ilgili dönüştürücü örneği kullanılarak yanıt veri yapısına (XML veya JSON) eşlenir,
- Son olarak, yanıt verileri HTTP yanıtının gövdesine yerleştirilir ve ayrıca uygun yanıt türü ayarlanır: Uygulama/JSON veya Metin/XML.
Bu genel taslaktır – için geçerli olan yanıt işleme Tümü HTTP istek yöntemleri ve Tümü İçerik Türleri (XML ve JSON). Ayrıntılar aranan yöntemlerde yer almaktadır.
yöntem lif_rest ~ handle_request. Veri: Lo_ex Tür Ref - CX_ROOT, LV_CDATA TÜR STRING, LS_RESULT TYPE TY_RESULT. denemek. * Belirli işlemi yürütme DO (ES_RESULT = LS_RESULT İçe Aktarma). ZCX_PARSE_ERROR'u lo_ex'e yakalayın. go_response-> set_status (kod = 400 "kötü istek nedeni = lo_ex-> get_text ()). set_response_parameters (). geri dönmek. ZCX_ERROR'u lo_ex'e yakalayın. LS_RESULT-MESSAGE = lo_ex-> get_text (). ls_result-msgtype = 'e'. sonbahar. * Sonuç yapısını sırasıyla JSON veya XML'ye dönüştürün, go_converter-> sonuç_to_cdata dışa aktarma IS_RESULT = ls_result içe aktarma EV_CDATA = lv_cdata. * Sonucu yanıt gövde çağrı yöntemi set_respons dışa aktarma iv_content_type = go_converter-> content_type () iv_cdata = lv_cdata. son metod. "Handle_request
Belirli bir görev – Put İsteği
İzin vermek’İllüstrasyon için belirli bir göreve bakın: Put İsteği – bu her zaman veritabanında belirli bir kimlik için iş özniteliklerini güncellemek veya eklemek için bir görevdir. Tasarımdan aşağıdaki gibi, kendi yerel sınıfı var LCL_REST_PUT İşleme Put Talepleri. Aslında, bu istek işleyicisi için sadece Yapmak Yöntemin kendisi (belirli bir görev sınıfının uygulanması için mutlak minimum olan: Yapmak() ana sınıfta soyut. Bir uygulama olmadan, hiçbir örnek oluşturulamaz.):
LCL_REST'den devralınan LCL_REST_PUT tanımı. korumalı bölüm. Yöntemler yeniden tanımlıyor. son sınıf. "lcl_rest_put tanımı
Uygulama şu şekildedir:
- Belirtilen kimliğe sahip iş veritabanından okunur (eğer Bir kimlik belirtildi – yeni işler için durum böyle değil),
- Girilen veriler, uygun olanı kullanarak bir LS_JOB yapısına ayrılacaktır go_converter misal,
- Ve son olarak, kaydetmek() Yöntem çağrılır. Üst sınıfta uygulanır, çünkü diğer istek yöntemleri de kullanır.
Sınıf LCL_REST_PUT Uygulaması. yöntem yap. Veri: LS_JOB TİP ZJOBS, LV_ID TİP ZJOBS-ID. denemek. Get_job_by_id (ES_JOB = LS_JOB içe aktarma). lv_id = ls_job-id. yakala zcx_not_found. sonbahar. temiz ls_job. Çağrı yöntemi go_converter-> get_entered_data dışa aktarma iv_cdata = go_request-> get_cdata () ithalating es_job = ls_job. LS_JOB başlangıç değilse. LV_ID başlangıç değilse. LS_JOB-ID = LV_ID. endif. Kaydet (değiştirme cs_job = ls_job). ES_RESULT-MESSAGE = 'Job & Tasarlandı' (002). '&' ES_RESULT-Message ile LS_JOB-ID ile değiştirin. ES_RESULT-MSGTYPE = 'S'. "Başarı Mesajı ES_RESULT-JOBS tablosuna LS_JOB ekleyin. endif. son metod. "Endclass yap. "LCL_REST_PUT Uygulaması
Bu görevin uygulanmasının’t HTTP veri yapısını, aslında kullanılan biçimini veya aktarım veri formatının ayrıntılarını önemseyin. Sadece ABAP veri yapılarıyla çalışır LS_JOB Giriş için ve ES_RESULT Çıktı için.
Oturum, kimlik ve kilitleme
Test uygulamalarında (ne JSON uygulamasında ne de XML uygulamasında), verilerin ne girişi ne de enqueue yok. Uygulamalar herkes için açık olduğundan, bu sadece ben’T Gerçekten Bir veritabanı tablosunda çalıştırın ZJOBS. Aslında, uygulamayı arayan her müşteri kendi oturum verileriyle çalışıyor, bu yüzden’t Diğer kullanıcılarla çatışma’ operasyonlar ve kendisi diğer kullanıcılar tarafından rahatsız edilmiyor. Oturum verileri onun için sunucu tarafı çerezleri olarak korunur, tek diyalog adımında hayatta kalır (örneğin sayfanın yeniden yüklenmesi verilerin geçerli durumunu yeniden üretir).
Bir web-client BSP olarak yazıldığında, öznitelikte bir oturum kimliği mevcuttur çalışma zamanı-> server_id. Bu oturum kimliği, isteği yapan belirli tarayıcı örneğini tanımlar. İstemci tarafında, bu Oturum Kimliği her zaman adlı bir çerezde yer alır SAP-AppContext. Bir oturum kimliği ile korunması gereken bir uygulamaya sahipse, kimliğin SAP-AppContext çerezinden çıkarılması gerekir ve tüm Ajax istekleri ile bir sorgu parametresi olarak geçirilmelidir. İşte SAP-AppContext’i çerezden çıkaran işlev:
function get_appcontext () < var lAppcontextCookie = document.cookie.match(/sap-appcontext=(.*?)(?:;|$)/); return lAppcontextCookie && ( lAppcontextCookie.length >= 2) && unescape (lappcontextcookie [1]) || ""; >
Bu işlevden döndürülen AppContext, her Ajax isteğiyle sorgu parametresi olarak aktarılabilir. Sunucu tarafında, oturum kimliği bu parametreden çıkarılabilir:
yöntem get_session_id. Veri: LV_APP_CONTEXT Tür String, LV_APP_CONTEXT64 Tür Dize. * Ajax isteği LV_APP_CONTEXT64 = io_server-> request-> get_form_field ('SAP_APPCONTEXT') tarafından sağlanan form alanını okuyun). LV_APP_CONTEXT64 başlangıç değilse. * Base64 kod çözme lv_app_context = cl_http_utility => decode_base64 (lv_app_context64). * Oturum Kimliği alıntısını alın Regex 'SAP-SessionId = ([^;]+) (?:; | $) 'lv_app_context incatches eV_session_id. endif. EV_SESSESS_ID başlangıç ise. ev_session_id = io_server-> seans_id. endif. son metod.
Bir geri dönüş olarak, satır 22’de, sunucu-> seans_id kullanılır. Ancak, her bir istek için her bir diyalog adımında yeni oturum verileri ile sonuçlanan yeni bir sunucu-> Oturum_id olacak. Oturum yönetimine gerçekten ihtiyacınız varsa, oturum kimliğinin sunucuya aktarılması önemlidir.
Oturum kimliğini oturum açma prosedürüyle birleştirmek iyi bir fikirdir: kullanıcı kimliği doğrulanırsa, tarayıcısı sınırlı bir geçerlilikle bir oturum kimliği alır. Bu oturum kimliği her ardışık dinlenme operasyonuyla geçirilmelidir. ABAP’ta, veritabanı tablosunda oturuma özgü verileri SSCOokie’de saklamak ve almak için kullanılabilir.
Bir oturum kimliğinin girişle bu birleştirilmesi – kabaca – HP Kalite Merkezi için geri kalan API’nın nasıl çalıştığı.
ABAP kullanma’S Dahili JSON Dönüştürücü
XML Dönüştürücü örneğini uygulamak oldukça basit olsa da -XML -> ABAP için bir XSLT dönüşümü çağırmak ve geri dönüş yolunda bir tane daha -JSON dönüşümünün tam olarak aynı şekilde ele alınması bir sürpriz olabilir: dönüşümlerle. Bu mümkün çünkü Çağrı Dönüşümü İfade JSON formatını destekler (en azından SAP_BASIS 702’ye göre). JSON otomatik olarak tespit edilir ve bir ara JSON-XML formatında ayrıştırılır. Bu, keyfi bir XSLT dönüşümü ile işlenebilir ve diğer XML belgelerine dönüştürülebilir veya verileri ABAP.
Örneğin, test uygulamamızdan verilen bir talep, aşağıdaki JSON verilerini sunucuya gönderebilir:
Bu içeriğe sahip bir dize şu şekilde geçilirse “Kaynak XML” Abap için’Çağrı Dönüşüm İfadesi, JSON bunun gibi bir XML temsiline ayrılacak (format anlaşılması kolaydır – bence burada bir açıklama gerekli değildir):
Çağrı dönüşümü deyimi ile keyfi bir XSLT dönüşümünü işlerken ve bir JSON dizesini kaynak olarak geçirirken, XSLT bu dahili JSON-XML gösteriminde çalışacaktır. Böyle bir JSON-XML belgesini ABAP verilerine dönüştürmek kolaydır-daha kesin olmak gerekirse: ABAP verilerinin ASXML temsiline dönüştürmek için. Örneğin, aşağıdaki XSLT dönüşümünü düşünün:
JSON String’e uygulandığında, aşağıdaki sonucu üretecektir:
0001 Rsnast00 Uxpd_kube_kv 2 X Rainer Zufall Tüm Satış Siparişi Onaylarını Çıkarın
Bu geçerli bir ABAP veri açıklamasıdır. Dönüşüm ZJSON2JOB olarak adlandırılırsa, veriler, JSON Dönüştürücünün aşağıdaki uygulamasında ES_JOB yapısı gibi – Bileşenler Kimliği, Repid vb. İle bir ABAP veri yapısına aktarılabilir.
Sınıf LCL_JSON_CONverter uygulaması. yöntem get_entered_data. Veri: Lo_ex Tür Ref - CX_TRANSFORMATION_ERROR. Temiz ES_JOB. IV_CDATA CN Alanını Kontrol Edin. denemek. Çağrı Dönüşümü Zjson2Job Kaynak XML IV_CDATA Sonuç Job = ES_JOB. CX_Transformation_error'u Lo_EX. race_parse_error (lo_ex). sonbahar. son metod. "get_entered_data
Kendi XSLT dönüşümünü tanımlamaya gerek kalmadan kimlik dönüşüm kimliği ile birçok şey yapılabilir. Web uygulamasında kullanılacak JSON veri yapısını empoze edebiliyorsanız, böyle bir “kanonik” yapı. Örneğin, JSON karmasını iş nitelikleriyle başka bir karma içine sarmayı düşünün, bu da onu gibi bazı sembolik anahtar adların değeri haline getirin “İŞ”:
Daha sonra veriler, özel bir XSLT dönüşümü geliştirmeye gerek kalmadan bir yapıya ayrılabilir, kimliği kullanarak basittir:
Çağrı Dönüşüm Kimliği Kaynağı XML IV_CDATA Sonuç Job = ES_JOB.
Bu örnekte, web-client ve sunucu tarafı işlemeyi yazdığım için, bunu daha fazla seçebilirdim “kanonik” biçim. Ama seçmeden, daha esnek JSON veri formatlarıyla nasıl çalışılacağını öğrendim.
İle çalışmanın birkaç nedeni var “kanonik olmayan” ABAP verilerinin JSON temsilleri:
- Web uygulaması lehine bir JSON biçimi tasarlanabilir – veriler üzerinde çalışan istemci JavaScript kodunun okunabilirliğini optimize etmek için.
- Belirli bir JSON formatları gerektiren istemci bileşenleri olabilir. Örneğin, JQuery DataTable, tablo verilerinin bir dizi dizisi olarak geçirilmesini gerektirir: http: // www.DatAtables.Net/Sürüm-Datatables/Örnekler/Data_Sources/Ajax.HTML
- JSON tabanlı üçüncü taraf hizmetleri ABAP tarafından (HTTP istemci nesnesi ile) çağrılabilir
- ABAP verileri olabilir öngörülen temel verilere, mesaj boyutunu gerçekten gerekli olan verilere indirgeme.
Sadece göstermek için, izin ver’S Diğer dönüşüme bir göz atın – sunucudan istemciye çıkış yolu. Yine, format biraz farklıdır “kanonik” ABAP tarafı işlemini önemli ölçüde basitleştirecek JSON formatı. Belirtildiği gibi, sonuç veri yapısı içeriyor
- bir mesaj,
- Bir Mesaj Türü,
- ve bir iş özellikleri tablosu:
Türler: Ty_result'un başlangıcı, msgtype tipi Symsgty, Mesaj Tipi uzunluk 255, iş türü zjobs_tab, ty_result'un sonu.
Aşağıdaki format, bu yapı için mükemmel bir JSON kolye olacaktır. Basitçe kimlik dönüşümü ile üretilebilir, “Kaynak Sonuç = LS_RESULT” (Neresi LS_RESULT tipin bir yapısıdır ty_result):
- Tüm bileşen adları JSON Hash Anahtar Adları ile mükemmel bir şekilde eşleşiyor,
- Dahili bir tablo, her biri tablonun bir girişini temsil eden bir karma bir json dizisi olarak eşlenir,
- Ve sembolik bir isme sahip üst düzey bir karma var “SONUÇ” Tam bir şey için:
Ancak geri kalan API’nin desteklediği JSON biçimi aslında bazı ayrıntılarda farklılık gösterir:
- İşler bir dizi olarak değil, bir karma olarak, Hash Anahtar olarak kimlik olarak tasarlanmıştır.
- Her şeyi bir anahtarın değeri olarak saran gereksiz karma yok.
- Msgtype bileşeni farklı. Basitçe Tür denir.
İşte bir örnek:
< "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" >>, "Mesaj": "", "type": "">
Yukarıdaki gibi benzer şekilde, sadece diğer yönde ilerliyoruz: ABAP veri türüne dayanarak ty_result, Bu JSON Veri Dizesine karşılık gelen dahili JSON-XML formatını elde etmek için bir XSLT dönüşümü yazıyoruz.
İstenen JSON veri dizesinin JSON-XML veri biçimi şuna benziyor:
Dolayısıyla, dönüşüm sonucu elde edilmesi gereken hedef budur. Öte yandan, TY_RESULT yapısının ASXML biçimi şuna benziyor:
0001 Rsnast00 Uxpd_kube_kv 2 X Rainer Zufall Tüm Satış Siparişi Onaylarını Çıkarın 0002 RBDApp01 Uxpd_edi_gut02 3 X Herbert Hurtig Kredi notları Ölçek BEN
Ve bu, dönüşümü gerçekleştirecek XSLT programıdır:
Temel olarak, her bir sapma için bunu görüyoruz “kanonik” JSON ABAP verilerinin temsili, XSLT dönüşümünde bu sapmayı işleyen bir şablon var. Örneğin, hedefteki msgtype yerine farklı isim türü şablonla işlenir
Kimlik yeniden düzenlenmelidir: ZJOBS veri yapısının basit bir özelliği olmaktan, bir karma anahtarı olmak için bir seviye daha yüksek yükseltilmelidir. Kimlik hariç diğer tüm özellikler, dize düğümleri olarak kopyalanır. Bunun için bu iki şablon gereklidir:
Ty_result veri nesnesini beklenen formatın bir JSON dizesiyle eşleme, artık ABAP’ta aşağıdaki kodla gerçekleştirildi:
Yöntem Sonuç_to_cdata. Veri: Lo_writer Tür Ref - CL_SXML_STRING_WRITER. lo_writer = cl_sxml_string_writer => create (type = if_sxml => co_xt_json). Dönüşüm Zjobs2json Kaynak Veri = IS_RESULT Sonuç XML LO_WRITER. EV_CDATA = CL_ABAP_CODEPAGE => Convert_from (lo_writer-> get_output ())). son metod. "sonuç_to_cdata
O’S All: EV_CDATA, HTTP yanıt gövdesine yerleştirilecek JSON veri dizesini içerecektir.
Özet
ABAP’ta dinlenme API’lerinin uygulanmasıyla ilgili bazı tipik konuları özetledim. Gibi kalıplar uygulayarak ayrı endişeleri ayrı (yerel veya küresel) sınıflarda tutmak mümkündür strateji. Demo Rest API’mde hizmet veren ZCL_JOB_DATA sınıfı bu şekilde düzenlendi (temel fikirler bu blogda tartışıldı):
SAP ABAP ile REST API nasıl oluşturulur ve MVC1 yönlendirme uygulanır
Bu blog yazısında, REST API’sının nasıl oluşturulacağını ve farklı isteği işlemek için MVC1 yönlendirmesinin nasıl uygulanacağını göstermek istiyorum.
Bunun için önce dinlenme yapısı için işleyici ve denetleyici sınıfı oluşturacağız. O zaman iş mantığını işlemek için MVC1 denetleyici sınıfı ve model sınıfı ekleyeceğiz.
Ve son olarak dinlenme isteklerini yerine getirecek bir hizmet oluşturacağız.
Gönderinin sonunda, aynı dinlenme API’sı için web tarayıcısı, postacı ve ABAP tüketen örnekler var.
SAP REST hakkında daha fazla bilgi edinmek için REST eğitimine bir göz atın.
Aşağıdaki yapıları oluşturun;
- Zrest_s_resp_state
- Zrest_s_response
- Zrest_s_request
- Zrest_s_resp_state
- Zrest_s_response
Şimdi yapacağız Sınıflar Oluştur.
Bir arama için Stack’i arayın
- Zrest_cl_defs
- Zrest_cl_model
- Zrest_cl_req_controller
- Zrest_cl_req_http_handler
- Zrest_cl_http_handler
Sınıf ZREST_CL_DEFS Tanımı Genel Kamu Oluştur . Kamuya açık bölüm. Sabitler c_state_success tür char1 değeri '## no_text. Sabitler c_state_warning type char1 değeri 'w' ## no_text. Sabitler c_state_error tipi char1 değeri 'e' ## no_text. Korumalı bölüm. Özel bölüm. Son sınıf. Sınıf ZREST_CL_DEFS Uygulaması. Son sınıf.
Sınıf zrest_cl_model tanımı kamu finali kamu yarat . Kamuya açık bölüm. Yöntemler Get_Datetime Dışa Aktarma !Respons_body Type zrest_s_response body !Durum Türü Zrest_s_response-State . Korumalı bölüm. Özel bölüm. Son sınıf. Sınıf Zrest_cl_model uygulaması. * ---------------------------------------------------------------------------------------+ * | Örnek genel yöntemi zrest_cl_model-> get_datetime * + ------------------------------------------------------------------------------------- + * | [Yöntem get_datetime. Veri: Exref Type Ref - CX_ROOT. DENEMEK . Türler: Ty_res'in Başlangıcı, Datetime Type Tzntimestp, Ty_res'in Sonu. Veri: res type ty_res. res-datetime = sy-datum && sy-uzeit. Respons_body = /ui2 /cl_json => Serialize (verileri dışa aktarma = res). State-State = ZREST_CL_DEFS => C_STATE_SUCCESS. CX_ROOT'u Exref'e yakalayın. State-State = ZREST_CL_DEFS => C_STATE_ERROR. State-State_text = exref-> get_text (). Sonbahar. Son metod. Son sınıf.
Sınıf zrest_cl_req_controller tanımı genel final halka açık . Kamuya açık bölüm. Yöntemler Process_request İçe Aktarma !Req_json Tür Dize Dışa Aktarma !Respons_json Tür String !Respons_stc Type Zrest_s_response . Korumalı bölüm. Özel bölüm. Sabitler: c_req_get_datetime türü zrest_e_req_id değeri '1001'. Yöntemler conv_stc_to_json Reply_stc type ithaling zrest_s_resse returning değeri (sonuç) türü tür dize. Son sınıf. Sınıf ZREST_CL_REQ_CONTERLER Uygulaması. * ---------------------------------------------------------------------------------------+ * | Örnek Özel Yöntem ZREST_CL_REQ_CONTROLLER-> CONV_STC_TO_JSON * + --------------------------------------------------------------------------------------------- + * | [--->] Response_stc Type zrest_s_response * | [Yöntem Conv_stc_to_json. Veri: Exref Type Ref - CX_ROOT. DENEMEK . sonuç = /ui2 /cl_json => Serialize (verileri dışa aktarma = Respons_stc). CX_ROOT'u yakalayın. sonuç = exref-> get_text (). Sonbahar. Son metod. * ---------------------------------------------------------------------------------------+ * | Örnek Genel Yöntemi ZREST_CL_REQ_CONTROLLER-> Process_request * + ----------------------------------------------------------------------------------------- + * | [--->] Req_json Tür String * | [Yöntem Process_request. Veri: Exref Type Ref - CX_ROOT. DENEMEK . Veri REQ_STC TYPE ZREST_S_REQUEST. /UI2/CL_JSON => Deserialize (JSON = REQ_JSON Dışa Aktarma Verilerini Değiştirme = Req_stc). REQ_STC-ID başlangıç değilse. Veri (model) = yeni zrest_cl_model (). REQ_STC-ID EQ C C_REQ_GET_DATETIME. Model-> get_datetime (Rep Respons_body = Response_stc-body durumu = Respons_stc-state). BAŞKA. Respons_stc-state-state = zrest_cl_defs => c_state_warning. Mesaj S001 (ZREST_MSG) Respons_stc-State-State_Text. Endif. BAŞKA. "Örnek olarak kukla içeriği doldurun req_stc-id = 999999. req_stc body = 'bazı json içeriği'. Respons_stc-body = /ui2 /cl_json => Serialize (verileri dışa aktarma = req_stc). Respons_stc-state-state = zrest_cl_defs => c_state_warning. Mesaj S002 (ZREST_MSG) Respons_stc-State-State_Text. Endif. Response_json = conv_stc_to_json (Respons_stc = reply_stc). CX_ROOT'u yakalayın. Respons_stc-state-state = zrest_cl_defs => c_state_error. Respons_stc-state-state_text = exref-> get_text (). Response_json = conv_stc_to_json (Respons_stc = reply_stc). Sonbahar. Son metod. Son sınıf.
Sınıf ZREST_CL_REQ_HTTP_HANDLER TANIM KAMU CL_REST_RESOURCE finalinden devralınan halka açık . Kamuya açık bölüm. Yöntemler if_rest_resource ~ yeniden tanımlama . Yöntemler if_rest_resource ~ REDEFINITION POST . Korumalı bölüm. Özel bölüm. Son sınıf. Sınıf ZREST_CL_REQ_HTTP_HANDLER uygulaması. * ---------------------------------------------------------------------------------------+ * | Örnek Genel Yöntemi ZREST_CL_REQ_HTTP_HANDLER-> IF_REST_RESOURCE ~ GET * + -------------------------------------------------------------------------------------------------------------- +-------------------------------------------------------------------------------------- Yöntem if_rest_resource ~ al. Veri (req_json) = mo_request-> get_uri_query_parameter (iv_name = 'req' iv_encoded = abap_false). Veri (denetleyici) = yeni ZREST_CL_REQ_CONTLOLLER (). Controller-> Process_request (REQ_JSON = REQ_JSON Dışa Aktarma Respons_json = Data (Respons_json)). mo_response-> create_entity ()-> set_string_data (IV_DATA = Respons_json). Son metod. * ---------------------------------------------------------------------------------------+ * | Örnek genel yöntemi zrest_cl_req_http_handler-> if_rest_resource ~ Post * + ---------------------------------------------------------------------------------------------------------- [--->] IF_REST_ENTITY * +-------------------------------------------------------------------------------------- Yöntem IF_REST_RESOURCE ~ Gönderi. Veri (req_json) = mo_request-> get_entity ()-> get_string_data (). Veri (denetleyici) = yeni ZREST_CL_REQ_CONTLOLLER (). Controller-> Process_request (REQ_JSON = REQ_JSON Dışa Aktarma Respons_json = Data (Respons_json)). mo_response-> create_entity ()-> set_string_data (IV_DATA = Respons_json). Son metod. Son sınıf.
CSRF aşağıdaki işleyicide devre dışı bırakılmıştır. GUI hizmet parametrelerinden devre dışı bırakmak işe yaramıyor. Dinlenme için devre dışı bırakmak için hone_csrf_token uygulamanız gerekir.
Sınıf ZREST_CL_HTTP_HANDLER CLOBLE CL_REST_HTTP_HANDLER'den miras alıyor Kamu Oluştur . kamuya açık bölüm. "Yönlendirme sağlar. Yönlendirme yolları bu yöntem yönteminde denetleyicilere atanır IF_REST_APPLICATION ~ get_root_handler yeniden tanımlama . korumalı bölüm. "Devre dışı bırakmak istiyorsanız, bu yöntemi yeniden tanımlayın. Tıpkı boş bir yöntem gibi. Yöntemler Handle_csrf_token yeniden tanımlama . Özel bölüm. Son sınıf. Sınıf ZREST_CL_HTTP_HANDLER uygulaması. * ---------------------------------------------------------------------------------------+ * | Örnek Korumalı Yöntem ZREST_CL_HTTP_HANDLER-> HENT_CSRF_TOKEN * + --------------------------------------------------------------------------------------------- + * | [--->] IO_CSRF_HANDLER TÜR REF IF_REST_CSRF_HANDLER * | [--->] IO_REQUEST TÜRÜ REF IF_REST_REQUEST * | [--->] IF_REST_RESPONSE * +-------------------------------------------------------------------------------------- Yöntem Hande_csrf_token. * Çağrı Yöntemi Süper-> Handle_csrf_token * Dışa Aktarma * io_csrf_handler = * io_request = * io_response = * . son metod. * ---------------------------------------------------------------------------------------+ * | Örnek genel yöntemi ZREST_CL_HTTP_HANDLER-> if_rest_application ~ get_root_handler * + ------------------------------------------------------------------------------------------------- + * | [Yöntem if_rest_application ~ get_root_handler. "Yönlendirme sağlar. "Servis Yolu/SAP/BC/REST" Örnek URL http: // vhcalnplci: 8000/SAP/BC/REST/ZREST/REST?SAP-Client = 001 & Req = Data (root_handler) = yeni CL_REST_ROUTER (). root_handler-> ek (IV_TEMPLATE = '/REST' dışa aktarma kaynakları için birleşik ad iv_handler_class = 'zrest_cl_req_http_handler' "nesne türü adı). * "Daha fazla istek işleyici sınıfları ekleyebilirsiniz *" Servis Yolu/SAP/BC/REST * "Örnek URL http: // vhcalnplci: 8000/sap/bc/rest/zrest/rest2?Sap-client = 001 & req = * root_handler-> att ( * dışa aktarma * IV_TEMPLATE = '/rest2' "Kaynaklar için Birleşik Ad * IV_HANDLER_Class = 'ZREST_CL_REQ_HTTP_HANDLER2'" Nesne Türü Adı *). ro_root_handler = root_handler. Son metod. Son sınıf.
Ve son adım, Bir Hizmet Oluştur.
SICF tcode’u açın ve çalıştırın.
/SAP/BC/REST’ye gidin ve yeni alt öğe ekleyin
Açıklama ekleyin ve işleyici olarak Handler Liste sekmesine ve sınıfımıza gidin, işleyici olarak.
Hizmeti Etkinleştir. Sağ tıklayın Servis ve Test’i tıklayın. Tarayıcı açacak. URL’yi işlemek /dinlenme isteklerini değiştirin.
Benim durumumda, http: // vhcalnplci: 8000/SAP/BC/REST/ZREST/Dinlenmek
GET isteğinde bazı paramleri geçmek istiyorsanız, gibi sorgu dizesi parametreleri ekleyin ‘http: // vhcalnplci: 8000/SAP/BC/REST/ZREST/REST?sap-client = 001 & req =’
İşleyicide CSRF’yi devre dışı bırakmazsanız, Postman’dan veya sunucunun kendisinden farklı bir istemciden yayın yöntemleri gibi olmayan yöntemleri çağıran sorunlarınız olacaktır.
Bu nedenle örneğimde CSRF’yi devre dışı bıraktım.
Postacı Örnekler
Temel kimlik doğrulama parametreleri
Örnek ve Sonuç Alın
Örnek ve Sonuç Post
ABAP’den tüketmek
Çağrı yapmak için bir httpclient kullanacağız ve Get_Datetime örneğiyle JSON’u Abap yapısını ayrıştıracağız.
HTTP İstemci Kodu
Sınıf ZUTIL_CL_REST_WS Tanım Kamu Yaratın . "REST Web Servisi Aramaları Yapmak İçin Sınıf Sargısı Kamu Bölümü. "Sabitler Sabitleri: C_CONTENT_TYPE_JSON Tür Dize Değeri 'Uygulama/Json; Charset = UTF-8', C_CONTENT_TYPE_XML Tür Dize Değeri 'Uygulama/Xml; Charset = Utf-8',. "Ws çağrı yöntemleri call_ws aktarma değeri (i_url) tür dize değeri (i_content_type) türünü aktarma varsayılan c_content_type_json değeri (i_request_method_get) tür dize c_request_method_get değeri (i_username) değeri (i_username) değeri (i_passername) optional değer (i_passpay) türü optional value (i_passpord) türü ümit (i_pay opsidecy ıstır _cl_defs => gty_state değeri (e_response_str) Tür dize. Korumalı bölüm. Özel bölüm. Veri HTTP_CLIent Tür Ref Ref. Yöntemler Fill_warning Döndürme Değeri (Durum) Türü Zutil_cl_defs => gty_state. Son sınıf. Sınıf Zutil_cl_rest_ws uygulaması. * ---------------------------------------------------------------------------------------+ * | Örnek genel yöntemi Zutil_cl_rest_ws-> call_ws * + ----------------------------------------------------------------------------------------- + * | [--->] I_URL Tür Dize * | [--->] i_content_type Tür String (varsayılan = c_content_type_json) * | [--->] i_request_method türü (varsayılan = c_request_method_get) * | [--->] I_USERNAME TİPİ STRING (isteğe bağlı) * | [--->] i_password Tür String (isteğe bağlı) * | [--->] i_payload türü dizesi (isteğe bağlı) * | [Gty_state * | [Yöntem Call_ws. Veri: Exref Type Ref - CX_ROOT. DENEMEK. "Bu create_by_url'u kullanmak, bu sınıfı kullanmanın belirli yönlerini basitleştirebilir http_client. cl_http_client => create_by_url (url dışa aktarma = i_url istemci içe aktarma = http_client istisnalar argument_not_found = 1 plugin_not_active = 2 internal_error = 3 diğer = 4). Sy-Subrc <> 0 ise. E_STATE-State = Fill_warning (). GERİ DÖNMEK. Endif. "Benim mantık ilk olarak kullanıldı, ancak http_client-> request-> set_method (i_request_method) olarak değiştirilebilmelisiniz. http_client-> istek-> set_content_type (i_content_type). "I_USERNAME başlangıç değilse veya i_password başlangıç değilse kimliği doğrulamayı unutmayın. http_client-> kimlik doğrulama (kullanıcı adı = i_username şifre = i_password). Endif. "Varsa, yük hazırlayın ve i_payload başlangıç değilse atayın. "Bu yükü XString'e dönüştürün. Veri lv_payload_x Tür XString. 'SCMS_STRING_TO_XSTRING' ARAMA FONKSİYONU ÇAĞRI METİN DÜŞÜNMESİ = I_PAYLOUL İçe Aktarma Tampon = LV_PAYLOUL_X ÖZELLİKLER YAPILDI = 1 Diğer = 2. Sy-Subrc <> 0 ise. e_state-state = zutil_cl_defs => c_state_warning. e_state-state = 'kodlama hatası!'. GERİ DÖNMEK. BAŞKA. http_client-> istek-> set_data (lv_payload_x). "İkili Veriler Endif. Endif. "İsteği gönderme HTTP_CLIent-> Gönder (istisnalar http_communication_failure = 1 http_invalid_state = 2). Sy-Subrc <> 0 ise. E_STATE-State = Fill_warning (). GERİ DÖNMEK. Endif. "Yanıtı alma HTTP_CLIent-> Al (istisnalar http_communication_failure = 1 http_invalid_state = 2 http_processing_failed = 3). Sy-Subrc <> 0 ise. E_STATE-State = Fill_warning (). GERİ DÖNMEK. Endif. "Cevabı kontrol edin. Umarım bir json yanıtını geri alırsın. e_response_str = http_client-> yanıt-> get_cdata (). E_RESPONSE_STR başlangıç ise. e_response_str = http_client-> yanıt-> get_data (). Endif. e_state-state = zutil_cl_defs => c_state_success. e_state-state_text = 'başarıyla tamamlandı.'. CX_ROOT'u Exref'e yakalayın. e_state-state = zutil_cl_defs => c_state_error. e_state-state_text = exref-> get_text (). Sonbahar. Son metod. * ---------------------------------------------------------------------------------------+ * | Örnek Özel Yöntem ZUTIL_CL_REST_WS-> FILL_WARNING * + ------------------------------------------------------------------------------------- + * | [Gty_state * +-------------------------------------------------------------------------------------- Yöntem Fil_warning. State-State = zutil_cl_defs => c_state_warning. http_client-> get_last_error (mesaj içe aktarma = data (msg) "hata mesajı). State-State_text = msg. Son metod. Son sınıf.
Tüketici Sınıf Kodu. Önce yanıt yapısını çözer ve durumu kontrol eder. Başarı ise, Call ID 1001’in sonucu için vücut json kısmını çözer.
Sınıf ZREST_CL_CONSUMER TANIM KAMU NİHASI KAMU KADAR . Kamuya açık bölüm. Yöntemler Get_datetime Durum Türünü Dışa Aktarma Zutil_cl_defs => GTY_STATE DT Tür Tzntimestp. Korumalı bölüm. Özel bölüm. Son sınıf. Sınıf ZREST_CL_CONSUMER uygulaması. * ---------------------------------------------------------------------------------------+ * | Örnek genel yöntemi ZREST_CL_CONSUMER-> get_datetime * + ----------------------------------------------------------------------------------------- + * | [Gty_state * | [Yöntem get_datetime. "REST Web API verilerini tüketmek için örnek yöntemi: Exref Type Ref - CX_ROOT. DENEMEK. "Sabitler: C_UNAME TİPİ STRING değeri 'Geliştirici', C_PASS TÜR STRING değeri 'Down1oad'. "Oluştur Çağrı Verileri Al: URL Türü Dize Değeri 'http: // vhcalnplci: 8000/SAP/BC/REST/ZREST/REST?sap-client = 001 '. Veri REQ_STC TYPE ZREST_S_REQUEST. req_stc-id = '1001'. Veri (req_json) = /ui2 /cl_json => Serialize (verileri dışa aktarma = req_stc). url = url && '& req =' && req_json. "Web API'sını Çağır Yeni Zutil_cl_rest_ws ()-> Call_ws (I_URL = url i_username = c_uname i_password = c_pass içe aktarma E_STATE = durumu e_response_str = data (json_response)). Durum-state eq zutil_cl_defs => c_state_success ise. Veri: Resp_stc Type Zrest_s_response. /UI2/CL_JSON => Deserialize (JSON = JSON_RESPONSED DÜŞÜNME VERİ DEĞİŞTİRME = RESP_STC). RESP_STC-State-State EQ ZUTIL_CL_DEFS => C_STATE_SUCCESS. Türler: Ty_res'in Başlangıcı, Datetime Type Tzntimestp, Ty_res'in Sonu. Veri: Resp_1001 Type Ty_RES. /UI2/CL_JSON => Deserialize (JSON = RESP_STC-BODY DEĞİL VERİ DEĞİŞTİRME = RESP_1001). dt = resp_1001-dateTime. Endif. Endif. CX_ROOT'u Exref'e yakalayın. State-State = zutil_cl_defs => c_state_error. State-State_text = exref-> get_text (). Sonbahar. Son metod. Son sınıf.
Hepsi bu. Bu şekilde, herhangi bir ortamı entegre edebilirsiniz.
umarım yardımcı olur.
Okuduğunuz için teşekkürler.
İlgili Bağlantılar