A BLOG POST
Feign: Spring RestTemplate Alternatives? [Bahasa]
So, it's 2022 and I just heard about OpenFeign. Guess I'm a bit late but I gave it a try, and...is it more advantageous than RestTemplate
? Should you use it? Let's find out.
10/11/2024, 2:37:01 AM
100 times
Sejujurnya, saya tidak begitu merasakan perbedaan yang signifikan antara OpenFeign
dan RestTemplate
. Basically, keduanya dapat saya bilang seperti HTTP Clients saja. But, the sentence declarative rest client pada official definition-nya adalah satu-satunya yang 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.
Kedua cara ini memiliki kelebihan dan kekurangan masing-masing. Berikut adalah beberapa perbandingan antara Spring RestTemplate dan OpenFeign:
- 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.
- 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.
- 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.
- 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.
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:
java
1import org.springframework.web.client.RestTemplate;
2
3public class RestTemplateExample {
4 public static void main(String[] args) {
5 RestTemplate restTemplate = new RestTemplate();
6 String response = restTemplate.getForObject("http://example.com/api", String.class);
7 System.out.println(response);
8 }
9}
10
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:
java
1import org.springframework.cloud.openfeign.FeignClient;
2import org.springframework.web.bind.annotation.GetMapping;
3
4@FeignClient(name = "example", url = "http://example.com")
5public interface ExampleClient {
6 @GetMapping("/api")
7 String getHelloWorld();
8}
9
10public class OpenFeignExample {
11 public static void main(String[] args) {
12 ExampleClient exampleClient = Feign.builder()
13 .client(new OkHttpClient())
14 .decoder(new GsonDecoder())
15 .target(ExampleClient.class);
16 String response = exampleClient.getHelloWorld();
17 System.out.println(response);
18 }
19}
20
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.
java
1import org.springframework.cloud.openfeign.EnableFeignClients;
2import org.springframework.context.annotation.Configuration;
3
4@Configuration
5@EnableFeignClients
6public class FeignConfiguration { }
7
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!
OpenFeign/feign: Feign makes writing java http clients easier