Feign: Spring RestTemplate Alternatives?

Feign: Spring RestTemplate Alternatives?

Published
August 10, 2022
Author
Chandra Wijaya
Tags
Java
Sejujurnya, saya tidak begitu merasakan perbedaan yang signifikan antara OpenFeign dan RestTemplate. Basically, keduanya dapat saya bilang seperti HTTP Clients saja. Tetapi pernyataan declarative rest client pada official definition-nya menarik perhatian saya. What does exactly "declarative" mean? Let's dive deeper.
Spring RestTemplate adalah class yang disediakan oleh framework Spring yang berguna untuk melakukan HTTP request ke sebuah API. Kita bisa menggunakan RestTemplate untuk melakukan berbagai macam HTTP request, seperti GET, POST, PUT, dan DELETE. Selain itu, RestTemplate juga mendukung fitur untuk mengatur header dan parameter request, serta mengolah response yang diterima.
Sedangkan OpenFeign adalah sebuah library yang dikembangkan oleh Netflix yang juga berguna untuk melakukan komunikasi antar aplikasi. OpenFeign menyediakan interface yang bisa kita implementasikan untuk mengakses API. Setiap method pada interface tersebut akan merepresentasikan HTTP request yang akan dilakukan terhadap sebuah API. OpenFeign juga mendukung fitur annotation untuk mengatur header, parameter, dan response dari request yang dilakukan.

Best of both worlds

Kedua cara ini memiliki kelebihan dan kekurangan masing-masing. Berikut adalah beberapa perbandingan antara Spring RestTemplate dan OpenFeign:

Konfigurasi

Spring RestTemplate membutuhkan konfigurasi yang lebih banyak dibandingkan OpenFeign. Kita harus menambahkan dependensi Spring Web dan RestTemplate pada project kita, serta menambahkan bean RestTemplate di konfigurasi Spring kita.
OpenFeign hanya membutuhkan dependensi OpenFeign dan menambahkan annotation @EnableFeignClients pada konfigurasi kita.

Implementasi

Spring RestTemplate menyediakan kelas yang bisa kita gunakan langsung untuk melakukan HTTP request. Kita bisa memanggil method-method yang disediakan oleh kelas tersebut sesuai dengan kebutuhan kita.
OpenFeign menyediakan interface yang harus kita implementasikan untuk mengakses API. Setiap method pada interface tersebut akan merepresentasikan HTTP request yang akan dilakukan ke API.

Flexibilitas

Spring RestTemplate lebih fleksibel dibandingkan OpenFeign. Kita bisa dengan mudah mengubah setiap aspek dari request yang dilakukan, seperti header, parameter, dan response.
OpenFeign lebih terikat pada struktur interface yang telah ditentukan. Kita hanya bisa mengubah aspek-aspek request yang telah ditentukan oleh annotation yang disediakan oleh OpenFeign.

Penggunaan

Spring RestTemplate lebih cocok digunakan untuk project yang membutuhkan fleksibilitas dan kontrol yang lebih besar terhadap proses komunikasi antar aplikasi. RestTemplate bisa digunakan untuk komunikasi dengan protokol selain HTTP, seperti FTP atau SMTP.
OpenFeign lebih cocok digunakan untuk project yang membutuhkan implementasi yang lebih sederhana dan terstruktur dalam komunikasi antar aplikasi. However, perlu diingat bahwa OpenFeign hanya dapat digunakan untuk komunikasi dengan protokol HTTP.

Getting your hands dirty

Berikut ini adalah contoh sederhana implementasi Spring RestTemplate dan OpenFeign untuk melakukan HTTP GET request ke API sederhana yang mengembalikan data "Hello, World!".
Untuk implementasi Spring RestTemplate, most likely kita akan menuliskannya seperti ini:
import org.springframework.web.client.RestTemplate; public class RestTemplateExample { public static void main(String[] args) { RestTemplate restTemplate = new RestTemplate(); String response = restTemplate.getForObject("http://example.com/api", String.class); System.out.println(response); } }
Kita bisa memanggil method getForObject() pada kelas RestTemplate untuk melakukan HTTP GET request ke alamat URL yang ditentukan. Method ini akan mengembalikan objek yang sesuai dengan tipe data yang kita tentukan (dalam contoh di atas, tipe data yang dikembalikan adalah String).
Sedangkan untuk menggunakan OpenFeign:
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(name = "example", url = "http://example.com") public interface ExampleClient { @GetMapping("/api") String getHelloWorld(); } public class OpenFeignExample { public static void main(String[] args) { ExampleClient exampleClient = Feign.builder() .client(new OkHttpClient()) .decoder(new GsonDecoder()) .target(ExampleClient.class); String response = exampleClient.getHelloWorld(); System.out.println(response); } }
Pastikan untuk menambahkan dependensi yang diperlukan pada project kita, seperti Spring Web, Spring Cloud OpenFeign, dan OkHttp (atau library lain yang digunakan sebagai HTTP client oleh OpenFeign). Juga pastikan bahwa konfigurasi Spring sudah mengaktifkan annotation @EnableFeignClients jika kita menggunakan OpenFeign.
import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Configuration; @Configuration @EnableFeignClients public class FeignConfiguration { }

My take on this...

Spring RestTemplate dan OpenFeign adalah dua cara populer untuk melakukan komunikasi antar aplikasi di dunia Java. Namun pilihan terbaik antara Spring RestTemplate dan OpenFeign akan tergantung pada kebutuhan dan karakteristik project yang sedang kita kerjakan. Jika kita membutuhkan fleksibilitas yang lebih tinggi dalam mengubah aspek-aspek request, maka Spring RestTemplate mungkin lebih cocok untuk kita. Namun, jika kita ingin implementasi yang lebih sederhana dan terstruktur, maka OpenFeign mungkin lebih cocok untuk kita.
My favourite advantages: Feign memungkinkan kita untuk tidak perlu menulis code apapun untuk mengakses sebuah service. Kita hanya perlu menulis definisi interface yang mengimplementasikan komunikasi dengan sebuah API yang akan kita akses, sehingga penggunaan Feign sangat memudahkan proses pembuatan client web service.
Semoga informasi ini bermanfaat!

References

feign
OpenFeignUpdated Nov 9, 2024