Slide 1

Slide 1 text

JAX-RS ile RESTful Java Web Servisleri Murat Kemal BAYGÜN Lab2023 Bilişim Teknolojileri AŞ - COO www.lab2023.com [email protected] @baygunm

Slide 2

Slide 2 text

Bu sunumda ● Web Servisi ● REST ● RESTful ● JAX-RS Hakkında ● JAX-RS Kullanım Örnekleri

Slide 3

Slide 3 text

Sırada ● Web Servisi ● REST ● RESTful ● JAX-RS Hakkında ● JAX-RS Kullanım Örnekleri

Slide 4

Slide 4 text

Web Servisi W3C, web servisini, ‘bir ağ üzerinde birlikte çalışan; makine makine etkileşimini desteklemek üzere tasarlanmış yazılım sistemi’ olarak tanımlamıştır.

Slide 5

Slide 5 text

Web Servisi Bir başka deyişle ise, Web’e bağlı uygulamalara, bir web sunucusu üzerinden program veya veri kombinasyonu sağlayan servislerdir denebilir.

Slide 6

Slide 6 text

Sırada ● Web Servisi ● REST ● RESTful ● JAX-RS Hakkında ● JAX-RS Kullanım Örnekleri

Slide 7

Slide 7 text

REST REST = REpresentational State Transfer Amerikalı Bilgisayar Bilimci Roy Thomas Fielding 2000 yılında Doktora Tezi

Slide 8

Slide 8 text

REST REST Mimarisi Web servislerinin geliştirilmesi için de uygulanmıştır Mimari bir stildir Kaynak bazlıdır Gösterimleri destekler

Slide 9

Slide 9 text

REST - Kaynak Bazlıdır Eylem değil Nesne Fiil değil İsim Ürün Kaynağı - Product Resource URIlerle tanımlanır http://www.example.com/urunler http://www.example.com/products

Slide 10

Slide 10 text

REST - Gösterimler Kaynak durumunun sunucu istemci arasında transferi En yaygın JSON ve XML (CSV, HTML vs.)

Slide 11

Slide 11 text

Sırada ● Web Servisi ● REST ● RESTful ● JAX-RS Hakkında ● JAX-RS Kullanım Örnekleri

Slide 12

Slide 12 text

RESTful Bir Web servisine RESTful diyebilmek için şu mimari kısıtları sağlıyor olması gerekli ● Değişmeyen Arayüz - Uniform Interface ● İstemci - Sunucu / Client - Server ● Durumsuz - Stateless ● Önbelleklenebilir - Cacheable ● Katmanlı Sistem - Layered System ● Talebe bağlı kod - Code On Demand (İsteğe bağlı)

Slide 13

Slide 13 text

RESTful - Değişmeyen Arayüz REST Servis tasarımının temelidir. İstemci ve Sunucu arasındaki arayüzü tanımlar Mimariyi sadeleştirir ve ayrıştırır İşlem HTTP eylemleri ile iletilir İstek URI ile yapılır HTTP cevabı döndürür

Slide 14

Slide 14 text

RESTful - Değişmeyen Arayüz HTTP eylemleri Create Post Read Get Update Put Destroy Delete URI: http://www.example.com/urunler

Slide 15

Slide 15 text

RESTful - Değişmeyen Arayüz HTTP Eylemi Tüm koleksiyon (/urunler) Belirli bir nesne (/urunler/:id) GET 200 OK - Tüm ürünlerin listesi 200 OK - tek ürün 404 Not Found - Verilen id yok veya geçersiz ise PUT 404 Not Found - Tüm koleksiyonu güncelleme istenmiyorsa 200 OK veya 204 No Content 404 Not Found - Verilen id yok veya geçersiz ise POST 201 Created 404 Not found DELETE 404 Not found - Tüm koleksiyonu silme istenen bir durum değil 200 OK 404 Not Found - Verilen id yok veya geçersiz ise

Slide 16

Slide 16 text

Sırada ● Web Servisi ● REST ● RESTful ● JAX-RS Hakkında ● JAX-RS Kullanım Örnekleri

Slide 17

Slide 17 text

JAX-RS Hakkında JAX-RS, RESTful Web Servisleri için Java API’sidir. JAX-RS Versiyon 1.1 ile birlikte resmi olarak Java EE 6’nın bir parçası olmuştur. JAX-RS bir kaynak sınıfını web kaynağı olarak eşleştirmeyi sağlar, bunun için ise bazı annotation’lar (belirtimler) kullanır

Slide 18

Slide 18 text

JAX-RS Hakkında Java EE 7 ile birlikte JAX-RS Versiyon 2.0 sunulmuştur Java EE 8 ile birlikte JAX-RS Versiyon 2.1 sunulması planlanmaktadır

Slide 19

Slide 19 text

@Path - Kaynak sınıf veya metodu için göreceli yolu belirtir HTTP eylemleri @GET - Read @PUT - Update @POST - Create @DELETE - Destroy JAX-RS Hakkında - Belirtimler

Slide 20

Slide 20 text

JAX-RS Hakkında - Belirtimler @Produces - Bir kaynağın üretebileceği ve istemciye geri gönderebileceği gösterim medya tiplerini belirtmek için kullanılır @Consumes - İstemci tarafından gönderilen; sunucunun kaynak için gösterim olarak beklediği, kabul ettiği medya tipini belirtir

