Web Servis e HTTP Header eklemek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Web Servis e HTTP Header eklemek

Mesaj gönderen vkamadan »

Merhaba değerli üyeler ,
bağlantı kurmak istediğim web servis sağlayıcısı ilave olarak HTTP header la bazı bilgiler istemektedir, SOAP Header gönderiyorum XML içinde fakat HTTP header ı nasıl göndereceğimi çözemedim.

İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: Web Servis e HTTP Header eklemek

Mesaj gönderen Battosai »

Farklı protokoller bunlar. Pek anlamadım. İsteği HTPP ile mi gönderiyorsunuz ?
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Web Servis e HTTP Header eklemek

Mesaj gönderen vkamadan »

Merhaba ,
WSDL Importer ile Interface uniti oluşturarak THTTPRIO ile gönderiyorum , sonuç olarak XML i HTTP REST server a kendi içinde HTTP üzerinde gönderdiği için bir şekilde header da eklenebilir düşüncesindeyim ama nasıl :)
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Web Servis e HTTP Header eklemek

Mesaj gönderen mrmarman »

Merhaba.

SOAP çok çalıştım ama sorduğunuz şekilde (ek olarak HTTP header ihtiyacı meselesi) tecrübem olmadı. Umarım aşağıdaki bilgi amaca uygundur.

Google'dan şöyle bir bakımdım. SOAP yanında HTTP header ihtiyacı, authentication için duyulmuş. Örnekler mevcut ve çoğu "Bing Maps" platformuna girerken buna ihtiyaç duymuş.

HTTP headerlar; "HTTP Basic/Digest" stilinde auth. olup oturum açmak amacıyla kullanılırken, SOAP headerlar "WS-Security" stilindeki auth. olup oturum açmakta kullanılıyormuş.

Bu işlem WebNode'un onBeforePost eventinde gerçekleşiyormuş.

Kod: Tümünü seç

procedure TForm1.HTTPRIO1HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp;
  Data: Pointer);
bir çok farklı örnek içerisinde sanırım aşağıdaki daha genel kapsamlı bir header imkanı sağlıyor;
USES'a HttpAddRequestHeaders fonksiyonu için "WinInet" eklemeyi unutmayınız

Kod: Tümünü seç

const 
  sCUSTOM_HEADER = 'X-Custom: value'; 
begin 
  HttpAddRequestHeaders(Data, PChar(sCUSTOM_HEADER), 
  Length(sCUSTOM_HEADER), HTTP_ADDREQ_FLAG_ADD); 
end;
Şeklinde kullanılmış. :idea:
Resim
Resim ....Resim
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Web Servis e HTTP Header eklemek

Mesaj gönderen vkamadan »

Merhaba @mrmarman,

Öncelikle vakit ayırıp bu detaylı ve değerli bilgiyi paylaştığınız için teşekkür ederim , evet bu yöntemle istediğimiz HTTP Header ı ekleyebildik çok teşekkür ederim.

İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
oguthan
Üye
Mesajlar: 34
Kayıt: 30 May 2005 10:23

Re: Web Servis e HTTP Header eklemek

Mesaj gönderen oguthan »

S.a.
Arkadaşlar aşağıdaki web servisten bilgi çekmek istiyorum anca bu web servis konusunda daha başlangıç seviyesinde olduğum için bazı noktaları çözemiyorum yardımcı olursanız sevinirim.

mesela aşağıdaki function GetCurrency: string; stdcall; isimli fonksiyonu çağırmak istiyorum tabi bunun için wsdl'yi import ettim müteakiben formuma bir adet HTTPRIO ekledim amacım şu GetCurrency isimli prosedürü çağırıp sonuçlarını memo text'e almak

Kod: Tümünü seç

  DovizRIO.HTTPWebNode.UserName:='AltinkaynakWebServis';
  DovizRIO.HTTPWebNode.Password:='AltinkaynakWebServis';
 [b] Memo.Text:=DovizRIO as DataService.GetDataServiceSoap.GetCurrency[/b];
Memo.text satırımda [DCC Error] MainForm.pas(39): E2015 Operator not applicable to this operand type şeklinde bir hata alıyorum servisi sunan firma da ilgili fonksiyona açıklama olarak aşağıdaki //Headers: AuthHeader:pIn yazmış ancak tıkantım kaldım. :(
// Headers: AuthHeader:pIn
function GetCurrency: string; stdcall;

Kod: Tümünü seç

// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL     : http://data.altinkaynak.com/DataService.asmx?WSDL
//  >Import : http://data.altinkaynak.com/DataService.asmx?WSDL>0
// Encoding : utf-8
// Version  : 1.0
// (27.01.2014 11:28:04 - - $Rev: 37707 $)
// ************************************************************************ //

unit DataService;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

const
  IS_OPTN = $0001;
  IS_REF  = $0080;


