HTTPCLIENT4 (WORKING WITH RESPONSE HEADER)

       Herkese merhaba.Bu yazımızda http response mesajımızın başlığı üzerinde çalışacağız.Bir response mesajı oluşturup bu mesajımıza bir başlıklar ekleyip bu başlıkları farklı şekillerde görüntüleyeceğiz.Hadi başlayalım.



Burada bir response paketi oluşturup bu pakete 2 başlık ekledik.İki cookie.Daha sonra bu başlıkları getirdik.








Daha sonra bunu bir iterator yardımı ile yaptık.Yani 20 tane cookie başlığımız olsa 20'sini de çekecek.


 Ve son olarak bu çerezleri parametre olarak çektik.Bu şekilde gelen paramatrelere göre işlemler yaptırabilir üzerlerinde daha kolay çalışabilir.

İYİ ÇALIŞMALAR...

HTTPCLIENT4 (REQUEST && RESPONSE)

      Herkese merhaba.Bu yazımızda httpclient ile bir URI oluşturup http get metodu ile request mesajımızı oluşturacağız.Aynı şekilde basit bir response mesajı oluşturup bu mesajı ayrıntılı yazdıracağız.Kodlarımıza bakalım.


Burada java.net kütüphanesini kullanarak bir URI oluşturduk.Scheme'ye http host'a www.google.com dedik.Daha sonra bir path belirleyip parametrelerimizi girdik(key,value şeklinde QueryParam) finally httpget ile request mesajımızı gerçekleyip URI'mizi ekrana bastık.:) 

Aynı şekilde basit bir response mesajı oluşturup (version,status,mesaj) bu satırı parça parça ekrana bastık.İYİ ÇALIŞMALAR...

JAX-RS (ENTITY PROVIDERS-YAML)

         Bu yazımızda java nesnelerini YAML formatına veya YAML formatını java nesnelerine dönüştüreceğiz.Herhangi bir dilde yazılmış nesneler,YAML formatında tutulabiliriz.Üstelik YAML configrasyon dosyalarında kullanılan XML veya JSON yerine de tercih edilebilir.YAML formatı insanlar tarafından kolay okunabilmesinin yanında kolaylıkla yazılabilir.Şimdi entity provider'ı nasıl kullanacağımıza ve YAML formatındaki dönüşümleri inceleyelim.Bunun için pom.xml dosyamıza YAML bağımlılığını eklemeliyiz.


Kaynak 
Kaynak
Şekiller de gördüğünüz gibi.Resimlerin üzerine tıklayarak kaynağa gidebilirsiniz.
Şimdi de Java'da yazdığımız kodları adım adım yorumlayalım.

