Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Rest Web Servis Cookie Sıkıntısı Hk.
#1
Arkadaşlar herkese merhaba,

Java'da Restfull json web servis yazdım bunu web uygulamasında kullanmaktayım.
Konuya uzatmadan gelecek olursak, Giriş esnasında servis bana Cookie oluşturmakta web tarayıcıları için.
Bu cookie'yi almam ve diğer isteklerimde (GET,POST,PUT,DELETE) cookie olarak göndermem gerekmekte.
Get işlemimi yaptıgım zaman 500 Internal server error dönmekte bununda istekte cookie olmadığı için verdiğini düşünmekteyim.
Tecrübeli arkadaşlarımın yardımlarını rica ederim.

IDE RAD Studio XE8 Component olarak Indy'nin TIDHTTP kullanmaktayım. ÖR Post kod aşağıdadır.
Not: Görüntüdeki kod da serviste değişiklik yaparak cookie olarak oluşturduğum tokeni string yolladım gelip gelmediğini görmek için.
procedure TForm1.Button1Click(Sender: TObject);
var
   JsonToSend : TStream;
   Http       : TIDHttp;
   Token      : String;
begin
   Http := TIdHttp.Create(nil);
   Http.HandleRedirects := true;
   Http.MaxAuthRetries := 0;
   Http.AllowCookies := True;
   Http.HTTPOptions := [hoInProcessAuth];
   Http.Request.BasicAuthentication := true;
   Http.Request.ContentType := 'application/json';
   JsonToSend := TStringStream.Create(Memo1.Text,system.sysUtils.TEncoding.UTF8);
   Token := http.Post('http://localhost:8080/.........', JsonToSend);
   Edit1.Text := Token;
   Http.Free;
   JsonToSend.Free;
end;
Cevapla
#2
(30-08-2018, Saat: 16:09)satiuqea Adlı Kullanıcıdan Alıntı: Arkadaşlar herkese merhaba,

Java'da Restfull json web servis yazdım bunu web uygulamasında kullanmaktayım.
Konuya uzatmadan gelecek olursak, Giriş esnasında servis bana Cookie oluşturmakta web tarayıcıları için.
Bu cookie'yi almam ve diğer isteklerimde (GET,POST,PUT,DELETE) cookie olarak göndermem gerekmekte.
Get işlemimi yaptıgım zaman 500 Internal server error dönmekte bununda istekte cookie olmadığı için verdiğini düşünmekteyim.
Tecrübeli arkadaşlarımın yardımlarını rica ederim.

IDE RAD Studio XE8 Component olarak Indy'nin TIDHTTP kullanmaktayım. ÖR Post kod aşağıdadır.
Not: Görüntüdeki kod da serviste değişiklik yaparak cookie olarak oluşturduğum tokeni string yolladım gelip gelmediğini görmek için.
procedure TForm1.Button1Click(Sender: TObject);
var
   JsonToSend : TStream;
   Http       : TIDHttp;
   Token      : String;
begin
   Http := TIdHttp.Create(nil);
   Http.HandleRedirects := true;
   Http.MaxAuthRetries := 0;
   Http.AllowCookies := True;
   Http.HTTPOptions := [hoInProcessAuth];
   Http.Request.BasicAuthentication := true;
   Http.Request.ContentType := 'application/json';
   JsonToSend := TStringStream.Create(Memo1.Text,system.sysUtils.TEncoding.UTF8);
   Token := http.Post('http://localhost:8080/.........', JsonToSend);
   Edit1.Text := Token;
   Http.Free;
   JsonToSend.Free;
end;

Öncelikle Java servisinizi debug edip, internal error'un neden oluştuğunu net olarak bulmanız sizi sonuca daha hızlı ulaştıracaktır.
Cevapla
#3
(30-08-2018, Saat: 16:09)satiuqea Adlı Kullanıcıdan Alıntı: Arkadaşlar herkese merhaba,

Java'da Restfull json web servis yazdım bunu web uygulamasında kullanmaktayım.
Konuya uzatmadan gelecek olursak, Giriş esnasında servis bana Cookie oluşturmakta web tarayıcıları için.
Bu cookie'yi almam ve diğer isteklerimde (GET,POST,PUT,DELETE) cookie olarak göndermem gerekmekte.
Get işlemimi yaptıgım zaman 500 Internal server error dönmekte bununda istekte cookie olmadığı için verdiğini düşünmekteyim.
Tecrübeli arkadaşlarımın yardımlarını rica ederim.