type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Embarcadero types; however, they could also 
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:string          - "http://www.w3.org/2001/XMLSchema"[Gbl]

  AuthHeader2          = class;                 { "http://data.altinkaynak.com/"[Hdr][GblCplx] }
  AuthHeader           = class;                 { "http://data.altinkaynak.com/"[Hdr][GblElm] }



  // ************************************************************************ //
  // XML       : AuthHeader, global, <complexType>
  // Namespace : http://data.altinkaynak.com/
  // Info      : Header
  // ************************************************************************ //
  AuthHeader2 = class(TSOAPHeader)
  private
    FUsername: string;
    FUsername_Specified: boolean;
    FPassword: string;
    FPassword_Specified: boolean;
    procedure SetUsername(Index: Integer; const Astring: string);
    function  Username_Specified(Index: Integer): boolean;
    procedure SetPassword(Index: Integer; const Astring: string);
    function  Password_Specified(Index: Integer): boolean;
  published
    property Username: string  Index (IS_OPTN) read FUsername write SetUsername stored Username_Specified;
    property Password: string  Index (IS_OPTN) read FPassword write SetPassword stored Password_Specified;
  end;



  // ************************************************************************ //
  // XML       : AuthHeader, global, <element>
  // Namespace : http://data.altinkaynak.com/
  // Info      : Header
  // ************************************************************************ //
  AuthHeader = class(AuthHeader2)
  private
  published
  end;


  // ************************************************************************ //
  // Namespace : http://data.altinkaynak.com/
  // soapAction: http://data.altinkaynak.com/%operationName%
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : document
  // use       : literal
  // binding   : DataServiceSoap12
  // service   : DataService
  // port      : DataServiceSoap12
  // URL       : http://data.altinkaynak.com/DataService.asmx
  // ************************************************************************ //
  DataServiceSoap = interface(IInvokable)
  ['{9DF8C0DA-A374-87C1-82C1-937930273A0F}']

    // Headers: AuthHeader:pIn
    function  GetCurrency: string; stdcall;

    // Headers: AuthHeader:pIn
    function  GetGold: string; stdcall;

    // Headers: AuthHeader:pIn
    function  GetMain: string; stdcall;

    // Headers: AuthHeader:pIn
    function  GetParity: string; stdcall;
  end;

function GetDataServiceSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): DataServiceSoap;


implementation
  uses SysUtils;

function GetDataServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): DataServiceSoap;
const
  defWSDL = 'http://data.altinkaynak.com/DataService.asmx?WSDL';
  defURL  = 'http://data.altinkaynak.com/DataService.asmx';
  defSvc  = 'DataService';
  defPrt  = 'DataServiceSoap12';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as DataServiceSoap);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;


procedure AuthHeader2.SetUsername(Index: Integer; const Astring: string);
begin
  FUsername := Astring;
  FUsername_Specified := True;
end;

function AuthHeader2.Username_Specified(Index: Integer): boolean;
begin
  Result := FUsername_Specified;
end;

procedure AuthHeader2.SetPassword(Index: Integer; const Astring: string);
begin
  FPassword := Astring;
  FPassword_Specified := True;
end;

function AuthHeader2.Password_Specified(Index: Integer): boolean;
begin
  Result := FPassword_Specified;
end;