package com.mycompany.yamlentityprovider;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("employees")
public class EmployeeResource {
private static Set<Employee> employees=new HashSet<>();
@PUT
@Consumes("application/yaml")
@Path("/{newId}")
public String create (Employee employee,@PathParam("newId") long newId){
employee.setId(Long.valueOf(newId));
if(employees.contains(employee)){
throw new RuntimeException("Employee with id already exists :"+newId);
}
employees.add(employee);
return "Msg: employee created for id : "+newId;
}
@GET
@Produces(MediaType.TEXT_PLAIN)
public List<Employee> list(){
return new ArrayList<>(employees);
}
@DELETE
public void deleteAll(){
employees.clear();
}
}
view raw Gokhan hosted with ❤ by GitHub
package com.mycompany.yamlentityprovider;
import java.util.Objects;
public class Employee {
private long id;
private String name;
private String dept;
@Override
public boolean equals(Object o){
if(this==o)return true;
if(o==null || getClass()!=o.getClass())return false;
Employee employee=(Employee) o;
return id==employee.id;
}
@Override
public int hashCode(){
return Objects.hash(id);
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
}
view raw Gokhan hosted with ❤ by GitHub




EmployeeResource ve Employee sınıflarımızda kayda değer birşey yok.Daha önce öğrendiğimiz ek açıklamalar ile basit bir servis yazılmış.Dikkat edilecek tek yer, @Consume("application/yaml") olarak belirtilmiş.
package com.mycompany.yamlentityprovider;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Scanner;
import org.yaml.snakeyaml.Yaml;
@Provider
@Consumes({"application/yaml", MediaType.TEXT_PLAIN})
@Produces({"application/yaml", MediaType.TEXT_PLAIN})
public class YamlEntityProvider<T> implements MessageBodyWriter<T>, MessageBodyReader<T> {
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations,
MediaType mediaType) {
return true;
}
@Override
public T readFrom(Class<T> type, Type genericType, Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
throws IOException, WebApplicationException {
Yaml yaml = new Yaml();
T t = yaml.loadAs(toString(entityStream), type);
return t;
}
public static String toString(InputStream inputStream) {
return new Scanner(inputStream, "UTF-8")
.useDelimiter("\\A").next();
}
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations,
MediaType mediaType) {
return true;
}
@Override
public long getSize(T t, Class<?> type, Type genericType, Annotation[] annotations,
MediaType mediaType) {
return -1;
}
@Override
public void writeTo(T t, Class<?> type, Type genericType, Annotation[] annotations,
MediaType mediaType, MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException, WebApplicationException {
Yaml yaml = new Yaml();
OutputStreamWriter writer = new OutputStreamWriter(entityStream);
yaml.dump(t, writer);
writer.close();
}
}
view raw Gokhan hosted with ❤ by GitHub









Gördüğünüz gibi YamlEntityProvider<T> adında bir entity class'ımız mevcut.Entity classlarının kullanım amaçlarından biride o sınıfta kullanılacak veri tipinin sabit olmasıdır.Buna bağlı olarak güvelik seviyesi de artıyor.Implement ettiğimiz interface'teki fonksiyonları override etme zorunluluğunuz olduğunu biliyorsunuzdur.İşte bu yüzden bu interface'teki fonksiyonlar override ettik.Bu sınıfın provider olduğu açıklanmış ve @Produces ve @Consumes ile girdi çıktı işlemlerinin formatları belirlenmiş.Override edilmiş fonksiyonlarda okuma,yazma ve kontrol işlemlerini yaptık.Burada javanın input/output sınıfından yararlandık.Client sınıfımızda ise get,put ve delete metodlarımızı deneme amaçlı 3 fonksiyon yazdık.Burada dikkat edilmesi gereken
 yer ise .register(new YamlEntityProvider<>()).Sağlayıcımızı kaydettik,gibi düşünebilirsiniz.Çıktımız ise aşağıda.
Bu yazımın devamı gelecektir.İyi çalışmalar...


JAX-RS (PROVIDERS)

  

      Daha önceki yazılarımızda RESTful web servislerinde  kaynak sınıflarımızı nasıl oluşturacağımızı öğrenmiştik.Bu yazımızdan itibaren ise JAX-RS'teki sağlayıcıları öğreneceğiz.Sağlayıcılar, JAX-RS çalışma alanını genişletmek için kullanılabileceğimiz bir yoldur.JAX-RS'te sağlayıcıları kullanırken @Provider ek açıklamasını kullanacağız.Bu sağlayıcıları 3'e ayrılıyor.

1)Entity Providers(Varlık Sağlayıcıları)
    
    Varlık sağlayıcıları xml,json gibi veri formatların java nesneleri ile iletişimi sağlarlar.Bu sağlayıcılar MessageBodyReader ve MessageBodyWriter interface'lerini implement ederler.Verinin saklanma türü @Consumes ve @Produces ek açıklamalarıyla belirtilmemiş ise sağlayıcılar tüm türleri destekler.

2)Context Providers(İçerik-Ortam Sağlayıcıları)

     İçerik sağlayıcıları ise @Context ek açıklamasıyla erişebilecekleri bağlamları kontrol eder.Bu sağlayıcılar ContextResolver <T> interface'ini implement ederler.


3)Exception Providers(İstisna sağlayıcıları)

   
      Hata sağlayıcıları, Java istisnalarının http response cevaplarına eşler,karşılaştırır ve bizde bu sonuçlara göre değişik şeyler yapabiliriz.Bu sağlayıcılar ise ExceptionMapper<T> interface'ini implement ederler.Bu 3'üde sağlayıcı olduğundan @Provider ek açıklamasını kullanmak zorundadır.