IDE RAD Studio XE8 Component olarak Indy'nin TIDHTTP kullanmaktayım. ÖR Post kod aşağıdadır.
Not: Görüntüdeki kod da serviste değişiklik yaparak cookie olarak oluşturduğum tokeni string yolladım gelip gelmediğini görmek için.
procedure TForm1.Button1Click(Sender: TObject);
var
   JsonToSend : TStream;
   Http       : TIDHttp;
   Token      : String;
begin
   Http := TIdHttp.Create(nil);
   Http.HandleRedirects := true;
   Http.MaxAuthRetries := 0;
   Http.AllowCookies := True;
   Http.HTTPOptions := [hoInProcessAuth];
   Http.Request.BasicAuthentication := true;
   Http.Request.ContentType := 'application/json';
   JsonToSend := TStringStream.Create(Memo1.Text,system.sysUtils.TEncoding.UTF8);
   Token := http.Post('http://localhost:8080/.........', JsonToSend);
   Edit1.Text := Token;
   Http.Free;
   JsonToSend.Free;
end;

TIdCookieManager'ı araştırmalısınız.
There's no place like 127.0.0.1
WWW
Cevapla
#4
(31-08-2018, Saat: 09:29)edo Adlı Kullanıcıdan Alıntı: Öncelikle Java servisinizi debug edip, internal error'un neden oluştuğunu net olarak bulmanız sizi sonuca daha hızlı ulaştıracaktır.

Merhabalar,
NullPointerException dönmekte. 
Cookie olarak Tokeni bulamadığı için hata veriyor.

Sıkıntım cookie yi yollayamamak.

CookieManager çok uğraştım fakat çözüm bulamadım.
stackoverflow da falan bulduğum örnekler de işimi görmedi kimi propertyler bulunmamakta, sürüm sebepli sanırım.

En kötü servise revizyon yapmam gerekecek fakat bunu da istemiyorum açıkçası her metodu 2 ile çarpmak ve daha sonraki revizyonlarda 
işlemleri de 2 ile çarpmak çok can sıkıcı bir durum olacaktır.
Cevapla
#5
500, 505, 506, 510 gibi hatalar genellikle servis üzerinde yaşanılan problemlerden oluşan hatalar. Hata ayıklamada birebir delphi üzerinden gönderdiğiniz şekli ile hali hazırda bir POST metodu oluşturun ve sizin kontrolünüzde çalıştırın. Size hata kaynağını gösterecektir.

C# ile yazdığımız web servislerde bu tarz bir cookie kullanımı ve token alıp kullanma gibi bir sorunu yaşamadık. Bu rest servislere has bir eylem midir?
Cevapla
#6
(31-08-2018, Saat: 12:30)Abdullah ILGAZ Adlı Kullanıcıdan Alıntı: 500, 505, 506, 510 gibi hatalar genellikle servis üzerinde yaşanılan problemlerden oluşan hatalar. Hata ayıklamada birebir delphi üzerinden gönderdiğiniz şekli ile hali hazırda bir POST metodu oluşturun ve sizin kontrolünüzde çalıştırın. Size hata kaynağını gösterecektir.

C# ile yazdığımız web servislerde bu tarz bir cookie kullanımı ve token alıp kullanma gibi bir sorunu yaşamadık. Bu rest servislere has bir eylem midir?

Herkese tekrar merhaba,
Yanlış anlaşılmaya sebebiyet vermemek için biraz detaylı yazacagım.

Post işlemim login aslında. Login olduğumda servis cookie oluşturuyor ve web sistemim de oluşan cookiyi kullanıyor bu cookie de token aslında.
Web olarak düşünecek olursak servis her seferinde cookie deki tokene bakarak işleme izin veriyor.
Şimdilik burada sıkıntım mevcut onuda çözünce paylaşacağım ama işimi gördüm bir nevi işimi görme olayımda da serviste ufak bir revizyonla tokeni cookie değil de string olarak gönderdim.
Login Kodum;
procedure TForm1.Button1Click(Sender: TObject);
var
   JsonToSend : TStream;
   Http       : TIDHttp;