initialization
  { DataServiceSoap }
  InvRegistry.RegisterInterface(TypeInfo(DataServiceSoap), 'http://data.altinkaynak.com/', 'utf-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(DataServiceSoap), 'http://data.altinkaynak.com/%operationName%');
  InvRegistry.RegisterInvokeOptions(TypeInfo(DataServiceSoap), ioDocument);
  InvRegistry.RegisterInvokeOptions(TypeInfo(DataServiceSoap), ioSOAP12);
  { DataServiceSoap.GetCurrency }
  InvRegistry.RegisterMethodInfo(TypeInfo(DataServiceSoap), 'GetCurrency', '',
                                 '[ReturnName="GetCurrencyResult"]', IS_OPTN);
  InvRegistry.RegisterHeaderClass(TypeInfo(DataServiceSoap), AuthHeader, 'AuthHeader', 'http://data.altinkaynak.com/');
  { DataServiceSoap.GetGold }
  InvRegistry.RegisterMethodInfo(TypeInfo(DataServiceSoap), 'GetGold', '',
                                 '[ReturnName="GetGoldResult"]', IS_OPTN);
  { DataServiceSoap.GetMain }
  InvRegistry.RegisterMethodInfo(TypeInfo(DataServiceSoap), 'GetMain', '',
                                 '[ReturnName="GetMainResult"]', IS_OPTN);
  { DataServiceSoap.GetParity }
  InvRegistry.RegisterMethodInfo(TypeInfo(DataServiceSoap), 'GetParity', '',
                                 '[ReturnName="GetParityResult"]', IS_OPTN);
  RemClassRegistry.RegisterXSClass(AuthHeader2, 'http://data.altinkaynak.com/', 'AuthHeader2', 'AuthHeader');
  RemClassRegistry.RegisterXSClass(AuthHeader, 'http://data.altinkaynak.com/', 'AuthHeader');

end.
oguthan
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Web Servis e HTTP Header eklemek

Mesaj gönderen unicorn64 »

Kod: Tümünü seç

Memo.Text:=(DovizRIO as DataService.GetDataServiceSoap).GetCurrency;
şeklinde dener misiniz
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
oguthan
Üye
Mesajlar: 34
Kayıt: 30 May 2005 10:23

Re: Web Servis e HTTP Header eklemek

Mesaj gönderen oguthan »

[DCC Error] MainForm.pas(38): E2015 Operator not applicable to this operand type şeklinde hata alıyorum
oguthan
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Web Servis e HTTP Header eklemek

Mesaj gönderen vkamadan »

Merhaba ,

standart ta aşağıda ki örnekte olduğu gibi servisi yükleyip altındaki metodları çalıştırabilirsiniz.

Kod: Tümünü seç

procedure Test ;
var
 intServis :  DataServiceSoap ;
begin
  intServis := GetDataServiceSoap(False , '' , DovizRIO);

   ShowMessage( intServis.GetCurrency );

end;
Volkan KAMADAN
www.polisoft.com.tr
oguthan
Üye
Mesajlar: 34
Kayıt: 30 May 2005 10:23

Re: Web Servis e HTTP Header eklemek

Mesaj gönderen oguthan »

hocam kusura bakmayın başınızı ağrıttım. denedim ancak bu defa da Object referance not set an instance of an object hatası aldım.
amacım http://www.altinkaynak.com/Servisler adresindeki
Kullanıcı adı : AltinkaynakWebServis ve Şifresi : AltinkaynakWebServis olan http://data.altinkaynak.com/DataService.asmx servisinden anlık döviz kurları bilgisini almak ancak bit türlü gördüğünüz üzere yapamadım :( ilginiz içinde ayrıca teşekkür ederim.

Bu kullanıcıya GetCurrency, GetGold ve GetMain servisleri açık olup GetParity servisi kapalıdır.
oguthan
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Web Servis e HTTP Header eklemek

Mesaj gönderen vkamadan »

Merhabalar ,
Kusura bakmayın biraz dikkatli bakınca kullanıcı otantikasyonunun Basic değil, SOAP Header ile yapıldığını fark ettim kodu şöyle düzenlerseniz sorun olmaz.

Kod: Tümünü seç

procedure Test;
var
intService : DataServiceSoap ;
intUser : AuthHeader;
begin
  intUser := AuthHeader.Create ;
  intUser.Username := 'AltinkaynakWebServis';
  intUser.Password := 'AltinkaynakWebServis';


  intService := GetDataServiceSoap;

  (intService as ISOAPHeaders).Send( intUser );
  ShowMessage( intService.GetCurrency );
end;
uses a InvokeRegistry eklemeyi unutmayın , kodu özetleyecek olursak ;
WSDL importer ile oluşturduğunuz unit içinde tanımlı TSOAPHeader dan türetilmiş "AuthHeader" nesnesi ni oluşturup dolduruyoruz , sonra bu HEADER ı servis talebinden önce SOAP mesajına ekliyoruz. son olarak servisi çağırıyoruz.

İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
oguthan
Üye
Mesajlar: 34
Kayıt: 30 May 2005 10:23

Re: Web Servis e HTTP Header eklemek

Mesaj gönderen oguthan »

Hocam öncellikle geri dönüşleriniz için teşekkür ederim. rahatsızlığım nedeni ile deneyemedim. birazdan deneip sonuçları sizinle paylaşacağım. çok teşekkür ederim.
oguthan
oguthan
Üye
Mesajlar: 34
Kayıt: 30 May 2005 10:23

Re: Web Servis e HTTP Header eklemek

Mesaj gönderen oguthan »

hocam çok teşekkür ederim. düzgün bir biçimde çalışıyor.
oguthan
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Web Servis e HTTP Header eklemek

Mesaj gönderen vkamadan »

oguthan yazdı:hocam çok teşekkür ederim. düzgün bir biçimde çalışıyor.
Rica ederim iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Deftersoft
Üye
Mesajlar: 1
Kayıt: 25 Kas 2014 04:17

Re: Web Servis e HTTP Header eklemek

Mesaj gönderen Deftersoft »

Volkan bey meraba.
WDSL Importer ile uniti oluşturdum. buton clik üzerine test kısmındaki kodları yazdım. tıkladığımda gelen mesaj "Value cannot be null. Paremeter name : username" şeklinde dönüyor. bu konuda acemiyim. Yardımcı olursanız sevinirim.
Cevapla