WSDL sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
misem
Üye
Mesajlar: 7
Kayıt: 24 Kas 2017 05:06

WSDL sorunu

Mesaj gönderen misem »

Merhaba,
aşağıdaki sgk nın e reçete sistemi için oluşturduğu web servisin wsdl urlsini kullanarak sisteme reçete göndermek için kullanmak istiyorum, wsdl adresini delphiye xe10 a import ettiğimde oluşan fonksiyonlardaki hiçbir parametrenin değişken tanımı olmadığından "Undeclared identifier 'ereceteSorgula' " gibi her değişken için hata veriyor.

Sorunu çözemedim ben burada her değişken tanımını kendim mi yapacağım ?

https://saglikt.sgk.gov.tr/medula/eczan ... eriWS?wsdl

ilgili web servis dökümanı
https://medeczane.sgk.gov.tr/doktor/Sag ... isleri.pdf
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: WSDL sorunu

Mesaj gönderen sabanakman »

İyi günler. SGK servisleri genelde tipler (xsd:schema) için farklı yere yönlendirme yaptığından bu durum oluşmaktadır. Bunu da çözmek için WSDL sayfasını WSDL.xml olarak kayıt edin ve yine bu WSDL sayfası içindeki xsd:schema\xsd:import düğümündeki schemaLocation özelliğinde bulunan adresteki bilgiyi de ayrı bir schema.xml olarak kayıt edin. Daha sonra ilk kayıt edilen WSDL.xml içindeki <xsd:schema></xsd:schema> düğümünü kaldırıp onun yerine de schemaLocation.xml içindeki <xsd:schema></xsd:schema> düğümünü yerleştirip saglikTesisiReceteIslemleriWS.xml olarak kayıt edin. Arık burada tanımları tam olan bir saglikTesisiReceteIslemleriWS.xml dosyasınız olacaktır. Bunu WSDL import ile import edebilirsiniz ama WSDL Adresi ve URL adresinde sıkıntı çıkmaması için son bir kontrol (aşağıdaki gibi değiştirmeniz) gerekebilir.

Kod: Tümünü seç

defWSDL = 'https://saglikt.sgk.gov.tr/medula/eczane/saglikTesisiReceteIslemleriWS?wsdl';
defURL  = 'https://saglikt.sgk.gov.tr/medula/eczane/saglikTesisiReceteIslemleriWS';
Bu gün yayınlanmış olan WSDL parametrelerine göre ekte gönderdiğim saglikTesisiReceteIslemleriWS.xml dosyası oluşmaktadır ve buradan import edilen unit hata vermeden derlenebilmektedir. İyi çalışmalar.
Dosya ekleri
saglikTesisiReceteIslemleriWS.7z
WSDL Import işleminde kullanılacak dosya
(3.31 KiB) 103 kere indirildi
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
misem
Üye
Mesajlar: 7
Kayıt: 24 Kas 2017 05:06

Re: WSDL sorunu

Mesaj gönderen misem »

sabanakman yazdı: 25 Kas 2017 11:41 İyi günler. SGK servisleri genelde tipler (xsd:schema) için farklı yere yönlendirme yaptığından bu durum oluşmaktadır. Bunu da çözmek için WSDL sayfasını WSDL.xml olarak kayıt edin ve yine bu WSDL sayfası içindeki xsd:schema\xsd:import düğümündeki schemaLocation özelliğinde bulunan adresteki bilgiyi de ayrı bir schema.xml olarak kayıt edin. Daha sonra ilk kayıt edilen WSDL.xml içindeki <xsd:schema></xsd:schema> düğümünü kaldırıp onun yerine de schemaLocation.xml içindeki <xsd:schema></xsd:schema> düğümünü yerleştirip saglikTesisiReceteIslemleriWS.xml olarak kayıt edin. Arık burada tanımları tam olan bir saglikTesisiReceteIslemleriWS.xml dosyasınız olacaktır. Bunu WSDL import ile import edebilirsiniz ama WSDL Adresi ve URL adresinde sıkıntı çıkmaması için son bir kontrol (aşağıdaki gibi değiştirmeniz) gerekebilir.

Kod: Tümünü seç

defWSDL = 'https://saglikt.sgk.gov.tr/medula/eczane/saglikTesisiReceteIslemleriWS?wsdl';
defURL  = 'https://saglikt.sgk.gov.tr/medula/eczane/saglikTesisiReceteIslemleriWS';
Bu gün yayınlanmış olan WSDL parametrelerine göre ekte gönderdiğim saglikTesisiReceteIslemleriWS.xml dosyası oluşmaktadır ve buradan import edilen unit hata vermeden derlenebilmektedir. İyi çalışmalar.
Cevabınız için teşekkürler bende konuyu açtıktan sonra araştırmaya devam ettim dediğiniz yöntem ile sorunu çözebildim. :bravo:
misem
Üye
Mesajlar: 7
Kayıt: 24 Kas 2017 05:06

Re: WSDL sorunu

Mesaj gönderen misem »

