RestEasy İle Restful Web Servis Dersleri 6 - Advanced PathParam And PathSegment
Merhabalar arkadaşlar. Bu yazıda önceki yazılarda gördüğümüz PathParam bilgimizi biraz derinleştireceğiz.
Advanced PathParam And Regular Expression
Önceki yazılarda @PathParam notasyonu ile gelen bir parametreyi almayı öğrenmiştik. RestEasy içerisinde ilgili pathi birden fazla parametre alacak şekilde düzenlememize imkan sağlayan yapı mevcuttur. Birkaç örnek kullanıma bakalım:
1. @Path("/kalıp1{parametre}kalıp2")
2. @Path("/{parametre1}-{parametre2}")
3. @Path("/kalıp1{parametre1}-{parametre2}kalıp2")
Yukarıdaki örnekleri incelediğimizde şu sonuca varıyor olacağız:
- Birinci örnekte kullanıcıdan değişmeyen bazı ifadelerin arasında parametre göndermesi bekleniyor. Örneğin kalıp1 ve kalıp2 id olsun biz parametrezi bu kalıplar arasında vereceğiz. Şöyle ki: id15id , id21id , id3id. Burada biz bir şablon belirlemiş oluyoruz ve şablon id kelimlerinin arasında bir parametre bekliyor.
- İkinci örnekte yukarıdan faklı olarak iki parametre alıyoruz ancak bu parametreler aralarında - ile gelmek zorundalar. Şöyle ki: ilkay-gunel , husnu-tapan , isa-aytimur
- Üçüncü örnekte ise bize ilk iki örnekten faklı olarak iki kalıp ve iki parametre amayı gösteriyor ve - işaretini zorunlu koşuyor yine. kalıp1 id olsun, kalıp2 isim olsun. id23-Mustafaisim , id15-Tanerisim
Burada başka bir durum da şu olabilir ki bu parametreler bazı özel ifadeler ile kalıplandırılabilinir:
@GET
@Path("/aaa{param:b.*}/{many:.*}/stuff")
@Produces("application/json")
public String getRecord(@PathParam("param") String bs, @PathParam("many") String many)
{
}
Örneğimizde @Path’e dikkat ettiğimizde beklediği parametrenin aaa kalıbı ile başlamasını,baş harfi b olan bir parametrenin takip etmesini / ifadesi ile alt dizine inip {many:.} ifadesi ile her türlü gelebilecek parametreyi kabul eden ama gelmesini şart koşan ve */ ifadesi ile alt dizine geçip stuff çağırımı yapan bir yapı görüyoruz.
PathSegment
Biz normalde birden fazla parametreyi metoda geçirmek istesek bu durumda birden @PathParam kullanmamız gerekecekti ve belki bu da kod kalabalığına sebep olacaktı. Ancak RestEasy içinde bulunan @PathSegment notasyonu ile gelen tek parametre ile birden çok değer elde edebiliriz. Hemen örneğimize bakalım:
@GET
@Path("/bookInfo/{bookInfo}")
@Produces("application/json")
public String getRecord(@PathParam("bookInfo") PathSegment bookInfo)
{
String returnedBookName="",returnedAuthorName="";
MultivaluedMap<String,String> parameters = bookInfo.getMatrixParameters();
Map<String,String> bookNameMap = new HashMap<>();
bookNameMap.put("bookName", "Kuyucaklı Yusuf");
bookNameMap.put("bookName", "1984");
Map<String,String> authorNameMap = new HashMap<>();
authorNameMap.put("authorName", "Sabahattin Ali");
authorNameMap.put("authorName", "George Orwell");
for (String string : bookNameMap.values()) {
System.out.println(parameters.getFirst("bookName"));
if(string.equals(parameters.getFirst("bookName"))){
returnedBookName = string;
break;
}
}
for (String string : authorNameMap.values()) {
System.out.println(parameters.getFirst("authorName"));
if (string.equals(parameters.getFirst("authorName"))) {
returnedAuthorName = string;
break;
}
}
return returnedBookName + ":"+returnedAuthorName;
}
Örneğimizi incelediğimizde metodumuzun path’inin bookInfo olduğunu görüyoruz ve bu path altında bir de bookInfo parametresi bekleniyor. Metodun parametre alan kısmında dikkat ettiğimizde @PathSegment tipinde bir bookInfo parametresi görüyoruz. Bu parametreden biz kod içinde getMatrixParameters() metodu ile bir MultivaluedMap nesnesi elde ediyoruz. Bu nesne tek nesne içinde gönderilen parametreleri Map’e koyan bir nesne fakat bildiğimiz Map’ten farklı. Bu veri tipi ile ilgili bir yazı yazıcam inşaAllah. For döngüleri içinde gerFirst metodunun kullanılmasının sebebi bir key’in bir defa gönderildğinin varsayılmasıdır.
Ekran Çıktısı
Tarayıcıda http://localhost:8084/RestEasyTutorials/restService/service/bookInfo/bookInfo;authorName=George Orwell;bookName=1984 adresine gidiyorum. URL’de şu noktaya dikkat etmeliyiz, ben authorName ve bookName parametreleri göndericem ama bundan önce herhangi bir stringle bunu söylemem lazım. Yani burada /bookInfo/bookInfo; ifadesindeki ikinci bookInfo; benim parametre göndereceğimi söylüyor. Noktalı virgülden sonra gönderdiğim parametrelerde sistem tarafından algılanıyor ve kullanılıyor.
[]
Resimde gördüğünüz gibi ben iki parametre yolladım ama tek bookInfo nesnesi ile bunları elde edip kullandım.
Bu yazıda da bu kadar arkadaşlar. Gelecek yazıda görüşene kadar sağlıcakla kalın.