Bir sonraki yazımızda görüşmek üzere.Huzurlu günler...

HTTPCLIENT4 (CONFIGURE TIMEOUT)

   Herkese merhaba.Bu yazımızda,yapılan bir istek mesajı veya gelen bir cevap mesajı için bir timeout süresi belirleyeceğiz.HttpClient üzerinden yaptığımız bir request mesajına karşılık gelecek olan response mesajı bazen gelmeyebilir.Örneğin paket yolda kayıp olabilir.Şimdi örnek üzerinden nasıl kullanılacağını ve bu timeout süreleri dolduğunda ne tür bir exception döneceğini görelim.


Timeout süresini biraz azaltınca HttpHostException,biraz daha azaltınca ise SocketTimeoutException dönüyor.SoketException soketin beklediği verinin belirtilen sürede gelmemesi httphostexception ise bağlantının kurulup kurulamamasıyla ilgili.

İYİ ÇALIŞMALAR...

JAX-RS PROJE-1 (KAN BAĞIŞI)

          Bu yazımızda daha önce öğrendiğimiz ek açıklamaları kullanarak JSF-MySQL ile yazdığımız bir projeye RESTful web servisi yazacağız.Öncelikle projemizden bahsedelim.Projemizin adı kan bağışı.Kan bağışlamak isteyen gönüllü insanlar,bilgilerini sisteme bırakıyorlar.Kan ihtiyacı olan insanlar ise bu insanları bulup onlarla iletişime geçiyor.Yazacağımız servis sayesinde bu uygulamamızı isteyen herkes çok rahat bir şekilde kullanacak(Hastaneler,bağışçılara ihtiyacı olanlar,bağışçı eklemek isteyenler).Ben bu servisi yazarken sql sorgularıyla uğraşarak size hibernate,jpa gibi teknolojileri bilmezseniz ne kadar zorlanacağınızı göstermek için yazacağım. :) Şaka bir yana ben en kısa zamanda ORM araçlarını öğrenmeye başlayacağım.Kan arayan insanlar için GET metodu ile belirli kriterlere göre veya tüm bağışçıları getirtecek,POST metodu ile bağışçılar sisteme kaydolabilecek.Burada öğrendiğimiz diğer açıklamalarıda kullanacağız.Sırasıyla neler yaptığımıza bakalım.Öncelikle projenin bitmediğini belirtmek istiyorum.Her boş zamanımda eklemeler yapacağım.