Sisteme her soap işlemi kullanıcı adı şifre gönderilmesi gerekiyor ancak wsdl delphiye import ettim fakat kullanıcı adı şifre göndereceğim methot yok yanlış bir şey mi yapıyorum?
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: WSDL sorunu

Mesaj gönderen ertank »

Merhaba,

SGK sistemini incelemedim. Ancak SOAP kullanıcı adı ve şifreleri her zaman metod kullanarak gönderilmeyebiliyor. Çoğunlukla bağlantı parametrelerine eklenerek kullanılıyor. Kullandığınız Delphi sürümünde THTTPRIO bileşeninin aşağıdaki özelliğini kullanmayı deneyebilirsiniz. Daha önceki sürümlerde bu işlemi geçekleştirme biraz daha farklı yollardan yapılıyordu.

Kod: Tümünü seç

var
  RIO: THTTPRIO;
  WS: WebServisInvokableAdi;
begin
  RIO := THTTPRIO.Create(nil);
  RIO.URL := 'web servis bağlantı kontası';
  RIO.HTTPWebNode.UserName := 'kullaniciadi';
  RIO.HTTPWebNode.Password := 'sifre';
  WS := (RIO as WebServisInvokableAdi);
  ...
Eğer RIO sınıfını kendiniz oluşturarak kullanmıyorsanız (web servis atama prosedürünü kullanıyorsanız) web servis değişkeninizi THTTPRIO türüne type cast etmeniz gerekebilir.

Kod: Tümünü seç

var
  WS: WebServisInvokableAdi;
begin
  WS := GetWebServisInvokableAdi();
  THTTPRIO(WS).HTTPWebNode.UserName := 'kullaniciadi';
  THTTPRIO(WS).HTTPWebNode.Password := 'sifre';
  ...
En son ertank tarafından 02 Ara 2017 05:30 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
misem
Üye
Mesajlar: 7
Kayıt: 24 Kas 2017 05:06

Re: WSDL sorunu

Mesaj gönderen misem »

ertank yazdı: 02 Ara 2017 11:41 Merhaba,

SGK sistemini incelemedim. Ancak SOAP kullanıcı adı ve şifreleri her zaman metod kullanarak gönderilmeyebiliyor. Çoğunlukla bağlantı parametrelerine eklenerek kullanılıyor. THTTPRIO bileşeninin aşağıdaki özelliğini kullanmayı deneyebilirsiniz.

Kod: Tümünü seç

var
  RIO: THTTPRIO;
  WS: WebServisInvokableAdi;
begin
  RIO := THTTPRIO.Create(nil);
  RIO.URL := 'web servis bağlantı kontası';
  RIO.HTTPWebNode.UserName := 'kullaniciadi';
  RIO.HTTPWebNode.Password := 'sifre';
  WS := (RIO as WebServisInvokableAdi);
  ...
Eğer RIO sınıfını kendiniz oluşturarak kullanmıyorsanız (web servis atama prosedürünü kullanıyorsanız) web servis değişkeninizi THTTPRIO türüne type cast etmeniz gerekebilir.

Kod: Tümünü seç

var
  WS: WebServisInvokableAdi;
begin
  WS := GetWebServisInvokableAdi();
  THTTPRIO(WS).HTTPWebNode.UserName := 'kullaniciadi';
  THTTPRIO(WS).HTTPWebNode.Password := 'sifre';
  ...
Yorumunuz için teşekkür ederim.Otomatik olarak oluşturulan webservis unitinin içerisinde getsagliktesisireceteislemleri() foksyionu httprio nesnesini parametre olarak alıyor. Bu fonsiyon web servis ile bağlantı sağlıyor. Yeni bir tane httprio oluşturup kullanıcı adını ve şifresini atayıp fonsiyona parametre olarak verdim umarım bu sorunu çözecektir.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: WSDL sorunu

Mesaj gönderen sabanakman »

C# veya Java gibi Başka dilde yazılmış bir örnek var mı elinizde!
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
misem
Üye
Mesajlar: 7
Kayıt: 24 Kas 2017 05:06

Re: WSDL sorunu

Mesaj gönderen misem »

sabanakman yazdı: 02 Ara 2017 05:52 C# veya Java gibi Başka dilde yazılmış bir örnek var mı elinizde!
hangi konuda hocam anlayamadım?
misem
Üye
Mesajlar: 7
Kayıt: 24 Kas 2017 05:06

Re: WSDL sorunu

Mesaj gönderen misem »

ertank yazdı: 02 Ara 2017 11:41 Merhaba,

SGK sistemini incelemedim. Ancak SOAP kullanıcı adı ve şifreleri her zaman metod kullanarak gönderilmeyebiliyor. Çoğunlukla bağlantı parametrelerine eklenerek kullanılıyor. Kullandığınız Delphi sürümünde THTTPRIO bileşeninin aşağıdaki özelliğini kullanmayı deneyebilirsiniz. Daha önceki sürümlerde bu işlemi geçekleştirme biraz daha farklı yollardan yapılıyordu.

Kod: Tümünü seç

