Spring Boot 3.2'de Gelen RestClient Nedir?

Metehan Gültekin
folksdev
Published in
4 min readMar 27, 2024

Spring Framework 6.1’in bir parçası olarak tanıtılan RestClient, geliştiricilere iç ve dış API’lerle etkileşimde bulunma yeteneği sağlayan yeni bir HTTP çağrısı aracıdır. RestClient, esnek ve kullanımı kolay bir çözüm sunarak geliştiricilere avantaj sağlar. Bu makalede, bu aracın temel özelliklerini ve kullanım senaryolarını ele alacağız.

RestClient ve Diğer HTTP İstemcileri Arasındaki Farklar

RestTemplate ve WebClient ile kıyaslandığında, RestClient’in belirgin avantajları ve dezavantajları vardır. RestTemplate’in içerdiği fazla sayıda overloaded metot, eski ve bakım modunda olması, WebClient’in ise zorunlu asenkron yapısı, RestClient’in ortaya çıkmasının temel nedenlerindendir. RestClient, kolay kullanımı ve esnekliği ile dikkat çeker.

RestClient’in Avantajları ve Dezavantajları

RestClient’in kullanım avantajları arasında basit bir yapısı olması ve sadece Spring Web modülüne bağımlı olması yer almaktadır. Bu durum, dış bağımlılıkları minimum düzeyde tutarak geliştirme süreçlerini sadeleştirir. Ancak asenkron yapısına göre daha düşük performans potansiyeli ve gelecekteki güncellemelerin nereye yönleneceğine dair belirsizlikler RestCient’ın dezavantajları arasında yer alır.Avantajları ve dezavantajları burada noktalayıp RestClient içinde kullanabileceğimiz metotlara bir göz atalım.

RestClient İçinde İstek Atmak İçin Kullanabileceğimiz Metotlar

RestClient, geliştiricilere çeşitli HTTP isteklerini kolayca yapabilmeleri için metotlar sunar. İşte RestClient içinde istek atmak için kullanılabilecek temel metotlar:

.post() — HTTP POST İsteği: Bir veriyi oluşturmak veya güncellemek için kullanılır. Genellikle veri göndermek için kullanılır.

.get() — HTTP GET İsteği: Kaynaklardan bilgi almak veya okumak için kullanılır.

.put() — HTTP PUT İsteği: Belirli bir kaynağı güncellemek veya oluşturmak için kullanılır.

.delete() — HTTP DELETE İsteği: Belirli bir kaynağı silmek için kullanılır.

.head() — HTTP HEAD İsteği: Belirli bir kaynağın başlıklarını almak için kullanılır.

.options() — HTTP OPTIONS İsteği: Belirli bir kaynağa yapılabilecek HTTP yöntemlerini sormak için kullanılır.

.patch() — HTTP PATCH İsteği: Belirli bir kaynağın kısmi güncellemelerini yapmak için kullanılır.

RestClient kullanarak bir proje geliştirelim

Projemizi oluşturmak için ilk adım olarak “https://start.spring.io/" adresini ziyaret edelim. Ardından, projemizin ihtiyaç duyduğu bağımlılıkları ekleyerek başlayalım. Bu kapsamda, aşağıdaki ekran görüntüsünde görüldüğü gibi Spring Web ve Lombok bağımlılıklarını projemize eklememiz gerekiyor.

Biz geliştirmelerimizi yaparken, 'https://reqres.in/' sitesindeki API’yi kullanacağız ve herhangi bir authorization gerekmeyecek.

Config için fazla şeye ihtiyacımız yok, sadece bağlanacağımız API’nin ana linkini verdik. İşlemler sırasında gerekli endpoint’leri metotlar içerisinde belirteceğiz.

RestClientConfig

Şimdi API’ye bir POST isteği atacağız. Bunun için controller,request ve response sınıflarını oluşturalım.

UserController-CreateUser
UserRequest
UserCreateResponse

Şimdi UserService içerisinde RestClient’i kullanalım

UserService-CreateUser

9. satırda belirttiğimiz URL’nin sonuna “/users” ekledik. Bu nedenle, bu metotun içindeki URL şu şekilde oldu: “https://reqres.in/api/users".