package com.mycompany.blooddonorswebservice;
import java.util.*;
import javax.ws.rs.*;
import javax.ws.rs.core.*;
@Path("/Donors")
public class DonorsService {
DataService d=new DataService();
@GET
public List<Data> getDonors(@QueryParam("country") String country,
@QueryParam("bloodgroup") String bloodgroup){
if(country!=null && bloodgroup!=null)
return d.getDonorsByCountryAndBloodGroup(country,bloodgroup);
else if(country!=null)
return d.getDonorsByCountry(country);
else if(bloodgroup!=null)
return d.getDonorsByBloodGroup(bloodgroup);
else
return d.getAllDonors();
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response addDonors(Data data){
return d.addDonor(data);
}
}
view raw Gokhan hosted with ❤ by GitHub
package com.mycompany.blooddonorswebservice;
public class Data {
int id;
String isim;
String soyisim;
String eposta;
String telefon;
String adres;
String kangrubu;
String sifre;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getIsim() {
return isim;
}
public void setIsim(String isim) {
this.isim = isim;
}
public String getSoyisim() {
return soyisim;
}
public void setSoyisim(String soyisim) {
this.soyisim = soyisim;
}
public String getEposta() {
return eposta;
}
public void setEposta(String eposta) {
this.eposta = eposta;
}
public String getTelefon() {
return telefon;
}
public void setTelefon(String telefon) {
this.telefon = telefon;
}
public String getAdres() {
return adres;
}
public void setAdres(String adres) {
this.adres = adres;
}
public String getKangrubu() {
return kangrubu;
}
public void setKangrubu(String kangrubu) {
this.kangrubu = kangrubu;
}
public String getSifre() {
return sifre;
}
public void setSifre(String sifre) {
this.sifre = sifre;
}
}
view raw Gokhan hosted with ❤ by GitHub
package com.mycompany.blooddonorswebservice;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.core.Response;
public class DataService {
Connection conn;
public void connect(){
try{
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/kanbagisi","root","");
}catch(Exception e){
System.out.println("hata"+e.getMessage());
}
}
public List<Data> getAllDonors(){
connect();
List<Data> donors=new ArrayList<>();
try{
PreparedStatement ps=conn.prepareStatement("Select isim,soyisim,eposta,adres from bilgiler");
ResultSet rs=ps.executeQuery();
while(rs.next()){
Data b=new Data();
b.setIsim(rs.getString("isim"));
b.setSoyisim(rs.getString("soyisim"));
b.setEposta(rs.getString("eposta"));
b.setAdres(rs.getString("adres"));
donors.add(b);
}
}catch(Exception e){
System.out.println("hata"+e.getMessage());
}
return donors;
}
public List<Data> getDonorsByCountry(String country){
connect();
int i=1;
List<Data> donors2=new ArrayList<>();
try{
PreparedStatement ps=conn.prepareStatement("Select isim,soyisim,eposta,adres from bilgiler where adres like %?%");
ps.setString(1,country);
ResultSet rs=ps.executeQuery();
while(rs.next()){
Data co=new Data();
co.setIsim(rs.getString("isim"));
co.setSoyisim(rs.getString("soyisim"));
co.setEposta(rs.getString("eposta"));
co.setAdres(rs.getString("adres"));
donors2.add(co);
}
}catch(Exception e){
System.out.println("hata"+e.getMessage());
}
return donors2;
}
//------------
public List<Data> getDonorsByBloodGroup(String bloodGroup){
connect();
List<Data> donors3=new ArrayList<>();
try{
PreparedStatement ps=conn.prepareStatement("Select isim,soyisim,eposta,adres from bilgiler where kangrubu like %?%");
ps.setString(1,bloodGroup);
ResultSet rs=ps.executeQuery();
while(rs.next()){
Data blo=new Data();
blo.setIsim(rs.getString("isim"));
blo.setSoyisim(rs.getString("soyisim"));
blo.setEposta(rs.getString("eposta"));
blo.setAdres(rs.getString("adres"));
donors3.add(blo);
}
}catch(Exception e){
//
}
return donors3;
}
public List<Data> getDonorsByCountryAndBloodGroup(String country,String bloodgroup){
connect();
List<Data> donors4=new ArrayList<>();
try{
PreparedStatement ps=conn.prepareStatement("Select isim,soyisim,eposta,adres from bilgiler where kangrubu like %?% and adres like %?%");
ps.setString(1,bloodgroup);
ps.setString(2,country);
ResultSet rs=ps.executeQuery();
while(rs.next()){
Data tw=new Data();
tw.setIsim(rs.getString("isim"));
tw.setSoyisim(rs.getString("soyisim"));
tw.setEposta(rs.getString("eposta"));
tw.setAdres(rs.getString("adres"));
donors4.add(tw);
}
}catch(Exception e){
// System.out.println("hata"+e.getMessage());
}
return donors4;
}
public Response addDonor(Data data){
connect();
try{
PreparedStatement ps=conn.prepareStatement("insert into bilgiler(isim,soyisim,eposta,telefon"
+ ",adres,kangrubu,sifre) values(?,?,?,?,?,?,?)");
ps.setString(1,data.getIsim());
ps.setString(2,data.getSoyisim());
ps.setString(3,data.getEposta());
ps.setString(4,data.getTelefon());
ps.setString(5,data.getAdres());
ps.setString(6,data.getKangrubu());
ps.setString(7,data.getSifre());
ps.executeUpdate();
return Response.ok("Başarılı").build();
}catch(Exception e){
System.out.println("hata"+e.getMessage());
}
return Response.status(Response.Status.NOT_IMPLEMENTED).build();
}
}
view raw Gokhan hosted with ❤ by GitHub
package com.mycompany.blooddonorswebservice;
import java.io.IOException;
import org.codehaus.jackson.map.ObjectMapper;
public class jsonUtil {
private static ObjectMapper mapper;
static{
mapper=new ObjectMapper();
}
public static String convertJavaToJSon(Object object) throws IOException{
String jsonResult="";
try{
jsonResult=mapper.writeValueAsString(object);
}
catch(Exception e){
// System.out.println(e.getMessage());
}
return jsonResult;
}
}
view raw Gokhan hosted with ❤ by GitHub
import javax.ws.rs.core.*;
import javax.ws.rs.ApplicationPath;
@ApplicationPath("bloodcenter")
public class ApplicationConfig extends Application{
}
view raw Gokhan hosted with ❤ by GitHub
package com.mycompany.blooddonorswebservice;
import java.io.IOException;
import javax.ws.rs.client.*;
import javax.ws.rs.core.MediaType;
public class ClientApi {
public static void main(String []args) throws IOException{
Client client=ClientBuilder.newClient();
WebTarget t=client.target("http://localhost:8080/bloodDonorsWebService/bloodcenter/Donors");
String response=t.request().
post(Entity.entity(createDonor(),MediaType.APPLICATION_JSON)).toString();
System.out.println(response);
}
public static String createDonor() throws IOException{
Data d=new Data();
d.setIsim("Gokhan");
d.setKangrubu("AB+");
d.setSoyisim("Guzelkokar");
d.setAdres("Iskenderun/HATAY");
d.setTelefon("496496496496");
d.setEposta("ggggg@gmail.com");
d.setSifre("Galatasaray");
String donorJson=jsonUtil.convertJavaToJSon(d);
return donorJson;
}
}
view raw Gokhan1 hosted with ❤ by GitHub

Kodlarımız gördüğünüz gibi.Öncelikle bu kodlar arasında bloğumuzda bulunmayan Jackson var.Jackson kullanarak Java object <-> JSON dönüşümü yaptık.Daha sonra dataservice kısmında sql sorgularımızı çalıştırdık.Projemiz basit olmasına rağmen önemli birkaç eksiği bulunuyor.Bunlardan bir taneside response mesajları.Çünkü herhangi bir sql exception'ini bile ne tür bir response mesajı olacağına karar vermemişiz.Bir dipnot düşmek istiyorum.Siz siz olun exception'larınızı kullanıcıya göstermeyin. :) Bu projeyi arasıra güncelleyeceğim.SAĞLICAKLA KALIN.

