Web Service Remotable

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
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Web Service Remotable

Mesaj gönderen Okann »

Merhaba Arkadaşlar,

Bir lisans servisi hazırlıyorum.
GetLicenseInfo fonksiyonuma AccountName değeri gönderdiğim için tek satır sonuç alıyorum bu kısım istediğim gibi.
GetLicenseInfoA fonksiyonuma ise AccountName değeri göndermediğim için ürüne ait tüm lisans bilgilerini satır satır okuyup gride çekmek niyetindeyim ama bu kısımda takıldım. Nasıl yapabilirim?

Kod: Tümünü seç


unit WS_DNIntf;

interface

uses
  System.Types,
  Soap.InvokeRegistry,
  Soap.XSBuiltIns;

type
  TLicenseInfo = class(TRemotable)
  private
    FStatus: ShortInt;
    FStatusMsg: String;
    FAccountName: String;
    FEMailService: ShortInt;
    FSalesOrder: ShortInt;
    FPurchaseOrder: ShortInt;
    FAccountCard: ShortInt;
    FAccountBalance: ShortInt;
    FMaterialCard: ShortInt;
    FMaterialBarcode: ShortInt;
    FMaterialInventory: ShortInt;
    FMaterialSalesPrice: ShortInt;
    FMaterialPurchasePrice: ShortInt;
  published
    property Status: ShortInt read FStatus write FStatus;
    property StatusMsg: String read FStatusMsg write FStatusMsg;
    property AccountName: String read FAccountName write FAccountName;
    property UseEMailService: ShortInt read FEMailService write FEMailService;
    property UseSalesOrder: ShortInt read FSalesOrder write FSalesOrder;
    property UsePurchaseOrder: ShortInt read FPurchaseOrder write FPurchaseOrder;
    property UseAccountCard: ShortInt read FAccountCard write FAccountCard;
    property UseAccountBalance: ShortInt read FAccountBalance write FAccountBalance;
    property UseMaterialCard: ShortInt read FMaterialCard write FMaterialCard;
    property UseMaterialBarcode: ShortInt read FMaterialBarcode write FMaterialBarcode;
    property UseMaterialInventory: ShortInt read FMaterialInventory write FMaterialInventory;
    property UseMaterialSalesPrice: ShortInt read FMaterialSalesPrice write FMaterialSalesPrice;
    property UseMaterialPurchasePrice: ShortInt read FMaterialPurchasePrice write FMaterialPurchasePrice;
  end;

  TLicenseInfoA = array of TLicenseInfo; 

type
  IWS_DN = interface(IInvokable)
  ['{B4E507D7-D420-4B0D-9F75-AE5EAE1641C1}']
    function GetLicenseInfo(UserName, Password, ProductID, AccountName: string): TLicenseInfo; stdcall;
    function GetLicenseInfoA(UserName, Password, ProductID: string): TLicenseInfoA; stdcall;
  end;

implementation

initialization
  InvRegistry.RegisterInterface(TypeInfo(IWS_DN));
  RemClassRegistry.RegisterXSClass(TLicenseInfo);
  RemClassRegistry.RegisterXSInfo(TypeInfo(TLicenseInfoA));

finalization
  InvRegistry.UnRegisterInterface(TypeInfo(IWS_DN));
  RemClassRegistry.UnRegisterXSClass(TLicenseInfo);
  RemClassRegistry.UnRegisterXSInfo(TypeInfo(TLicenseInfoA));

end.

Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: Web Service Remotable

Mesaj gönderen Okann »

Merhaba,

Ben web servis tarafındaki sorunumdan bahsettim aslında. Verdiğiniz url de varolan web servisten veri çekmekte sorun yaşamış arkadaş.
Benim sıkıntım bu veriyi web servis ile yayınlayabilmek.
ismailkocacan
Üye
Mesajlar: 88
Kayıt: 25 Eyl 2011 06:11
Konum: İstanbul
İletişim:

Re: Web Service Remotable

Mesaj gönderen ismailkocacan »

Okann yazdı: 19 Kas 2020 03:59
Merhaba,

Ben web servis tarafındaki sorunumdan bahsettim aslında. Verdiğiniz url de varolan web servisten veri çekmekte sorun yaşamış arkadaş.
Benim sıkıntım bu veriyi web servis ile yayınlayabilmek.
"lisans bilgilerini satır satır okuyup gride çekmek niyetindeyim ama bu kısımda takıldım" kısmını anladım.

AccountName parameteresini neden gönderemiyorsunuz ? Fiddler ile kontrol ettiniz mi ?

Parametre sayısı ve Array döndürme ile ilgili bir problem varsa,
fonksiyon paramtrelerini TLicenseInfo gibi bir sınıf içinde toplayıp parametre olarak sınıf geçmeyi deneyebilirsiniz.
ismailkocacan
Üye
Mesajlar: 88
Kayıt: 25 Eyl 2011 06:11
Konum: İstanbul
İletişim:

Re: Web Service Remotable

Mesaj gönderen ismailkocacan »

Okann yazdı: 19 Kas 2020 03:59
Merhaba,

Ben web servis tarafındaki sorunumdan bahsettim aslında. Verdiğiniz url de varolan web servisten veri çekmekte sorun yaşamış arkadaş.
Benim sıkıntım bu veriyi web servis ile yayınlayabilmek.
Merhaba,
"lisans bilgilerini satır satır okuyup gride çekmek niyetindeyim ama bu kısımda takıldım" kısmını anladım.

AccountName parameteresini neden gönderemiyorsunuz ? Fiddler ile kontrol ettiniz mi ?