begin
   Http := TIdHttp.Create(nil);
   Http.HandleRedirects := true;
   Http.MaxAuthRetries := 0;
   Http.AllowCookies := True;
   Http.HTTPOptions := [hoInProcessAuth];
   Http.Request.BasicAuthentication := true;
   Http.Request.ContentType := 'application/json';
   JsonToSend := TStringStream.Create(Memo1.Text,system.sysUtils.TEncoding.UTF8);
   Token := http.Post('http://localhost:8080/......', jsonToSend);
   Edit1.Text := Token;
   Http.Free;
   JsonToSend.Free;
end;

Tokene erişiyorum artık.
Şimdi istek yapacagım get metoduyla;
procedure TForm1.Button2Click(Sender: TObject);
var
 Http      : TIdHTTP;
begin
   Http := TIdHttp.Create(nil);
   Http.CookieManager := TIdCookieManager.Create(Http);
   Http.CookieManager.AddServerCookie('et='+Token, Http.URL.Create('http://localhost'));
   Http.HandleRedirects := true;
   Http.MaxAuthRetries := 0;
   Http.AllowCookies := True;
   Http.HTTPOptions := [hoInProcessAuth];
   Http.Request.BasicAuthentication := true;
   Http.Request.ContentType := 'application/json';
   Memo2.Text := http.Get('http://localhost:8080/........');
   Http.Free;
end;

CookieManager'i kullanarak GET isteğimde tokenimi cookie olarak göndermeyi başardığım için servis cevabı json formatında bana verdi.
İhtiyacı olabilecek arkadaşlar için detaylı yazmak istedim.

Ama asıl meseleyi aslında halen çözemedim çözersem paylaşırım, önerileri de dikkate tabiki alırım.
Asıl mesele ise servisimi ellemeden post ile oluşan cookie yi alıp kullanabilmek.
Cevapla
#7
(31-08-2018, Saat: 15:25)satiuqea Adlı Kullanıcıdan Alıntı: ...
Post işlemim login aslında. Login olduğumda servis cookie oluşturuyor ve web sistemim de oluşan cookiyi kullanıyor bu cookie de token aslında.
Web olarak düşünecek olursak servis her seferinde cookie deki tokene bakarak işleme izin veriyor.
Şimdilik burada sıkıntım mevcut onuda çözünce paylaşacağım ama işimi gördüm bir nevi işimi görme olayımda da serviste ufak bir revizyonla tokeni cookie değil de string olarak gönderdim.
Login Kodum;
...
CookieManager'i kullanarak GET isteğimde tokenimi cookie olarak göndermeyi başardığım için servis cevabı json formatında bana verdi.
İhtiyacı olabilecek arkadaşlar için detaylı yazmak istedim.

Ama asıl meseleyi aslında halen çözemedim çözersem paylaşırım, önerileri de dikkate tabiki alırım.
Asıl mesele ise servisimi ellemeden post ile oluşan cookie yi alıp kullanabilmek.

Merhaba,

Login (Sisteme giriş, müdahele etme imkanı sunma) işlemi genellikle çok önemsenmeyen bir mesele gibi gözükse de aslında tüm kontrollerin ve denetimlerin merkezinde yer alan bir unsur. Kullanıcı, Rol, Yetki, Erişim gibi kavramların yanı sıra Transaction (Hareket) kayıtlarının tamamında imzası bulunan bir unsur.

Böyle bir unsuru tarayıcı tarafından açıkca erişilebilen bir Cookie üzerinde veyahut Session oluşturarak SessionId cookie key değerini kullanarak web servis erişiminizi niçin kullanıyorsunuz? Bunun yerine sisteme dahil ettiğiniz kullanıcı için kendi belirleyeceğiniz standartlarda bir key değerini o anın zaman damgası, kullanıcı id bilgisi ve istediğiniz bazı bilgilerden harman yaparak hash edip bu bilgiyi string olarak döndürüp, diğer metodlara giderken Credential (veya nasıl hitap etmek isterseniz) gibi bir sınıf oluşturup içerisindeki değeri encode yaptığınız algoritmayı decode ederek halâ aynı kişi ve oturum olup olmadığını denetleyip kullanabilirsiniz.