HTTPCLIENT4-GİRİŞ

      Herkese merhaba.Bu yazımızda http client'a giriş yapacağız.HTTP CLIENT ile istek mesajlarımızı çok rahat bir şekilde oluşturacak, get,post,put,delete  metodlarını çok rahat bir şekilde kullanacağız.Bununla birlikte http response mesajlarının kontrolü olsun cookie işlemleri olsun vb. daha birsürü hazine keşfedilmeye hazır bir şekilde bekliyor :).İlk yazımıza basit bir örnek ile başlayalım.Şimdi tüm bağışçıları getiren küçük bir web servisi yazıp httpclient ile test edelim.Get metodu ile yapılan istekte http statusCode'u ekrana basalım.



  Daha önce aynı işi yapan bir client yazdığımızda hedef adresi beliryor Client nesnesi oluşturuyor ve hedef üzerinde bazı fonksiyonları çağırıyorduk.httpclient işimizi bayağı kolaylaştırıyor.Daha yeni başladık :)İşimize yarayacak birsürü şey öğreneceğimize inanıyorum.Bu konu ile ilgili yazılarımı paylaşırken RESTful web servislerini öğrenmeye devam edeceğiz.Birbirlerine yakın konular olduğu için birlikte götürmeyi düşünüyorum.




 -------------------------------BAĞIMLILIK-------------------------
<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.5</version>
 </dependency>