10. satırda, HTTP isteğinin içeriğinin JSON formatında olduğunu belirtiyoruz.

11. satırda, isteğimizin ‘header’ bilgisini dolduruyoruz. Ancak, benim attığım post isteğini atarken benden ‘header’ kısmında girmemi beklediği bir bilgi yok. Bu yüzden bu satırı yorum satırına aldım. Ancak, sizin istek attığınız API’de ‘header’ kısmında `Content-Type`, `Authorization` gibi alanları doldurmanızı bekliyorsa, bu satırı yorum satırından çıkarıp doldurun.

Fark ettiyseniz, 12. ve 14. satırlarda iki farklı `body` metotu bulunmaktadır. 12. satırdaki `body` metotu, request isteğinin bir parametre olarak alır ve bu, `RequestBodySpec` sınıfı tarafından sağlanır. Öte yandan, 14. satırdaki ikinci `body` metotu, response tipini parametre olarak alır ve bu, `ResponseSpec` sınıfı tarafından sağlanır.

Bu noktadan sonra controller, request ve response kısımlarını eklemeyeceğim. Sadece service sınıfına odaklanacağız. Ana projeye Github üzerinden bakabilirsiniz.

toEntity()

UserService-getSingleUser

GET isteği gönderiyoruz ve yukarıdaki createUser metotundan farkı ise, response kısmında ‘body’ yerine ‘toEntity’ metotunun kullanılmasıdır. ‘toEntity’ kullanıldığında, gelen response ResponseEntity ile sarılıp bize sunulur. Bu sayede dönen cevap(response) içerisinde body (beklediğimiz data), headers ve status code bilgileri bulunacaktır.

Burada 3. satırda, id’yi ana linke ekleyeceğimizi görüyoruz. Ancak, ‘id’ burada bir parametre olarak geçtiği için sabit bir değer değil, değişken bir değer olabilir. Bu nedenle, id’yi parametre olarak alıp linkimize vermek için `.uri(“/users/{id}”, id)` şeklinde kullanıyoruz.

toBodilessEntity()

UserService-deleteUser

Burada DELETE isteği gönderiyoruz ve 5. satırdaki ‘toBodilessEntity’ ile bu metotun cevapsız (response dönmeyecek) bir şekilde gerçekleşeceğini belirtiyoruz diye düşünebiliriz.

onStatus()

UserService-updateUser

Burada bir PUT işlemi yapıyoruz ve genel olarak aynı metotları kullanıyoruz. Tek farkı 7. satırdaki ‘onStatus’ metotu. ‘onStatus’, farklı HTTP durumlarına karşı özel işlemler yapabilmemizi sağlar. Bu örnekte, 4xx ile başlayan tüm hata durumlarında (örneğin, 400, 401, 403, 404 vb.) `throw new RuntimeException(“4xx error”);` yapmasını istedik. Burada isterseniz bir hata fırlatma ya da yeni bir iş akışı başlatma gibi çeşitli işlemler gerçekleştirebilirsiniz.

exchange()

Burada tekrardan GET isteği yapıyoruz API’ye. 6. satırda başlayan bir ‘exchange’ methotu bloğu görüyoruz. ‘exchange’ metotu, HTTP isteğinin başlatılması ve yanıtın alınması arasında, isteğe özelleştirilmiş bir işlem gerçekleştirmemizi veya işlev eklememizi sağlar.

Bu kod bloğunda ise, eğer durum kodu 200 ise (HTTP OK), yanıttan gelen içerik objectMapper yardımıyla okunur ve döndürülür. Aksi durumda ise, durum kodu baz alınarak bir RuntimeException fırlatılır.

Kendi metotlarımızın içinde RestClient kullanarak dış API’ye istekler göndererek uygulamamızı bu şekilde geliştirebiliriz.

Projenin kaynak kodlarına buradan ulaşabilirsiniz.

Sonuna kadar okuduğunuz için teşekkür ederiz. Gitmeden önce:

  • Lütfen yazıyı alkışlamayı ve beni takip etmeyi unutmayın! 👏
  • Beni takip etmek isterseniz X| Linkedin| Github

İyi günler,
Bol kodlamalar :)

Kaynaklar

--

--