Restful Web Services (JAX-RS), sorgu parametreleri(queryparam) ile dilediğimiz ölçütlerin çalıştırılmasını sağlayabiliriz. Örneğin, bir alışveriş sitesinde ilk 10 ürünün sergilenmesini, tanımlanan tiplere uygun kayıtların getirilmesini sağlayabilirz. Bu değerleri kullanıcının seçmesini yaptığımız projelerde sağlayabiliriz. PathParam daha bir kayda ait ayrıntıyı alabileceğimiz alanlarda kullanılabilir.
Maven projemizde hızlıca pom.xml ve web.xml ayarlarımızı yapalım.
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 |
... <dependencies> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-server</artifactId> <version>1.8</version> </dependency> </dependencies> ... |
web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>Restful Web Application</display-name> <servlet> <servlet-name>jersey-serlvet</servlet-name> <servlet-class> com.sun.jersey.spi.container.servlet.ServletContainer </servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>org.onurarslan.rest</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jersey-serlvet</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app> |
ProductService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
package org.onurarslan.rest; import java.util.List; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; // /product yolu çağırıldığında bu sınıf çalışacaktır @Path("/product") public class ProductService { // /products/query?from=DEGER1&to=DEGER2&orderBy=DEGER3 yolunda bu metot çalışır. //from, to ve orderBy değerleri kullanıcı tarafından gönderilir @GET @Path("/query") public Response getProducts(@QueryParam("from") int from, @QueryParam("to") int to, @QueryParam("orderBy") List<String> orderBy){ return Response.status(200).entity("getProduts query: " + from +" ile " + to +" arasinda "+ orderBy.toString() + " siralamasina gore cagirildi.").build(); } // /products/query2?from=DEGER1&to=DEGER2&orderBy=DEGER3 yolunda bu metot çalışır. // yukarıdaki örnekten farkı tüm query parametrelerinin tek bir parametrede tutulup ilgili yerlere setlenmesidir @GET @Path("/query2") public Response getProducts(@Context UriInfo info){ String from = info.getQueryParameters().getFirst("from"); String to = info.getQueryParameters().getFirst("to"); String orderBy = info.getQueryParameters().getFirst("orderBy"); return Response.status(200).entity("getProduces query2: " + from + " ile " + to + " arasinda "+orderBy.toString() + "s iralamasina gore cagirildi.").build(); } // /products/query3?to=DEGER2&orderBy=DEGER3 yolunda bu metot çalışır. //Dİğerlerinden farkı eksik parametre yazsanız bile boş bir değer yerine default olarak verilen değerleri setler. @GET @Path("/query3") public Response getProducts2(@DefaultValue("0") @QueryParam("from") int from, @DefaultValue("50") @QueryParam("to") int to, @DefaultValue("id") @QueryParam("orderBy") List<String> orderBy){ return Response.status(200).entity("getProducts2 query3: " + from + " ile " + to + " arasinda "+orderBy.toString() + "siralamasina gore cagirildi").build(); } } |
Yukarıda ki örneğimizde getProducts isimli metotlarımızı farklı path yapıları ile ulaşarak çalıştırdık. İlk metotda metot sadece @QueryParam alarak verilen değerleri return ederek ekrana yansıttı. İkinci metotda @Context UriInfo yapısı ile herhangi bir @QueryParam sınırlaması yapılması engellendi. İstenilen @QueryParam değerlerini metot içersinde aldık. Üçüncü metotda ise @QueryParam ile bazı değerler gönderilmemesi durumunda @DefaultValue aracılığı ile varsayılan değerlerin kullanılmasını sağladık.
Ekran çıktıları aşağıda ki gibi olmaktadır.
URL: /rest/product/query?from=0&to=50&orderBy=id
1 |
getProduts query: 0 ile 50 arasinda [id] siralamasina gore cagirildi. |
URL: /rest/product/query2?from=0&to=50&orderBy=id
1 |
getProduces query2: 0 ile 50 arasinda ids iralamasina gore cagirildi. |
URL: /rest/product/query3?from=10
1 |
getProducts2 query3: 10 ile 50 arasinda [id]siralamasina gore cagirildi |