Bunun yerine cookie kullanmanıza neden olan şeyi söylerseniz belki ben de sizin gibi kullanmaya başlarım.
Cevapla
#8
(31-08-2018, Saat: 15:25)satiuqea Adlı Kullanıcıdan Alıntı:
(31-08-2018, Saat: 12:30)Abdullah ILGAZ Adlı Kullanıcıdan Alıntı: 500, 505, 506, 510 gibi hatalar genellikle servis üzerinde yaşanılan problemlerden oluşan hatalar. Hata ayıklamada birebir delphi üzerinden gönderdiğiniz şekli ile hali hazırda bir POST metodu oluşturun ve sizin kontrolünüzde çalıştırın. Size hata kaynağını gösterecektir.

C# ile yazdığımız web servislerde bu tarz bir cookie kullanımı ve token alıp kullanma gibi bir sorunu yaşamadık. Bu rest servislere has bir eylem midir?

Herkese tekrar merhaba,
Yanlış anlaşılmaya sebebiyet vermemek için biraz detaylı yazacagım.

Post işlemim login aslında. Login olduğumda servis cookie oluşturuyor ve web sistemim de oluşan cookiyi kullanıyor bu cookie de token aslında.
Web olarak düşünecek olursak servis her seferinde cookie deki tokene bakarak işleme izin veriyor.
Şimdilik burada sıkıntım mevcut onuda çözünce paylaşacağım ama işimi gördüm bir nevi işimi görme olayımda da serviste ufak bir revizyonla tokeni cookie değil de string olarak gönderdim.
Login Kodum;
procedure TForm1.Button1Click(Sender: TObject);
var
   JsonToSend : TStream;
   Http       : TIDHttp;
begin
   Http := TIdHttp.Create(nil);
   Http.HandleRedirects := true;
   Http.MaxAuthRetries := 0;
   Http.AllowCookies := True;
   Http.HTTPOptions := [hoInProcessAuth];
   Http.Request.BasicAuthentication := true;
   Http.Request.ContentType := 'application/json';
   JsonToSend := TStringStream.Create(Memo1.Text,system.sysUtils.TEncoding.UTF8);
   Token := http.Post('http://localhost:8080/......', jsonToSend);
   Edit1.Text := Token;
   Http.Free;
   JsonToSend.Free;
end;

Tokene erişiyorum artık.
Şimdi istek yapacagım get metoduyla;
procedure TForm1.Button2Click(Sender: TObject);
var
 Http      : TIdHTTP;
begin
   Http := TIdHttp.Create(nil);
   Http.CookieManager := TIdCookieManager.Create(Http);
   Http.CookieManager.AddServerCookie('et='+Token, Http.URL.Create('http://localhost'));
   Http.HandleRedirects := true;
   Http.MaxAuthRetries := 0;
   Http.AllowCookies := True;
   Http.HTTPOptions := [hoInProcessAuth];
   Http.Request.BasicAuthentication := true;
   Http.Request.ContentType := 'application/json';
   Memo2.Text := http.Get('http://localhost:8080/........');
   Http.Free;
end;

CookieManager'i kullanarak GET isteğimde tokenimi cookie olarak göndermeyi başardığım için servis cevabı json formatında bana verdi.
İhtiyacı olabilecek arkadaşlar için detaylı yazmak istedim.

Ama asıl meseleyi aslında halen çözemedim çözersem paylaşırım, önerileri de dikkate tabiki alırım.
Asıl mesele ise servisimi ellemeden post ile oluşan cookie yi alıp kullanabilmek.

Gerçek kodunuz bu verdiğiniz örnekteki gibi her seferinde farklı TIdHTTP nesnesi oluşturuyorsa Cookie'lerde sorun yaşamanız normal. POST ve GET işlemi için ortak TIdHTTP ve ortak TIdCookieManager kullanmalısınız.

Not: POST işleminden sonra CookieManager.CookieCollection içeriğini kontrol edip Cookie'leri doğru alıp almadığınıza baktınız mı?
There's no place like 127.0.0.1
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Web Servis SOAP eyln 19 842 22-03-2024, Saat: 13:06
Son Yorum: eyln
  Rest Hata Yakalama m_ekici 9 1.456 08-03-2024, Saat: 19:30
Son Yorum: aegean
  net.tcp web servis clienti yazma erkankurtaga 3 310 27-02-2024, Saat: 00:01
Son Yorum: mkysoft
  web servis header sorunu eyln 2 500 26-06-2023, Saat: 13:08
Son Yorum: eyln
  Rest debugger Memo Yazi Gönder gonulali 2 611 14-04-2023, Saat: 22:24
Son Yorum: gonulali



Konuyu Okuyanlar: 1 Ziyaretçi