{"id":34054,"date":"2025-11-10T12:41:48","date_gmt":"2025-11-10T09:41:48","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=34054"},"modified":"2025-11-10T12:41:48","modified_gmt":"2025-11-10T09:41:48","slug":"giris-jersey-ve-restful-web-servisleri","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/","title":{"rendered":"Giri\u015f: Jersey ve RESTful Web Servisleri"},"content":{"rendered":"<p><body><\/p>\n<h2>Giri\u015f: Jersey ve RESTful Web Servisleri<\/h2>\n<p>Modern web uygulamalar\u0131n\u0131n bel kemi\u011fini olu\u015fturan RESTful mimari, kaynak tabanl\u0131, durum bilgisi olmayan ve HTTP protokol\u00fcn\u00fc tam anlam\u0131yla kullanan bir yakla\u015f\u0131md\u0131r. Java d\u00fcnyas\u0131nda bu mimariyi uygulamak i\u00e7in \u00e7e\u015fitli \u00e7er\u00e7eveler (framework) bulunmaktad\u0131r. Bunlardan biri de, Java EE standard\u0131 olan JAX-RS (Java API for RESTful Web Services) referans uygulamas\u0131 olan Jersey&#8217;dir. Bu rehberde, Jersey kullanarak nas\u0131l RESTful web servisleri geli\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.<\/p>\n<h3>Jersey Nedir?<\/h3>\n<p>Jersey, JAX-RS API&#8217;sinin a\u00e7\u0131k kaynakl\u0131 bir referans implementasyonudur. JAX-RS, Java geli\u015ftiricilerinin RESTful servisleri kolayca olu\u015fturabilmeleri i\u00e7in standart bir API sa\u011flar. Jersey, bu API&#8217;yi kullanarak, POJO&#8217;lar (Plain Old Java Objects) arac\u0131l\u0131\u011f\u0131yla HTTP isteklerini ve yan\u0131tlar\u0131n\u0131 y\u00f6netmenizi, URI&#8217;lar\u0131 kaynaklara e\u015flemenizi ve \u00e7e\u015fitli medya tiplerini (JSON, XML, metin vb.) i\u015flemenizi sa\u011flar.<\/p>\n<h3>RESTful Mimari ve \u00d6nemi<\/h3>\n<p>REST (Representational State Transfer), web servisleri i\u00e7in bir yaz\u0131l\u0131m mimarisi stilidir. Temel prensipleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><b>Kaynaklar (Resources):<\/b> Her \u015fey bir kaynakt\u0131r ve tekil bir URI (Uniform Resource Identifier) ile tan\u0131mlan\u0131r. \u00d6rn: <code>\/urunler<\/code>, <code>\/urunler\/123<\/code>.<\/li>\n<li><b>Durum Bilgisi Olmamas\u0131 (Stateless):<\/b> Her istek, sunucunun iste\u011fi i\u015flemek i\u00e7in ihtiya\u00e7 duydu\u011fu t\u00fcm bilgiyi i\u00e7ermelidir. Sunucu, \u00f6nceki isteklerden herhangi bir istemci durumunu saklamaz.<\/li>\n<li><b>Standart Metotlar (Standard Methods):<\/b> HTTP metotlar\u0131 (GET, POST, PUT, DELETE) kaynaklar \u00fczerinde belirli i\u015flemler yapmak i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><b>Temsil (Representation):<\/b> Kaynaklar, JSON, XML veya HTML gibi farkl\u0131 formatlarda temsil edilebilir.<\/li>\n<\/ul>\n<p>Jersey, bu prensipleri Java koduna d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir yap\u0131 sunar.<\/p>\n<h2>Jersey Projesi Kurulumu ve Yap\u0131land\u0131rmas\u0131<\/h2>\n<p>Jersey ile bir RESTful servis geli\u015ftirmeye ba\u015flamadan \u00f6nce, projemizi do\u011fru bir \u015fekilde kurmam\u0131z ve gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 eklememiz gerekir. Bu b\u00f6l\u00fcmde, Maven kullanarak bir Jersey projesi olu\u015fturma ad\u0131mlar\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<h3>\u00d6n Gereksinimler<\/h3>\n<ul>\n<li>JDK (Java Development Kit) 8 veya \u00fczeri<\/li>\n<li>Maven (Proje Y\u00f6netim Arac\u0131)<\/li>\n<li>Tercih edilen bir IDE (IntelliJ IDEA, Eclipse, VS Code)<\/li>\n<li>Bir Servlet Konteyneri (Apache Tomcat, Jetty vb.)<\/li>\n<\/ul>\n<h3>Maven Projesi Olu\u015fturma<\/h3>\n<p>Yeni bir Maven projesi olu\u015fturarak ba\u015flayabiliriz. Komut sat\u0131r\u0131ndan veya IDE&#8217;niz \u00fczerinden &#8220;maven-archetype-webapp&#8221; \u015fablonunu kullanarak bir web uygulamas\u0131 projesi olu\u015fturabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">mvn archetype:generate -DgroupId=com.example -DartifactId=jersey-tutorial -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false<\/code><\/pre>\n<p>Bu komut, <code>jersey-tutorial<\/code> ad\u0131nda yeni bir Maven web projesi olu\u015fturacakt\u0131r.<\/p>\n<h3><code>pom.xml<\/code> Ba\u011f\u0131ml\u0131l\u0131klar\u0131<\/h3>\n<p>Olu\u015fturulan <code>pom.xml<\/code> dosyas\u0131na Jersey ve ilgili ba\u011f\u0131ml\u0131l\u0131klar\u0131 eklememiz gerekiyor. \u00d6zellikle <code>jersey-server<\/code> (JAX-RS API ve \u00e7ekirdek implementasyon) ve <code>jersey-container-servlet<\/code> (Jersey&#8217;nin bir Servlet konteynerinde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayan mod\u00fcl) ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 eklemeliyiz. JSON deste\u011fi i\u00e7in <code>jersey-media-json-jackson<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 da eklemek pratik olacakt\u0131r.<\/p>\n<pre><code class=\"language-xml\"><project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\n         xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0<\/modelVersion>\n    <groupId>com.example<\/groupId>\n    <artifactId>jersey-tutorial<\/artifactId>\n    <packaging>war<\/packaging>\n    <version>1.0-SNAPSHOT<\/version>\n    <name>jersey-tutorial Maven Webapp<\/name>\n    <url>http:\/\/maven.apache.org<\/url>\n\n    <properties>\n        <jersey.version>2.34<\/jersey.version> <!-- G\u00fcncel Jersey s\u00fcr\u00fcm\u00fcn\u00fc kontrol edin -->\n        <project.build.sourceEncoding>UTF-8<\/project.build.sourceEncoding>\n    <\/properties>\n\n    <dependencies>\n        <!-- Jersey Core Server -->\n        <dependency>\n            <groupId>org.glassfish.jersey.core<\/groupId>\n            <artifactId>jersey-server<\/artifactId>\n            <version>${jersey.version}<\/version>\n        <\/dependency>\n        <!-- Jersey Servlet Container -->\n        <dependency>\n            <groupId>org.glassfish.jersey.containers<\/groupId>\n            <artifactId>jersey-container-servlet-core<\/artifactId>\n            <version>${jersey.version}<\/version>\n        <\/dependency>\n        <!-- JSON Deste\u011fi (Jackson) -->\n        <dependency>\n            <groupId>org.glassfish.jersey.media<\/groupId>\n            <artifactId>jersey-media-json-jackson<\/artifactId>\n            <version>${jersey.version}<\/version>\n        <\/dependency>\n        <!-- Servlet API (Gerekliyse, genellikle webapp archetype'\u0131nda gelir) -->\n        <dependency>\n            <groupId>javax.servlet<\/groupId>\n            <artifactId>javax.servlet-api<\/artifactId>\n            <version>3.1.0<\/version>\n            <scope>provided<\/scope>\n        <\/dependency>\n        <!-- JUnit Test Ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 -->\n        <dependency>\n            <groupId>junit<\/groupId>\n            <artifactId>junit<\/artifactId>\n            <version>4.13.2<\/version>\n            <scope>test<\/scope>\n        <\/dependency>\n    <\/dependencies>\n\n    <build>\n        <finalName>jersey-tutorial<\/finalName>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins<\/groupId>\n                <artifactId>maven-compiler-plugin<\/artifactId>\n                <version>3.8.1<\/version>\n                <configuration>\n                    <source>1.8<\/source>\n                    <target>1.8<\/target>\n                <\/configuration>\n            <\/plugin>\n            <!-- Tomcat i\u00e7in WAR deployment plugini (iste\u011fe ba\u011fl\u0131) -->\n            <plugin>\n                <groupId>org.apache.tomcat.maven<\/groupId>\n                <artifactId>tomcat7-maven-plugin<\/artifactId>\n                <version>2.2<\/version>\n                <configuration>\n                    <path>\/${project.build.finalName}<\/path>\n                <\/configuration>\n            <\/plugin>\n        <\/plugins>\n    <\/build>\n<\/project><\/code><\/pre>\n<h3><code>web.xml<\/code> Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>Web uygulaman\u0131z\u0131n <code>src\/main\/webapp\/WEB-INF<\/code> dizini alt\u0131nda bulunan <code>web.xml<\/code> dosyas\u0131, Jersey&#8217;nin Servlet konteyneri taraf\u0131ndan nas\u0131l y\u00fcklenece\u011fini ve hangi URL desenlerini dinleyece\u011fini belirtir. Jersey&#8217;nin <code>ServletContainer<\/code> s\u0131n\u0131f\u0131n\u0131 bir Servlet olarak tan\u0131mlamam\u0131z ve kaynak s\u0131n\u0131flar\u0131m\u0131z\u0131n bulundu\u011fu paketi belirtmemiz gerekir.<\/p>\n<pre><code class=\"language-xml\"><!DOCTYPE web-app PUBLIC\n \"-\/\/Sun Microsystems, Inc.\/\/DTD Web Application 2.3\/\/EN\"\n \"http:\/\/java.sun.com\/dtd\/web-app_2_3.dtd\" >\n\n<web-app>\n    <display-name>Jersey RESTful Web Application<\/display-name>\n\n    <servlet>\n        <servlet-name>jersey-servlet<\/servlet-name>\n        <servlet-class>org.glassfish.jersey.servlet.ServletContainer<\/servlet-class>\n        <init-param>\n            <param-name>jersey.config.server.provider.packages<\/param-name>\n            <param-value>com.example.resources<\/param-value> <!-- Kaynak s\u0131n\u0131flar\u0131n\u0131z\u0131n paketi -->\n        <\/init-param>\n        <load-on-startup>1<\/load-on-startup>\n    <\/servlet>\n\n    <servlet-mapping>\n        <servlet-name>jersey-servlet<\/servlet-name>\n        <url-pattern>\/api\/*<\/url-pattern> <!-- T\u00fcm REST istekleri bu URL deseniyle ba\u015flar -->\n    <\/servlet-mapping>\n\n<\/web-app><\/code><\/pre>\n<p>Yukar\u0131daki yap\u0131land\u0131rmada, <code>jersey.config.server.provider.packages<\/code> parametresi, Jersey&#8217;nin hangi paketlerdeki JAX-RS anotasyonlu s\u0131n\u0131flar\u0131 tarayaca\u011f\u0131n\u0131 belirtir. <code>url-pattern<\/code> ise, <code>\/api\/*<\/code> ile ba\u015flayan t\u00fcm isteklerin Jersey taraf\u0131ndan i\u015flenece\u011fini g\u00f6sterir.<\/p>\n<h2>Temel RESTful Servis Olu\u015fturma<\/h2>\n<p>Art\u0131k projemiz yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131na g\u00f6re, ilk RESTful servislerimizi olu\u015fturmaya ba\u015flayabiliriz. Jersey, JAX-RS anotasyonlar\u0131n\u0131 kullanarak Java s\u0131n\u0131flar\u0131n\u0131 ve metotlar\u0131n\u0131 REST kaynaklar\u0131na d\u00f6n\u00fc\u015ft\u00fcrmeyi son derece kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Kaynak S\u0131n\u0131f\u0131 Olu\u015fturma<\/h3>\n<p><code>com.example.resources<\/code> paketi alt\u0131nda <code>MerhabaServis<\/code> ad\u0131nda bir s\u0131n\u0131f olu\u015ftural\u0131m. Bu s\u0131n\u0131f, <code>@Path<\/code> anotasyonu ile bir URI yoluna e\u015flenecektir.<\/p>\n<pre><code class=\"language-java\">package com.example.resources;\n\nimport javax.ws.rs.GET;\nimport javax.ws.rs.Path;\nimport javax.ws.rs.Produces;\nimport javax.ws.rs.core.MediaType;\n\n@Path(\"\/merhaba\") \/\/ Bu s\u0131n\u0131f\u0131n t\u00fcm metotlar\u0131 \/api\/merhaba alt\u0131nda eri\u015filebilir olacak\npublic class MerhabaServis {\n\n    @GET \/\/ HTTP GET isteklerini kar\u015f\u0131lar\n    @Produces(MediaType.TEXT_PLAIN) \/\/ Yan\u0131t\u0131n d\u00fcz metin format\u0131nda olaca\u011f\u0131n\u0131 belirtir\n    public String getMerhabaMesaji() {\n        return \"Merhaba D\u00fcnya, Jersey'e Ho\u015f Geldiniz!\";\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte:<\/p>\n<ul>\n<li><code>@Path(\"\/merhaba\")<\/code>: Bu s\u0131n\u0131f\u0131n <code>\/api\/merhaba<\/code> URI&#8217;si alt\u0131nda eri\u015filebilir oldu\u011funu belirtir.<\/li>\n<li><code>@GET<\/code>: <code>getMerhabaMesaji<\/code> metodunun HTTP GET isteklerine yan\u0131t verece\u011fini belirtir.<\/li>\n<li><code>@Produces(MediaType.TEXT_PLAIN)<\/code>: Metodun d\u00f6nd\u00fcrd\u00fc\u011f\u00fc yan\u0131t\u0131n <code>text\/plain<\/code> medya tipinde olaca\u011f\u0131n\u0131 belirtir.<\/li>\n<\/ul>\n<h3>HTTP Metotlar\u0131 ve Parametre \u0130\u015fleme<\/h3>\n<p>RESTful servisler, farkl\u0131 HTTP metotlar\u0131n\u0131 (GET, POST, PUT, DELETE) kullanarak kaynaklar \u00fczerinde CRUD (Create, Read, Update, Delete) i\u015flemleri yapar. Ayr\u0131ca, URI&#8217;den veya sorgu parametrelerinden veri alabilirler.<\/p>\n<h4>GET \u0130stekleri ve Parametreler<\/h4>\n<p>GET istekleri genellikle veri okumak i\u00e7in kullan\u0131l\u0131r. <code>@PathParam<\/code> ve <code>@QueryParam<\/code> ile parametreleri yakalayabiliriz.<\/p>\n<pre><code class=\"language-java\">package com.example.resources;\n\nimport javax.ws.rs.*; \/\/ T\u00fcm JAX-RS anotasyonlar\u0131n\u0131 import edelim\nimport javax.ws.rs.core.MediaType;\nimport javax.ws.rs.core.Response; \/\/ HTTP yan\u0131t\u0131n\u0131 \u00f6zelle\u015ftirmek i\u00e7in\n\n@Path(\"\/kullanicilar\")\npublic class KullaniciServis {\n\n    \/\/ GET \/api\/kullanicilar\n    @GET\n    @Produces(MediaType.TEXT_PLAIN)\n    public String getAllKullanicilar() {\n        return \"T\u00fcm kullan\u0131c\u0131lar listeleniyor...\";\n    }\n\n    \/\/ GET \/api\/kullanicilar\/{id}\n    @GET\n    @Path(\"\/{id}\") \/\/ URI yolunda bir parametre tan\u0131mlar\n    @Produces(MediaType.TEXT_PLAIN)\n    public String getKullaniciById(@PathParam(\"id\") int kullaniciId) {\n        return \"ID'si \" + kullaniciId + \" olan kullan\u0131c\u0131 getiriliyor.\";\n    }\n\n    \/\/ GET \/api\/kullanicilar\/ara?ad=Ahmet&soyad=Yilmaz\n    @GET\n    @Path(\"\/ara\")\n    @Produces(MediaType.TEXT_PLAIN)\n    public String searchKullanicilar(@QueryParam(\"ad\") String ad,\n                                     @QueryParam(\"soyad\") String soyad) {\n        return \"Ad\u0131: \" + ad + \", Soyad\u0131: \" + soyad + \" olan kullan\u0131c\u0131lar aran\u0131yor.\";\n    }\n}<\/code><\/pre>\n<ul>\n<li><code>@PathParam(\"id\")<\/code>: URI yolundaki <code>{id}<\/code> k\u0131sm\u0131n\u0131 <code>kullaniciId<\/code> int de\u011fi\u015fkenine e\u015fler.<\/li>\n<li><code>@QueryParam(\"ad\")<\/code>: URI sorgu parametrelerindeki <code>ad<\/code> de\u011ferini <code>ad<\/code> String de\u011fi\u015fkenine e\u015fler.<\/li>\n<\/ul>\n<h4>POST \u0130stekleri ve Veri G\u00f6nderme<\/h4>\n<p>POST istekleri genellikle yeni bir kaynak olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. <code>@Consumes<\/code> anotasyonu, metodun hangi medya tipindeki veriyi kabul etti\u011fini belirtir.<\/p>\n<pre><code class=\"language-java\">package com.example.resources;\n\nimport javax.ws.rs.*;\nimport javax.ws.rs.core.MediaType;\nimport javax.ws.rs.core.Response;\n\n@Path(\"\/urunler\")\npublic class UrunServis {\n\n    \/\/ POST \/api\/urunler\n    @POST\n    @Consumes(MediaType.TEXT_PLAIN) \/\/ \u0130stek g\u00f6vdesinde d\u00fcz metin bekler\n    @Produces(MediaType.TEXT_PLAIN) \/\/ Yan\u0131t\u0131n d\u00fcz metin olaca\u011f\u0131n\u0131 belirtir\n    public Response createUrun(String urunAdi) {\n        \/\/ Veritaban\u0131na \u00fcr\u00fcn ekleme i\u015flemi sim\u00fcle ediliyor\n        System.out.println(\"Yeni \u00fcr\u00fcn olu\u015fturuldu: \" + urunAdi);\n        return Response.status(Response.Status.CREATED) \/\/ 201 Created HTTP durumu d\u00f6ner\n                       .entity(\"\u00dcr\u00fcn ba\u015far\u0131yla olu\u015fturuldu: \" + urunAdi)\n                       .build();\n    }\n}<\/code><\/pre>\n<ul>\n<li><code>@POST<\/code>: Metodun HTTP POST isteklerine yan\u0131t verece\u011fini belirtir.<\/li>\n<li><code>@Consumes(MediaType.TEXT_PLAIN)<\/code>: \u0130stek g\u00f6vdesinin <code>text\/plain<\/code> format\u0131nda olmas\u0131 gerekti\u011fini belirtir.<\/li>\n<li><code>Response.status(Response.Status.CREATED).entity(...).build()<\/code>: \u00d6zel bir HTTP yan\u0131t\u0131 olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. Bu, 201 Created durum koduyla bir yan\u0131t d\u00f6nd\u00fcr\u00fcr.<\/li>\n<\/ul>\n<h2>Veri Modelleri ve JSON\/XML Entegrasyonu<\/h2>\n<p>Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, genellikle basit String veya int de\u011ferler yerine daha karma\u015f\u0131k veri yap\u0131lar\u0131 (POJO&#8217;lar) ile \u00e7al\u0131\u015f\u0131r\u0131z. Jersey, bu POJO&#8217;lar\u0131 otomatik olarak JSON veya XML gibi formatlara d\u00f6n\u00fc\u015ft\u00fcrmek (serile\u015ftirme) ve bu formatlardan POJO&#8217;lara geri d\u00f6n\u00fc\u015ft\u00fcrmek (deserile\u015ftirme) i\u00e7in g\u00fc\u00e7l\u00fc bir destek sunar.<\/p>\n<h3>POJO (Plain Old Java Object) Olu\u015fturma<\/h3>\n<p>\u00d6ncelikle, temsil etmek istedi\u011fimiz veri i\u00e7in bir POJO olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-java\">package com.example.model;\n\nimport javax.xml.bind.annotation.XmlRootElement; \/\/ XML deste\u011fi i\u00e7in\n\n@XmlRootElement \/\/ Bu anotasyon, JAXB'nin bu s\u0131n\u0131f\u0131 XML'e d\u00f6n\u00fc\u015ft\u00fcrmesine yard\u0131mc\u0131 olur\npublic class Urun {\n    private int id;\n    private String ad;\n    private double fiyat;\n\n    public Urun() {\n        \/\/ Varsay\u0131lan kurucu metot, JSON\/XML serile\u015ftirme i\u00e7in gereklidir\n    }\n\n    public Urun(int id, String ad, double fiyat) {\n        this.id = id;\n        this.ad = ad;\n        this.fiyat = fiyat;\n    }\n\n    \/\/ Getter ve Setter metotlar\u0131\n    public int getId() { return id; }\n    public void setId(int id) { this.id = id; }\n    public String getAd() { return ad; }\n    public void setAd(String ad) { this.ad = ad; }\n    public double getFiyat() { return fiyat; }\n    public void setFiyat(double fiyat) { this.fiyat = fiyat; }\n\n    @Override\n    public String toString() {\n        return \"Urun{\" +\n               \"id=\" + id +\n               \", ad='\" + ad + '\\'' +\n               \", fiyat=\" + fiyat +\n               '}';\n    }\n}<\/code><\/pre>\n<p><code>@XmlRootElement<\/code> anotasyonu, bu POJO&#8217;nun XML format\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcrken k\u00f6k element olarak kullan\u0131labilece\u011fini belirtir. JSON i\u00e7in genellikle varsay\u0131lan kurucu metot ve getter\/setter&#8217;lar yeterlidir (Jackson k\u00fct\u00fcphanesi taraf\u0131ndan kullan\u0131l\u0131r).<\/p>\n<h3>JSON Deste\u011fi ile POJO Kullan\u0131m\u0131<\/h3>\n<p><code>pom.xml<\/code> dosyam\u0131za <code>jersey-media-json-jackson<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 ekledi\u011fimiz i\u00e7in, Jersey otomatik olarak Jackson k\u00fct\u00fcphanesini kullanarak POJO&#8217;lar\u0131 JSON&#8217;a serile\u015ftirecek ve JSON&#8217;dan POJO&#8217;lara deseralize edecektir.<\/p>\n<pre><code class=\"language-java\">package com.example.resources;\n\nimport com.example.model.Urun;\nimport javax.ws.rs.*;\nimport javax.ws.rs.core.MediaType;\nimport javax.ws.rs.core.Response;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicInteger;\n\n@Path(\"\/urunler\")\npublic class UrunKaynak {\n\n    \/\/ Basit bir bellek i\u00e7i depolama\n    private static List<Urun> urunler = new ArrayList<>();\n    private static AtomicInteger idCounter = new AtomicInteger();\n\n    static {\n        urunler.add(new Urun(idCounter.incrementAndGet(), \"Laptop\", 1200.00));\n        urunler.add(new Urun(idCounter.incrementAndGet(), \"Mouse\", 25.00));\n    }\n\n    \/\/ GET \/api\/urunler\n    @GET\n    @Produces(MediaType.APPLICATION_JSON) \/\/ JSON format\u0131nda yan\u0131t d\u00f6nd\u00fcr\u00fcr\n    public List<Urun> getAllUrunler() {\n        return urunler;\n    }\n\n    \/\/ GET \/api\/urunler\/{id}\n    @GET\n    @Path(\"\/{id}\")\n    @Produces(MediaType.APPLICATION_JSON)\n    public Response getUrunById(@PathParam(\"id\") int id) {\n        for (Urun urun : urunler) {\n            if (urun.getId() == id) {\n                return Response.ok(urun).build(); \/\/ 200 OK ile \u00fcr\u00fcn\u00fc d\u00f6nd\u00fcr\n            }\n        }\n        return Response.status(Response.Status.NOT_FOUND).entity(\"\u00dcr\u00fcn bulunamad\u0131.\").build(); \/\/ 404 Not Found\n    }\n\n    \/\/ POST \/api\/urunler\n    @POST\n    @Consumes(MediaType.APPLICATION_JSON) \/\/ \u0130stek g\u00f6vdesinde JSON bekler\n    @Produces(MediaType.APPLICATION_JSON)\n    public Response createUrun(Urun yeniUrun) {\n        yeniUrun.setId(idCounter.incrementAndGet());\n        urunler.add(yeniUrun);\n        System.out.println(\"Yeni \u00fcr\u00fcn eklendi: \" + yeniUrun);\n        return Response.status(Response.Status.CREATED).entity(yeniUrun).build(); \/\/ 201 Created ile olu\u015fturulan \u00fcr\u00fcn\u00fc d\u00f6nd\u00fcr\n    }\n\n    \/\/ PUT \/api\/urunler\/{id}\n    @PUT\n    @Path(\"\/{id}\")\n    @Consumes(MediaType.APPLICATION_JSON)\n    @Produces(MediaType.APPLICATION_JSON)\n    public Response updateUrun(@PathParam(\"id\") int id, Urun guncelUrun) {\n        for (int i = 0; i < urunler.size(); i++) {\n            if (urunler.get(i).getId() == id) {\n                guncelUrun.setId(id); \/\/ ID'nin de\u011fi\u015fmedi\u011finden emin ol\n                urunler.set(i, guncelUrun);\n                System.out.println(\"\u00dcr\u00fcn g\u00fcncellendi: \" + guncelUrun);\n                return Response.ok(guncelUrun).build(); \/\/ 200 OK ile g\u00fcncellenen \u00fcr\u00fcn\u00fc d\u00f6nd\u00fcr\n            }\n        }\n        return Response.status(Response.Status.NOT_FOUND).entity(\"G\u00fcncellenecek \u00fcr\u00fcn bulunamad\u0131.\").build();\n    }\n\n    \/\/ DELETE \/api\/urunler\/{id}\n    @DELETE\n    @Path(\"\/{id}\")\n    @Produces(MediaType.TEXT_PLAIN)\n    public Response deleteUrun(@PathParam(\"id\") int id) {\n        boolean removed = urunler.removeIf(urun -> urun.getId() == id);\n        if (removed) {\n            System.out.println(\"\u00dcr\u00fcn silindi: ID \" + id);\n            return Response.ok(\"\u00dcr\u00fcn ba\u015far\u0131yla silindi.\").build(); \/\/ 200 OK\n        }\n        return Response.status(Response.Status.NOT_FOUND).entity(\"Silinecek \u00fcr\u00fcn bulunamad\u0131.\").build();\n    }\n}<\/code><\/pre>\n<p>Bu <code>UrunKaynak<\/code> s\u0131n\u0131f\u0131, <code>Urun<\/code> POJO&#8217;lar\u0131n\u0131 kullanarak tam bir CRUD (Create, Read, Update, Delete) operasyonlar\u0131n\u0131 JSON format\u0131nda nas\u0131l ger\u00e7ekle\u015ftirebilece\u011fimizi g\u00f6sterir.<\/p>\n<h2>Jersey Uygulamas\u0131n\u0131 \u00c7al\u0131\u015ft\u0131rma ve Test Etme<\/h2>\n<p>Servislerimizi kodlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi bunlar\u0131 bir Servlet konteynerinde \u00e7al\u0131\u015ft\u0131rma ve test etme zaman\u0131.<\/p>\n<h3>Uygulama Sunucusu (Servlet Konteyneri) Kullan\u0131m\u0131<\/h3>\n<p>En yayg\u0131n y\u00f6ntem, uygulamay\u0131 bir WAR (Web Application Archive) dosyas\u0131 olarak paketleyip Apache Tomcat veya Jetty gibi bir uygulama sunucusuna da\u011f\u0131tmakt\u0131r.<\/p>\n<p>1.  <b>WAR Dosyas\u0131 Olu\u015fturma:<\/b> Projenizin k\u00f6k dizininde a\u015fa\u011f\u0131daki Maven komutunu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">mvn clean package<\/code><\/pre>\n<p>    Bu komut, <code>target<\/code> klas\u00f6r\u00fcnde <code>jersey-tutorial.war<\/code> (veya <code>pom.xml<\/code>&#8216;deki <code>finalName<\/code> neyse o) ad\u0131nda bir WAR dosyas\u0131 olu\u015fturacakt\u0131r.<\/p>\n<p>2.  <b>WAR Dosyas\u0131n\u0131 Da\u011f\u0131tma:<\/b> Olu\u015fturulan WAR dosyas\u0131n\u0131 Tomcat&#8217;in <code>webapps<\/code> dizinine kopyalay\u0131n ve Tomcat&#8217;i ba\u015flat\u0131n. Tomcat otomatik olarak uygulamay\u0131 da\u011f\u0131tacakt\u0131r.<\/p>\n<p>3.  <b>Maven Tomcat Plugin ile \u00c7al\u0131\u015ft\u0131rma (Geli\u015ftirme Ortam\u0131 \u0130\u00e7in):<\/b> <code>pom.xml<\/code>&#8216;e ekledi\u011fimiz <code>tomcat7-maven-plugin<\/code>&#8216;i kullanarak do\u011frudan Maven \u00fczerinden uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">mvn tomcat7:run<\/code><\/pre>\n<p>    Bu, Tomcat&#8217;i g\u00f6m\u00fcl\u00fc olarak ba\u015flatacak ve uygulaman\u0131z\u0131 da\u011f\u0131tacakt\u0131r. Varsay\u0131lan olarak, uygulaman\u0131z <code>http:\/\/localhost:8080\/jersey-tutorial<\/code> adresinde eri\u015filebilir olacakt\u0131r.<\/p>\n<h3>Servisi Test Etme<\/h3>\n<p>Servislerinizi test etmek i\u00e7in Postman, Insomnia gibi GUI tabanl\u0131 ara\u00e7lar\u0131 veya cURL gibi komut sat\u0131r\u0131 ara\u00e7lar\u0131n\u0131 kullanabilirsiniz.<\/p>\n<p>Varsay\u0131lan olarak, uygulaman\u0131z <code>http:\/\/localhost:8080\/jersey-tutorial<\/code> alt\u0131nda \u00e7al\u0131\u015f\u0131yorsa ve <code>web.xml<\/code>&#8216;deki <code>url-pattern<\/code> <code>\/api\/*<\/code> ise, servisleriniz <code>http:\/\/localhost:8080\/jersey-tutorial\/api\/...<\/code> adresinde olacakt\u0131r.<\/p>\n<h4>GET \u0130stekleri<\/h4>\n<pre><code class=\"language-bash\">\n<h2>T\u00fcm \u00fcr\u00fcnleri getir<\/h2>\ncurl http:\/\/localhost:8080\/jersey-tutorial\/api\/urunler\n\n<h2>ID'si 1 olan \u00fcr\u00fcn\u00fc getir<\/h2>\ncurl http:\/\/localhost:8080\/jersey-tutorial\/api\/urunler\/1\n<\/code><\/pre>\n<h4>POST \u0130stekleri (JSON ile Yeni \u00dcr\u00fcn Olu\u015fturma)<\/h4>\n<pre><code class=\"language-bash\">\ncurl -X POST \\\n  http:\/\/localhost:8080\/jersey-tutorial\/api\/urunler \\\n  -H 'Content-Type: application\/json' \\\n  -d '{\n    \"ad\": \"Klavye\",\n    \"fiyat\": 75.50\n  }'\n<\/code><\/pre>\n<h4>PUT \u0130stekleri (JSON ile \u00dcr\u00fcn G\u00fcncelleme)<\/h4>\n<pre><code class=\"language-bash\">\ncurl -X PUT \\\n  http:\/\/localhost:8080\/jersey-tutorial\/api\/urunler\/1 \\\n  -H 'Content-Type: application\/json' \\\n  -d '{\n    \"id\": 1,\n    \"ad\": \"Kablosuz Klavye\",\n    \"fiyat\": 99.99\n  }'\n<\/code><\/pre>\n<h4>DELETE \u0130stekleri<\/h4>\n<pre><code class=\"language-bash\">\ncurl -X DELETE \\\n  http:\/\/localhost:8080\/jersey-tutorial\/api\/urunler\/2\n<\/code><\/pre>\n<p>Bu komutlar\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, konsolunuzda veya HTTP istemcinizde beklenen JSON yan\u0131tlar\u0131n\u0131 veya d\u00fcz metin mesajlar\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<p>Bu rehberde, Jersey kullanarak temel bir RESTful web servisinin nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131, yap\u0131land\u0131r\u0131laca\u011f\u0131n\u0131 ve test edilece\u011fini \u00f6\u011frendiniz. Jersey, JAX-RS standartlar\u0131n\u0131 takip ederek Java&#8217;da RESTful uygulamalar geli\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc, esnek ve standartlara uygun bir yol sunar. POJO&#8217;lar\u0131 JSON\/XML&#8217;e d\u00f6n\u00fc\u015ft\u00fcrme yetene\u011fi ve basit anotasyon tabanl\u0131 yakla\u015f\u0131m\u0131 sayesinde, veri odakl\u0131 servisleri h\u0131zl\u0131ca olu\u015fturabilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><b>S1: Jersey&#8217;i Spring REST ile kar\u015f\u0131la\u015ft\u0131r\u0131rsak, hangisini se\u00e7meliyim?<\/b><br \/>\n<b>C1:<\/b> Jersey, JAX-RS&#8217;in referans implementasyonudur ve saf bir JAX-RS deneyimi sunar. Spring REST (Spring WebFlux veya Spring MVC ile), Spring ekosisteminin bir par\u00e7as\u0131d\u0131r ve Spring&#8217;in di\u011fer mod\u00fclleri (Dependency Injection, Data JPA vb.) ile sorunsuz entegrasyon sa\u011flar. E\u011fer projeniz zaten Spring tabanl\u0131ysa veya geni\u015f bir ekosistem ar\u0131yorsan\u0131z Spring REST daha uygun olabilir. Sadece JAX-RS standartlar\u0131na ba\u011fl\u0131 kalmak istiyorsan\u0131z Jersey m\u00fckemmel bir se\u00e7imdir.<\/p>\n<p><b>S2: JAX-RS tam olarak nedir ve Jersey&#8217;nin rol\u00fc ne?<\/b><br \/>\n<b>C2:<\/b> JAX-RS (Java API for RESTful Web Services), Java EE&#8217;nin bir par\u00e7as\u0131 olan, RESTful web servisleri olu\u015fturmak i\u00e7in bir standart API&#8217;dir. Geli\u015ftiricilerin RESTful servisleri yazmak i\u00e7in kullanacaklar\u0131 anotasyonlar\u0131 ve aray\u00fczleri tan\u0131mlar. Jersey ise bu JAX-RS API&#8217;sinin bir implementasyonudur. Yani JAX-RS &#8220;ne yap\u0131lmas\u0131 gerekti\u011fini&#8221; s\u00f6yler, Jersey ise &#8220;nas\u0131l yap\u0131laca\u011f\u0131n\u0131&#8221; g\u00f6sterir ve sa\u011flar.<\/p>\n<p><b>S3: Jersey uygulamalar\u0131nda g\u00fcvenlik nas\u0131l sa\u011flan\u0131r?<\/b><\/p>\n","protected":false},"excerpt":{"rendered":"Giri\u015f: Jersey ve RESTful Web Servisleri\nModern web uygulamalar\u0131n\u0131n bel kemi\u011fini olu\u015fturan RESTful mimari, kaynak tabanl\u0131, durum bilgisi olmay","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-34054","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Giri\u015f: Jersey ve RESTful Web Servisleri - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Giri\u015f: Jersey ve RESTful Web Servisleri\" \/>\n<meta property=\"og:description\" content=\"Giri\u015f: Jersey ve RESTful Web Servisleri Modern web uygulamalar\u0131n\u0131n bel kemi\u011fini olu\u015fturan RESTful mimari, kaynak tabanl\u0131, durum bilgisi olmay\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-10T09:41:48+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Giri\u015f: Jersey ve RESTful Web Servisleri\",\"datePublished\":\"2025-11-10T09:41:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/\"},\"wordCount\":1524,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/\",\"name\":\"Giri\u015f: Jersey ve RESTful Web Servisleri - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-10T09:41:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Giri\u015f: Jersey ve RESTful Web Servisleri\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Giri\u015f: Jersey ve RESTful Web Servisleri - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/","og_locale":"tr_TR","og_type":"article","og_title":"Giri\u015f: Jersey ve RESTful Web Servisleri","og_description":"Giri\u015f: Jersey ve RESTful Web Servisleri Modern web uygulamalar\u0131n\u0131n bel kemi\u011fini olu\u015fturan RESTful mimari, kaynak tabanl\u0131, durum bilgisi olmay","og_url":"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-10T09:41:48+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Giri\u015f: Jersey ve RESTful Web Servisleri","datePublished":"2025-11-10T09:41:48+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/"},"wordCount":1524,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/","url":"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/","name":"Giri\u015f: Jersey ve RESTful Web Servisleri - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-10T09:41:48+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/giris-jersey-ve-restful-web-servisleri\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Giri\u015f: Jersey ve RESTful Web Servisleri"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34054","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34054"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34054\/revisions"}],"predecessor-version":[{"id":34055,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34054\/revisions\/34055"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34054"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34054"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34054"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}