Bagaimana cara mengkonsumsi API ISTIRAH eksternal dengan Symfony?


10

Kami sedang membangun arsitektur Microservice untuk proyek-proyek kami, dengan sebagian besar aplikasi Symfony front-end berinteraksi dengan back-end RESTful APIs.

Masalahnya adalah pendekatan ini melanggar manajemen entitas Symfony sangat bergantung pada Doktrin dengan database. Di mana Symfony biasanya menangani entitas dengan Doctrine, mengotomatisasi sebagian besar pekerjaan, ini tidak dapat direproduksi dengan mudah ketika kita harus mengakses data eksternal dari API.

Misalnya, dengan entitas Klien:

  • Menggunakan Doctrine, kita hanya perlu mendefinisikan kelas Klien kita, dan sekarang mudah untuk membuat, memperbarui, mengambil klien kita
  • Menggunakan pendekatan REST API, klien dapat diakses melalui API, tetapi kami memiliki banyak pekerjaan untuk menentukan bagaimana klien dibuat (POST), diperbarui (PUT), diambil (GET), dll.

Yang perlu diperhatikan klien digunakan oleh beberapa aplikasi, tidak hanya aplikasi front-end, karenanya API khusus.

Haruskah kita membuat kelas dengan metode seperti entitas menyembunyikan kompleksitas panggilan API, mengimpor semua data API secara lokal dan mengaksesnya melalui Ajaran, atau dengan cara lain?


Saya di kapal yang sama seperti Anda. Mengkonsumsi API eksternal dengan klien yang dihasilkan dari spesifikasi OpenApi / Swagger. Ingin tahu tentang praktik terbaik untuk 'siklus hidup' konsumsi, operasi kasar, parameter, dan pembuatan formulir filter. Saat ini memperluas pencarian saya untuk memasukkan pendekatan apa pun, terlepas dari apakah itu Symfony spesifik atau tidak.
hulu

Setelah mengatasi masalah ini selama beberapa bulan dan kembali pada pertanyaan ini, kedua jawaban sejauh ini memberikan solusi yang sama: mengabstraksikan panggilan api dengan popo. Itulah cara kami akhirnya menggunakan, meskipun ada solusi lain. Dalam konteks Webapp <> API komunikasi yang serupa, menggunakan tingkat abstraksi menyembunyikan panggilan API dari Webapp tampaknya merupakan solusi yang baik. Dengan munculnya layanan-layanan microser dan API-lead, tidak diragukan lagi praktik dan alat terbaik terkait akan muncul untuk memecahkan apa yang tampaknya menjadi masalah umum.
Pierre B.

Di sini pendekatan serupa diterapkan. Logika bisnis sekarang terkandung dalam lapisan 'aksi', yang tidak peduli apakah itu api REST atau perintah cli yang menyebutnya. Desain heksagonal Alistair Cockburn adalah titik awal yang bagus dalam kasus kami: alistair.cockburn.us/Hexagonal+architecture
upstream

Jawaban:


2

Saya telah membuat proyek berbasis symfony yang menggunakan API eksternal (JSON); apa yang saya lakukan adalah membuat pustaka klien independen ("pustaka klien" - perangkat lunak, paket komposer), dengan kumpulan entitasnya sendiri (POPO); itu terintegrasi dengan kerangka kerja menggunakan antarmuka yang disediakan oleh Symfony (misalnya, dengan hanya membuat penyedia pengguna kustom ).

Klien membuat panggilan http "di belakang layar" - yang penting untuk kemampuan pengujian di masa depan. Anda tidak ingin mengekspos cara Anda berkomunikasi dengan sumber data Anda dan juga Anda tidak ingin tes Anda mengandalkan api langsung.

Antarmuka perpustakaan klien (contoh tampilannya):

class ApiClient {

   /**
    * @throws SomeApiException If credentials are invalid
    * @return ApiUser
    */
   public function authenticate($username, $password);

   /**
    * @return ApiUser
    */
   public function findUserByEmail($email);

   /**
    * @throws SomeApiException If email is invalid
    * @return void
    */
   public function changeUserEmail(User $user, $newEmail);
}

Pustaka klien secara internal menggunakan Guzzle untuk komunikasi dan komponen Cache Doctrine untuk menyimpan hasilnya. Pemetaan antara objek entitas dan json dibuat oleh pemetaan, yang pernah ditulis - tidak terlalu sering berubah (atau peristiwa sama sekali). Dalam hal ini saya akan menyarankan menggunakan JMS Serializer untuk transformasi otomatis ke dan dari JSON (saya berasumsi bahwa Anda menggunakan JSON).

Anda akan membutuhkan mekanisme caching yang baik dan penyimpanan lokal, seperti Redis. Melakukan panggilan api pada setiap permintaan aplikasi akan membunuh server Anda dan secara drastis memperlambat aplikasi Anda. Sangat penting untuk memahami cara kerja cache http. Jika api Anda tidak menggunakan header caching (atau menggunakannya dengan cara yang tidak jelas), akan sangat sulit dan menghabiskan banyak sumber daya untuk melacak perubahan.

Anda juga akan ingin memikirkan tentang bagaimana klien harus bersikap jika koneksi terputus - haruskah klien menggunakan data yang macet? Sebaiknya gunakan beberapa server proxy antara aplikasi Anda dan API. Dalam hal ini proksi (seperti Varnish) dapat mempercepat permintaan Anda dan juga menyegarkan data yang macet di latar belakang tanpa memperlambat aplikasi Anda. Ini juga akan membuat situs web Anda online jika terjadi kegagalan API. Anda mungkin tidak dapat menulis data sementara itu, tetapi pengguna Anda masih dapat menelusuri data yang di-cache.

Dan berbicara tentang Doktrin, lihat " Hukum instrumen ".


1

Doctrine adalah lapisan akses basis data. Anda tidak ingin mengakses database, tetapi apis. Anda masih dapat membuat Entitas, tetapi kemudian sebagai objek sederhana yang tidak harus memperpanjang apa pun implementasi kami (popo). Seharusnya memiliki Repositori yang mengimplementasikan semua metode CRUD. Dalam hal ini panggilan ke API alih-alih basis data. Saya akan membuat antarmuka untuk itu. Tidak harus merasa berbeda untuk aplikasi Anda untuk digunakan, kecuali bahwa Anda harus mempertimbangkan di mana-mana bahwa layanan mikro mungkin tidak merespons.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.