JAX-RS (ENTITY PARAMETERS)

       Bu yazımızda post veya put ek açıklamalarını kullanmak için yazacağımız istemci api'sinde Entity sınıfımızı kullanarak XML,JSON veya düz yazı formatındaki verilerimiz post edeceğiz.Kodlarımızın yardımı ile konuyu çok daha iyi anlayacağız.Hadi başlayalım.

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
public class MyClient {
public static void main(String[] args) {
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8080/EntityParameters/Entity/test1");
String response = target.request()
.post(Entity.entity("test body", MediaType.APPLICATION_XML), String.class);
System.out.println(response);
Client client2 = ClientBuilder.newClient();
WebTarget target2 = client.target("http://localhost:8080/EntityParameters/Entity/test1");
String entity = "<myMsg><id>2</id><msg>hello</msg></myMsg>";
String response2 = target.request()
.post(Entity.entity(entity, MediaType.APPLICATION_XML), String.class);
System.out.println(response);
}
}
view raw Gokhan hosted with ❤ by GitHub
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/")
public class Resources {
@Path("/test1")
@POST
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public String handle(String entityParam) {
System.out.println(entityParam);
return "entity parameter: " + entityParam;
}
}
view raw Gokhan1 hosted with ❤ by GitHub
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.25.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.25.1</version>
</dependency>
</dependencies>
view raw Gokhan2 hosted with ❤ by GitHub




 Bağımlılıkları eklemeyi unutursanız çok sinir bozucu bir hata ile karşılaşırsınız.Aslında ne kadar çok hata ile karşılaşırsanız o kadar iyi öğrenirsiniz.

İYİ ÇALIŞMALAR...

JAX-RS (RESOURCE CONSTRUCTOR)

     Bu yazımızda daha önce gördüğümüz,verileri kullanıcıdan parametre olarak almamıza yarayan @HeaderParam,@CookieParam gibi açıklamaları kaynak class'ımızın yapıcı(constructor) fonksiyonundan alacağız.Kodlar üzerinden devam edelim.Aşağıda gördüğümüz üzere MyResource sınıfımızın yapıcı fonksiyonu global olarak tanımlı değikenlere parametre olarak gelen değişkenleri atıp,handleRequest fonksiyonundan bu değerlere ulaşıyor.Şimdi de yazdığımız kaynak sınıfını client sınıfımız ile kontrol edelim.
import java.net.URI;
import javax.ws.rs.*;
import javax.ws.rs.core.*;
@Path("/")
public class MyResource {
private final UriInfo uriInfo;
private int qValue;
private int pathNum;
public MyResource(@QueryParam("test") int qValue,
@Context UriInfo uriInfo,
@PathParam("num") int pathNum
) {
this.pathNum = pathNum;
this.uriInfo = uriInfo;
this.qValue = qValue;
}
@GET
@Path("/test{num:[1,9]{0,1}}")
public String handleRequest() {
URI uri = uriInfo.getRequestUri();
return String.format("response from: %s%n PathNum: %s%n q: %s%n",
uri, pathNum, qValue);
}
}
view raw Gokhan hosted with ❤ by GitHub
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
public class MyClient {
public static void main(String [] args){
Client client=ClientBuilder.newClient();
WebTarget target=client.target("http://localhost:8080/ResourceConstructor/test9");
String response=target.queryParam("test",496).request().get()+"";
System.out.println(response);
}
}
view raw Gokhan hosted with ❤ by GitHub

Aynı şekilde kurala uygun bir istek yaptığımızda çıktımız yandaki gibi olacaktır.
 Buraya kadar olan yazılarımı gözden geçirip hatalarımı düzeltip güncelleyeceğim.Kodlarımı yazdığım bilgisayarım çok eski olduğundan biraz ağır ilerliyoruz.Kısmet olursa bu hafta bilgisayarımı yenileceğim.Daha sonra  yazılarımızın sayısı hızla artacak.JAX-RS'i bitirip.HttpClient,mikroservisler gibi konular ile devam edeceğiz.Bu arada yetişirse bu yaz'ın sonuna kadar hibernate,jpa,spring mvc gibi JAVA EE teknolojilerini birlikte öğrenip çok iyi projeler geliştireceğiz.Bir sonraki yazımızda görüşmek üzere kendinize iyi bakın.

