Verilerimiz servis üzerinde XML veya JSON şeklinde gösterebiliriz.Kullanım alanları değişiklik göstermektedirler.Kullanılan projedeki değişkenlere göre XML veya JSON tipinde verilerimizi dönüş sağlayabiliriz.Önceki yazılarımda bir metod sadece XML yada JSON veri tipinde işlemler yapabiliyordu.Bu yazımda ise multiformat yani birden fazla tipte veri dönüşünü tek bir metot üzerinden gerçekleştireceğiz.Proje üzerinde anlatmaya çalışalım.
1)Maven projesi oluşturalım ve kullanacağımız bağımlılıklarımızı pom.xml dosyamız içerisine ekleyelim.Jersey kütüphanesi kullandığımız için Jersey-Json bağımlılığını projemize ekleyelim.
[code lang=”xml”]
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>0008-com.enesbyc-RESTful-MultiOutputFormat</groupId>
<artifactId>0008-com.enesbyc-RESTful-MultiOutputFormat</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<jersey-version>1.19</jersey-version>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey-version}</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>${jersey-version}</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>${jersey-version}</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>${jersey-version}</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>
</project>
[/code]
2)İkinci adımda web.xml dosyamız içerisine Jersey kullandığımızı belirtmemiz gerekiyor.
[code lang=”xml”]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>0008-com.enesbyc-RESTful-MultiOutputFormat</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!– Jersey kullanimi icin gerekli –>
<!– Jerseyi hangi paket içerisinde kullanacağımızı belirtiyoruz –>
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<!– Jersey-JSON kullanimi icin gerekli –>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.enesbyc</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>
[/code]
3)com.enesbyc.model paketimizi oluşturup içerisine Product isminde bir sınıf oluşturalım.Sınıfın içerisinde kullanacağımız property’lerimizi tanımlayalım.
[code lang=”java”]
package com.enesbyc.model;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Product {
@XmlElement
String productName;
@XmlElement
String productPrice;
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductPrice() {
return productPrice;
}
public void setProductPrice(String productPrice) {
this.productPrice = productPrice;
}
@Override
public String toString() {
return "Product [productName=" + productName + ", productPrice=" + productPrice + "]";
}
}
[/code]
4)com.enesbyc.service paketimizi oluşturalım ve içerisine ProductService isimli sınıfımızı oluşturalım.Service sınıfımız içerisinde Produces anotasyonu ile hem JSON hemde XML tipinde veri veri döneceğini belirtiyoruz.Metodumuz içerisinde product nesnesi oluşturalım ve return edelim.XML ve JSON tipinde veri dönme işlemini istemciye göre belirleyecektir.Eğer client içerisinde XML tipinde veri istenirse XML , aynı şekilde JSON istenirse JSON tipinde veri return edilecektir.
[code lang=”java”]
package com.enesbyc.service;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import com.enesbyc.model.Product;
@Path("/product")
public class ProductService {
@GET
@Path("/info")
@Produces({MediaType.APPLICATION_XML , MediaType.APPLICATION_JSON})
public Response getInfo(){
Product product=new Product();
product.setProductName("Cup");
product.setProductPrice("15");
return Response.status(200).entity(product).build();
}
}
[/code]
5)com.enesbyc.client paketimizi oluşturalım ve içerisine ProductClient sınıfımızı oluşturalım.Bu sınıf içerisinde iki adet istek tanımlayalım.İlk istekte XML tipinde veri isteği yapalım.Aynı şekilde ikinci istekte JSON formatında veri isteği atalım.
[code lang=”java”]
package com.enesbyc.client;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
public class ProductClient {
public static void main(String[] args) {
// XML formatinda istek yapiliyor.
try {
// istemci olustur
Client client = Client.create();
// kaynak olusturulur
WebResource resource = client.resource("http://localhost:8080/0008-com.enesbyc-RESTful-MultiOutputFormat/rest/product/info");
//XML tipinde istek yapiliyor.
ClientResponse response = resource.accept("application/xml" + ";charset=utf-8").get(ClientResponse.class);
if (response.getStatus() != 200) {
throw new RuntimeException("Hata meydana geldi");
}
// Gelen cevap string haline getirilir
String sonuc = response.getEntity(String.class);
System.out.println("XML tipinde veri istenildiginde gelen deger" + sonuc);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("—————————————————————————————");
// JSON formatinda istek yapiliyor.
try {
// istemci olustur
Client client = Client.create();
// kaynak olusturulur
WebResource resource = client.resource("http://localhost:8080/0008-com.enesbyc-RESTful-MultiOutputFormat/rest/product/info");
//JSON tipinde istek yapiliyor.
ClientResponse response = resource.accept("application/json" + ";charset=utf-8").get(ClientResponse.class);
if (response.getStatus() != 200) {
throw new RuntimeException("Hata meydana geldi");
}
// Gelen cevap string haline getirilir
String sonuc = response.getEntity(String.class);
System.out.println("JSON tipinde veri istenildiginde gelen deger" + sonuc);
} catch (Exception e) {
// TODO: handle exception
}
}
}
[/code]
6)Projemize sağ tıklayıp Run as->Run on the Server seçelim.Bu sayede web servisimiz çalışmış oldu.Daha sonra ProductClient sınıfımıza sağ tıklayıp Run as -> Java Application seçeneği ile devam edelim.Consolda XML ve JSON tipinde verilerimizi görüntüleceğiz.Multi output format sayesinden tek bir metot ile birden fazla tipte veri return etme işlemini gerçekleştirmiş olduk.

Bir sonraki yazımda görüşmek üzere…