var
  RIO: THTTPRIO;
  WS: WebServisInvokableAdi;
begin
  RIO := THTTPRIO.Create(nil);
  RIO.URL := 'web servis bağlantı kontası';
  RIO.HTTPWebNode.UserName := 'kullaniciadi';
  RIO.HTTPWebNode.Password := 'sifre';
  WS := (RIO as WebServisInvokableAdi);
  ...
Eğer RIO sınıfını kendiniz oluşturarak kullanmıyorsanız (web servis atama prosedürünü kullanıyorsanız) web servis değişkeninizi THTTPRIO türüne type cast etmeniz gerekebilir.

Kod: Tümünü seç

var
  WS: WebServisInvokableAdi;
begin
  WS := GetWebServisInvokableAdi();
  THTTPRIO(WS).HTTPWebNode.UserName := 'kullaniciadi';
  THTTPRIO(WS).HTTPWebNode.Password := 'sifre';
  ...
verdiğiniz örnek ile denediğimde maalesef olmadı. Geriye hata döndü

Kod: Tümünü seç

Alınan mesajda "username" elementi bulunamadı. Mesaj headerinda kullanıcı bilgilerini içeren security elementi olması gerekmektedir. 
Soap header nasıl eklenip gönderilir diye araştırıyorum https://stackoverflow.com/questions/137 ... -in-delphi burdaki +200 olan çözümü denedim ancak hala username etiketi yok diyor anlamadım ekliyorum dediği şekilde.
misem
Üye
Mesajlar: 7
Kayıt: 24 Kas 2017 05:06

Re: WSDL sorunu

Mesaj gönderen misem »

misem yazdı: 06 Ara 2017 11:42
ertank yazdı: 02 Ara 2017 11:41 Merhaba,

SGK sistemini incelemedim. Ancak SOAP kullanıcı adı ve şifreleri her zaman metod kullanarak gönderilmeyebiliyor. Çoğunlukla bağlantı parametrelerine eklenerek kullanılıyor. Kullandığınız Delphi sürümünde THTTPRIO bileşeninin aşağıdaki özelliğini kullanmayı deneyebilirsiniz. Daha önceki sürümlerde bu işlemi geçekleştirme biraz daha farklı yollardan yapılıyordu.

Kod: Tümünü seç

var
  RIO: THTTPRIO;
  WS: WebServisInvokableAdi;
begin
  RIO := THTTPRIO.Create(nil);
  RIO.URL := 'web servis bağlantı kontası';
  RIO.HTTPWebNode.UserName := 'kullaniciadi';
  RIO.HTTPWebNode.Password := 'sifre';
  WS := (RIO as WebServisInvokableAdi);
  ...
Eğer RIO sınıfını kendiniz oluşturarak kullanmıyorsanız (web servis atama prosedürünü kullanıyorsanız) web servis değişkeninizi THTTPRIO türüne type cast etmeniz gerekebilir.

Kod: Tümünü seç

var
  WS: WebServisInvokableAdi;
begin
  WS := GetWebServisInvokableAdi();
  THTTPRIO(WS).HTTPWebNode.UserName := 'kullaniciadi';
  THTTPRIO(WS).HTTPWebNode.Password := 'sifre';
  ...
verdiğiniz örnek ile denediğimde maalesef olmadı. Geriye hata döndü

Kod: Tümünü seç

Alınan mesajda "username" elementi bulunamadı. Mesaj headerinda kullanıcı bilgilerini içeren security elementi olması gerekmektedir. 
Soap header nasıl eklenip gönderilir diye araştırıyorum https://stackoverflow.com/questions/137 ... -in-delphi burdaki +200 olan çözümü denedim ancak hala username etiketi yok diyor anlamadım ekliyorum dediği şekilde.
web servis soap security ekleme için https://stackoverflow.com/questions/137 ... -in-delphi adresindeki ki WSSE_SGK.pas dosyasını kullanarak hallettim ancak şuan tesis kodu hatası alıyorum
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: WSDL sorunu

Mesaj gönderen ertank »

Merhaba,

Normalde yapmanız gereken SGK dökümanlarında gördüğüm kadarıyla "HTTP Basic Authentication" Bunun yapılış şekli de yukarıdaki ilk cevabımdaki ilk örnekteki gibidir. Ancak, SGK gördüğüm kadarıyla servis ile ilgili sürekli değişiklikler yapıyor. Nitekim ben bugün şu an itibariyle https://saglikt.sgk.gov.tr için ERR_NAME_NOT_RESOLVED hatası alıyorum.

Eğer kendiniz manuel yapmak istiyorsanız aşağıdaki şekilde yapmanız mümkün.
https://stackoverflow.com/questions/343 ... ttp-header
Ancak, bu yöntem benim ilk önerdiğim yöntemin Delphi 7 gibi eski sürümlerdeki uzun şekilde yapılışıdır. Gidecek olan XML aynı olacaktır.

Kullandığınız WSDL dosyasını ve Servis çağıran kodunuzu kullanıcı adı ve şifreyi gizleyerek paylaşabilir misiniz?
Cevapla