JAX-RS (SINGLETON RESOURCES)

        Bu yazımızda ApplicationConfig sınıfımızda extends ettiğimiz,Application classında bulunan getSingletons() metodunu override ederek neler yapabileceğimizi inceleyeceğiz.Servisimiz her http isteğinde kaynakları tekrar tekrar oluşturur.Bu varsayılan çalışma şeklidir.Bildiğiniz üzere bazı fonksiyonları (static,final gibi.Bunlar override edilemez) override ederek geçersiz kılıp ihtiyacımıza bağlı olarak değiştirebiliriz.Bu yazımızda da bu kaynakların tekrar oluşmasını önlemek için getSingletons() fonksiyonunu override edeceğiz.Kodlarımızı görünce daha iyi anlayacağız.
import java.util.*;
import javax.ws.rs.*;
import javax.ws.rs.core.*;
@ApplicationPath("/")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses(){
Set<Class<?>> set =new HashSet<>();
set.add(MyResource.class);
return set;
}
@Override
public Set<Object> getSingletons(){
Set<Object> set=new HashSet<>();
set.add(new MySingletonResource());
return set;
}
}
view raw Gokhan hosted with ❤ by GitHub
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@Path("/")
public class MyResource {
private int counter;
@GET
@Path("count1")
public void count() {
counter++;
}
@GET
@Path("counter1")
public int getCounter() {
return counter;
}
@GET
@Path("reset1")
public void reset() {
counter = 0;
}
}
view raw Gokhan1 hosted with ❤ by GitHub
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@Path("/")
public class MySingletonResource {
private int counter;
@GET
@Path("count2")
public void count() {
counter++;
}
@GET
@Path("counter2")
public int getCounter() {
return counter;
}
@GET
@Path("reset2")
public void reset() {
counter = 0;
}
}
view raw Gokhan2 hosted with ❤ by GitHub
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
public class MyClient1 {
public static void main(String[] args) {
getRequest("/reset1", Void.class);
countRequest("/count1");
Integer counter = getRequest("/counter1", Integer.class);
System.out.printf("counter1: %s%n", counter);
getRequest("/reset2", Void.class);
countRequest("/count2");
Integer counter2 = getRequest("/counter2", Integer.class);
System.out.printf("counter2: %s%n", counter2);
}
public static void countRequest(String uri) {
for (int i = 0; i < 10; i++) {
getRequest(uri, Void.class);
}
}
public static <T> T getRequest(String uri, Class<T> responseType) {
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8080" + uri);
return target.request().get(responseType);
}
}
view raw Gokhan3 hosted with ❤ by GitHub


Gördüğünüz üzere iki farklı kaynak sınıfımız ve ApplicationConfig  sınıfımız var.ApplicationConfig'te gördüğünüz set collection'ı,list'in bir benzeri olup verileri herhangi bir index ile tutmaz.İki fonksiyonumuzu override ettik.

counter1: 0
counter2: 10
Çıktımız bu şekilde olacaktır.Client classımızın yaptığı request mesajlarına karşılık ApplicationConfig class'ımızda ezdiğimiz fonksiyonlar :).<T> gelecek olan class'tan sonra şekil alacak.Bir sonraki yazımızda görüşmek üzere.


JAX-RS (COOKIES)

        Bu yazımızda çerezler ile çalışacağız.Çerez,herhangi bir İnternet sitesi tarafından bilgisayara bırakılan bir tür tanımlama dosyası. Çerez dosyalarında oturum bilgileri ve benzeri veriler saklanır.Yani,biz uygulamamız için bir çerez oluşturup bunu response mesajımıza ekleyeceğiz.Bu çerezlerde tarayıcılarda tutulacak.Daha sonra tarayıcıdan bir request mesajı daha gönderilecek olursa bu çerezlerde bu mesajın içinde yer alacak.Bu tekrar eden request istekleri için değişik şeyler yapılabilir.Örneğin siz bir sosyal medya uygulamasına giriş yaptınız.Daha sonra bu platformu kullanan bir uygulamayı kullanmak istediniz.Orada giriş bilgilerinizi tekrar girmenize gerek kalmaz.Bir başka örneğimiz bir bankanın internet bankacılık uygulamasından.Kendi hesabınıza girdikten sonra herhangi bir şekilde sayfanızı yenilediğinizde sizi otomatik olarak çıkışa yönlendiriyor.Şimdi bir cookie oluşturup bunu response mesajımıza ekleyelim.