Slide 21

Slide 21 text

@PathParam - metod parametresini yoldaki bir kısma bağlar @QueryParam - metod parametresini HTTP sorgu parametrenin değerine bağlar @ApplicationPath - Uygulamanın URL eşleştirmesini belirtmek için kullanlır JAX-RS Hakkında - Belirtimler

Slide 22

Slide 22 text

Satış Uygulaması - @ApplicationPath = /sales Sipariş Kaynağı - @Path = /orders http://www.example.com/sales/orders İnsan Kaynakları Uygulaması - @ApplicationPath = /hr Çalışan Kaynağı - @Path = /employees http://www.example.com/hr/employees JAX-RS Hakkında - Belirtimler

Slide 23

Slide 23 text

Sırada ● Web Servisi ● REST ● RESTful ● JAX-RS Hakkında ● JAX-RS Kullanım Örnekleri

Slide 24

Slide 24 text

JAX-RS Kullanım Örnekleri HumanResourcesApplication.java @ApplicationPath("/hr") public class HumanResourcesApplication extends Application { @Override public Set> getClasses() { Set> classes = new HashSet>(); classes.add(Employee.class); classes.add(LeaveRequest.class); classes.add(TravelRequest.class); return classes; } }

Slide 25

Slide 25 text

JAX-RS Kullanım Örnekleri Employee.java @Path(value="/employees") public class Employee extends BaseResource { public Employee() { super(); // Make needed initialization } ... }

Slide 26

Slide 26 text

JAX-RS Kullanım Örnekleri BaseResource.java @GET @Produces(value = "text/plain, application/json") public String getList(@Context UriInfo ui) { MultivaluedMap queryParams = ui.getQueryParameters(); String results = getResults(queryParams); return results; }

Slide 27

Slide 27 text

JAX-RS Kullanım Örnekleri BaseResource.java @GET @Produces(value = "text/plain") @Path(value = "{id}") public String getById(@QueryParam("user") String user, @QueryParam("locale") String locale, @PathParam("id") int id) { UserInfo userInfo = new UserInfo(locale, user); BaseDVO record = getEmptyRecordById(id); if (id > 0) { BaseBO boObject = getBOInstance(userInfo); boObject.getRecord(record); } return convertToJson(record); }

Slide 28

Slide 28 text

JAX-RS Kullanım Örnekleri BaseResource.java @PUT public Response update(String json) { Response retVal = null; BaseInfo info = convertToInfo(json); BaseBO boObject = getBOInstance(info.getUserInfo()); if(boObject.updateRecord(getRecord(info))) { retVal = Response.status(Response.Status.OK) .entity(boObject.getMessages()).build(); } else { retVal = Response.status(Response.Status.NOT_ACCEPTABLE) .entity(boObject.getMessages()).build(); } return retVal; }

Slide 29

Slide 29 text

JAX-RS Kullanım Örnekleri Note.java @POST @Consumes(MediaType.MULTIPART_FORM_DATA) public Response upload(BufferedInMultiPart bimp) { Response retVal; NoteInfo noteInfo = parseNoteInfo(bimp); ... boolean success = noteBo.insertRecord(note); if(success) { retVal = Response.status(Response.Status.CREATED) .entity(noteBo.getMessages()).build(); } else { retVal = Response.status(Response.Status.NOT_ACCEPTABLE) .entity(noteBo.getMessages()).build(); } return retVal; }

Slide 30

Slide 30 text

JAX-RS Kullanım Örnekleri Note.java @DELETE @Path(value = "{id}") public Response delete(@QueryParam("user") String user, @QueryParam("locale") String locale, @PathParam("id") int id) { Response retVal = null; UserInfo userInfo = new UserInfo(locale, user); NoteDVO note = (NoteDVO) getEmptyRecordById(id); NoteBO noteBo = new NoteBO(userInfo.getLocale()); if(noteBo.deleteRecord(note)) { retVal = Response.status(Response.Status.OK).build(); } else { retVal = Response.status(Response.Status.NOT_ACCEPTABLE).build(); } return retVal; }

Slide 31

Slide 31 text

● Roy Thomas Fielding - Doktora Tezi ○ http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm ● Java EE7 Dokümantasyonu - JAX-RS ile Web Servisleri İnşaası ○ https://docs.oracle.com/javaee/7/tutorial/jaxrs.htm ● JSR 339: JAX-RS 2.0: RESTful Web Servisleri için Java APIsi ○ https://jcp.org/en/jsr/detail?id=339 ● JSR 339: JAX-RS 2.0 API Şartnamesi (Rev a) ○ https://jax-rs-spec.java.net/nonav/2.0-rev-a/apidocs/index.html ● JSR 370: JAX-RS 2.1 API Şartnamesi ○ https://jcp.org/en/jsr/detail?id=370 Kaynaklar

Slide 32

Slide 32 text

Lab2023 ve Açık Kaynakları ● Lab2023 Web Sitesi ve Blog ○ www.lab2023.com ○ www.lab2023.com/blog ● Lab2023 GitHub Organizasyonu ○ github.com/lab2023 ● Kebab Project - Agile toolbox for developers ○ kebab-project.org

Slide 33

Slide 33 text

Açık Kaynağı Seviyor ve Destekliyoruz