Rest Web Servis Cookie Sıkıntısı Hk.

Yapmak istediğiniz işle ilgili doğru bileşeni bulmak için burayı kullanabilirsiniz. Sadece bulmak için, diğer sorular Programlama forumuna lütfen.
Forum kuralları
Bu forum sadece yapacağınız işle alakalı doğru bileşeni bulmak içindir. Şöyle bir şey yapmam lazım, hangi bileşeni kullanıyım diyorsanız, doğru yerdesiniz.
Cevapla
satiuqea
Üye
Mesajlar: 11
Kayıt: 27 Haz 2016 12:18

Rest Web Servis Cookie Sıkıntısı Hk.

Mesaj gönderen satiuqea » 30 Ağu 2018 02:55

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.

Kod: Tümünü seç

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;

Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3040
Kayıt: 17 Nis 2006 07:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Rest Web Servis Cookie Sıkıntısı Hk.

Mesaj gönderen sabanakman » 31 Ağu 2018 11:13

Servisi hata almadan çalıştıran başka istemciler var ise Fiddler (veya benzeri bir araç ile) ile neyin farklı olduğuna bir bakmak gerekebilir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .

mkysoft
Kıdemli Üye
Mesajlar: 2989
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

Re: Rest Web Servis Cookie Sıkıntısı Hk.

Mesaj gönderen mkysoft » 31 Ağu 2018 01:36

IdCookieManager kullanarak çözebilirsiniz sanırım. Cookie kullandığınızı belirtmişsiniz, BasicAuthentication'a ihtiyacınızın olmaması lazım. Yazdığınız servisi öncelikle PostMan gibi uygulamalarla deneyiniz.

satiuqea
Üye
Mesajlar: 11
Kayıt: 27 Haz 2016 12:18

Re: Rest Web Servis Cookie Sıkıntısı Hk.

Mesaj gönderen satiuqea » 31 Ağu 2018 02:49

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;

Kod: Tümünü seç

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;

Kod: Tümünü seç

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.

mkysoft
Kıdemli Üye
Mesajlar: 2989
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

Re: Rest Web Servis Cookie Sıkıntısı Hk.

Mesaj gönderen mkysoft » 31 Ağu 2018 04:11

login metodunda kullandığınız TIdHttp nesnesine'de aynı TIdCookieManager bağlarsanız servisin döndüğü Set-Cookie komutunu otomatik olarak değerlendirip kaydeder ve çağrı yaptığınız adrese göre otomatik olarak isteğe ekler. TIdCookieManager'ı her seferinde tekrar yaratmak yerine ortak bir tane yaratın ve yaratacağınız tüm TIdHttp nesnelerine bağlayın.

Cevapla