import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.ws.rs.*;
import javax.ws.rs.core.*;
@Path("/")
public class MyResource {
@GET
@Path("test")
public Response getCookie(){
NewCookie cookie1=new NewCookie("myStrCookie","strValue");
NewCookie cookie2=new NewCookie("myDateCookie","2018-06-10");
NewCookie cookie3=new NewCookie("myIntCookie","200");
Response.ResponseBuilder rs=Response.ok("myStrCookie myDateCookie and myIntCookie sent to the browser");
Response r=rs.cookie(cookie1,cookie2,cookie3).build();
return r;
}
view raw jaxrs1 hosted with ❤ by GitHub


Gördüğünüz gibi oluşturduğumuz çerezleri response mesajımıza ekleyip döndürdük.Yalnız dikkat edeceğimiz birkaç nokta var.Çerez adlarımızı belirlerken virgül,noktalı virgül ve boşluk kullanmamalıyız.Çünkü bu karakterleri kodlayacak bir standart mevcut değil.Bu çerezler http response mesajının başlık kısmında Set-Cookie başlığı altında tutulup farklı başlıklar altında sıralanıyor.Çıktı da gördüğünüz gibi.Peki bu çerezlere bir http isteği ile erişmeye çalışırsak nasıl olacak ?Bir de ona bakalım.Yukarıdaki çerezlerimizi birde request mesajı ile görüntüleyelim.

@GET
@Path("test2")
public String readAllCookies(@Context HttpHeaders headers) {
Map<String, Cookie> cookies = headers.getCookies();
String str = cookies.entrySet()
.stream()
.map(e -> e.getKey() + " = " + e.getValue().getValue())
.collect(Collectors.joining("<br/>"));
return str;
}
view raw jaxrs1 hosted with ❤ by GitHub

Şimdi de @CookieParam açıklamasını kullanarak bu çerezler üzerinde işlemler yapalım.Örneğin integer değer olarak gönderdiğimiz çerezi biz long olarak alabilir veya tarihi direct cookie tipinde alıp işleyebiliriz.Kodlarımıza göz atalım.

@GET
@Path("test3")
public String readCookie2(@CookieParam("myDateCookie") Cookie cookie) {
return "Cookie object :" + cookie;
}
@GET
@Path("test4")
public String readCookie3(@CookieParam("myIntCookie") Long aLong) {
return "myIntCookie in Long :" + aLong;
}
view raw jaxrs1 hosted with ❤ by GitHub




Son olarak bu çerezleri bir list aracılığıyla okuyalım.
@GET
@Path("test5")
public Response writeCookies() {
NewCookie cookie1 = new NewCookie("myCookie", "cookieStrVal");
NewCookie cookie2 = new NewCookie("myCookie", "cookieStrVal2");
Response.ResponseBuilder rb = Response.ok(" Multiple values of myCookie"
+ " sent to the browser");
Response response = rb.cookie(cookie1, cookie2)
.build();
return response;
}
@GET
@Path("test6")
public String readCookie4(@CookieParam("myCookie") List<String> list) {
String rv = "List size: " + list.size() +
"<br/>List values:<br/> ";
rv += list.stream()
.collect(Collectors.joining("<br/>"));
return rv;
}
view raw jaxrs1 hosted with ❤ by GitHub


Yazılarımda konuşma dili kullanığım için anlamsız cümleler kurmuş olabilirim.Anlamadığınız yeri yorum kısmından sorabilirsiniz.Konuyu çok iyi bir şekilde öğrendiğimi düşündüğümde videolu anlatım yapmayı düşünüyorum.Bir sonraki yazımızda görüşmek üzere kendinize iyi bakın :)




Spring Boot Uygulamasını Heroku üzerinde Deploy Etme

Bu yazımızda sizlere spring boot ile yazılmış basit bir Rest api'nin heroku üzerinde nasıl deploy edebileceğimizi göstereceğim. Önce ...