Parametre sayısı ve Array döndürme ile ilgili bir problem varsa,
fonksiyon paramtrelerini TLicenseInfo gibi bir sınıf içinde toplayıp parametre olarak sınıf geçmeyi deneyebilirsiniz.
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: Web Service Remotable

Mesaj gönderen Okann »

Hocam AccountName alanını ilk fonksiyonum için gönderip tek bir hesap için lisans bilgisi alıyorum.
2. fonksiyonumda ürüne ait tüm lisans bilgilerini çekmek istediğim için accountname alanını göndermemem gerekiyor zaten.
sorunum şu. INTF.pas için yazdığım kodlar sizce bu yapmak istediğim iş için yeterli midir? Yeterli ise Impl.pas unitimde bu 2. fonksiyon için ne yazmam gerekiyor. Result kodu hiçbir şeyi kabul etmiyor. array gibi çalışabilir durum da mı bu yazdığım kod? Ben daha önce hiç web servis kullanmadım o yüzden biraz anlatımda güçlük yaşıyor da olabilirim.
ismailkocacan
Üye
Mesajlar: 88
Kayıt: 25 Eyl 2011 06:11
Konum: İstanbul
İletişim:

Re: Web Service Remotable

Mesaj gönderen ismailkocacan »

Okann yazdı: 19 Kas 2020 07:04 INTF.pas için yazdığım kodlar sizce bu yapmak istediğim iş için yeterli midir?
Yapısal olarak bir yanlışlık görünmüyor.

Okann yazdı: 19 Kas 2020 07:04 Yeterli ise Impl.pas unitimde bu 2. fonksiyon için ne yazmam gerekiyor. Result kodu hiçbir şeyi kabul etmiyor. array gibi çalışabilir durum da mı bu yazdığım kod?
GetLicenseInfo fonksiyonu için, implement ettiğiniz yerde bir tane TLicenseInfo create edip, gerekli alanları set edip, bilgileri geriye döndürmeniz yeterli.

GetLicenseInfoA bir array türü döndürüyor görünmekte, implement ettiğiniz yerde TLicenseInfoA türünde bir değişken tanımlayıp, içini doldurmanız yeterli.

Kod: Tümünü seç

var
 Lisanslar : TLicenseInfoA ;
begin
 SetLength(Lisanslar,2);

 Lisanslar[0] := TLicenseInfo.Create;
 Lisanslar[0]. Status := 1;

 Lisanslar[1] := TLicenseInfo.Create;
 Lisanslar[1]. Status := 2;

 Result := Lisanslar;
end;
Gibi bir kod yazmanız lazım.

Öneri:

Kod: Tümünü seç

 TLicenseInfoA = array of TLicenseInfo; 
Yerine aşağıdaki gibi isimlendirme yapabilirsiniz.

Kod: Tümünü seç

 TArrayOfLicenseInfo = array of TLicenseInfo; 
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: Web Service Remotable

Mesaj gönderen Okann »

Çok teşekkür ederim yardımınız için.
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: Web Service Remotable

Mesaj gönderen Okann »

Hocam tekrar merhaba,
Kodlama devam ettikçe birkaç soru daha çıktı karşıma. Konu biraz uzadı sanırım kusuruma bakmayın.
1- Status ve Statusmsg genel bir sonuç döndürdüğü için Lisanslar[n].Status değilde Lisanslar.Status şeklinde publish edebiliyor muyuz?
2- Client tarafında GetLicenseInfoA fonksiyonu çalıştırıldığında kaç satır döneceğini önceden bilmem gerekiyor. Lisanslar.Count gibi bir kod ile satır sayısını alabiliyor muyuz?
3- Birkaç örnekte property lere indexlerinde tanımlandığını gördüm. Bu indexler hangi amaçla kullanılıyor? Bende kullanmalı mıyım?
IS_OPTN = $0001;
IS_NLBL = $0004;
IS_REF = $0080;
ismailkocacan
Üye
Mesajlar: 88
Kayıt: 25 Eyl 2011 06:11
Konum: İstanbul
İletişim:

Re: Web Service Remotable

Mesaj gönderen ismailkocacan »

GetLicenseInfoA fonksiyonunu nasıl çağırdınız ? Yani nasıl bir kodlama yaptınız ?
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: Web Service Remotable

Mesaj gönderen Okann »

Fonksiyonu aşağıdaki gibi kullanıyorum. Sonuç istediğim gibi ama her satırda Status ve StatusMsg dönüyor haliyle. Status ve StatusMsg aslında benim için genel bir sonuç döndürmeli. Yani exception kontrolü gibi düşünebiliriz. Bu arada 2. soruma çözümüde bulmuş oldum.

Kod: Tümünü seç

var
  Service: IWS_DN;
  License: TLicenseInfo;
  LicensesInfo: TLicenseInfoA;
  CreatedDate: TXSDateTime;
  Len, I: Integer;
begin
  Service := GetIWS_DN();
  License := Service.GetLicenseInfo(
    'abcd',
    '1234',
    '77U890I3-572J7798-1234JJ74-00902311');
  CreatedDate := TXSDateTime.Create;
  CreatedDate.XSToNative(DateTimeToStr(License.CreationDate.AsUTCDateTime));
  ShowMessage(
    '[' + IntToStr(License.Status) + '] ' +
    License.StatusMsg + #13#10 +
    CreatedDate.NativeToXS);

  LicensesInfo := Service.GetLicenseInfoA(
    'abcd',
    '1234');
  Len := Length(LicensesInfo);
  
  for I := 0 to Len - 1 do
  begin
    if Assigned(LicensesInfo[I]) then
    begin
      ShowMessage(LicensesInfo[I].ProductID);
    end;
  end;
  
        ShowMessage(LicensesInfo[???].StatusMsg); ????
  
end;
Cevapla