Home arrow Delphi-Kylix arrow Page 4 - Web Services Made Easy With Delphi
DELPHI-KYLIX

Web Services Made Easy With Delphi


Web services are being used more and more on the Internet, thanks to (among other advantages) their cross-platform compatibility. In this article, the first of three parts, we will cover what a web service is and how it works, and look at some examples of XML and SOAP messages.

Author Info:
By: Leidago
Rating: 3 stars3 stars3 stars3 stars3 stars / 19
October 23, 2006
TABLE OF CONTENTS:
  1. · Web Services Made Easy With Delphi
  2. · Why use XML (eXtensible Markup Language)?
  3. · Why SOAP (Simple Object Access Protocol)?
  4. · Web Service Description Language (WSDL)

print this article
SEARCH DEVARTICLES

TOOLS YOU CAN USE

advertisement
Web Services Made Easy With Delphi - Web Service Description Language (WSDL)
(Page 4 of 4 )

WSDL is a document that is written in XML. Its primary purpose is to describe a web service. It holds the following information about a web service:

  • The location of the service or the URL.
  • The methods it uses and the parameters that it takes.
  • The results of the methods and type (string, float, etc.).

Here's an example WSDL file (converted to Pascal/Delphi code) that describes the location and methods that you need to use to access the service:

// *************************************************************** //

// The types declared in this file were generated from data read from the

// WSDL File described below:

// WSDL     : http://www.webservicex.net/WeatherForecast.asmx?WSDL

// Encoding : utf-8

// Version  : 1.0

// (10/08/2006 16:26:14 - 1.33.2.5)

// *************************************************************** //

unit WeatherForecast;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

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 Borland 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"

  // !:float           - "http://www.w3.org/2001/XMLSchema"

  WeatherData          = class;                 { "http://www.webservicex.net" }

  WeatherForecasts     = class;                 { "http://www.webservicex.net" }

  // *************************************************************** //

  // Namespace : http://www.webservicex.net

  // ************************************************************** //

  WeatherData = class(TRemotable)

  private

    FDay: WideString;

    FWeatherImage: WideString;

    FMaxTemperatureF: WideString;

    FMinTemperatureF: WideString;

    FMaxTemperatureC: WideString;

    FMinTemperatureC: WideString;

  published

    property Day: WideString read FDay write FDay;

    property WeatherImage: WideString read FWeatherImage write FWeatherImage;

    property MaxTemperatureF: WideString read FMaxTemperatureF write FMaxTemperatureF;

    property MinTemperatureF: WideString read FMinTemperatureF write FMinTemperatureF;

    property MaxTemperatureC: WideString read FMaxTemperatureC write FMaxTemperatureC;

    property MinTemperatureC: WideString read FMinTemperatureC write FMinTemperatureC;

  end;

  ArrayOfWeatherData = array of WeatherData;    { "http://www.webservicex.net" }

  // ************************************************************** //

  // Namespace : http://www.webservicex.net

  // ************************************************************** //

  WeatherForecasts = class(TRemotable)

  private

    FLatitude: Single;

    FLongitude: Single;

    FAllocationFactor: Single;

    FFipsCode: WideString;

    FPlaceName: WideString;

    FStateCode: WideString;

    FStatus: WideString;

    FDetails: ArrayOfWeatherData;

  public

    destructor Destroy; override;

  published

    property Latitude: Single read FLatitude write FLatitude;

    property Longitude: Single read FLongitude write FLongitude;

    property AllocationFactor: Single read FAllocationFactor write FAllocationFactor;

    property FipsCode: WideString read FFipsCode write FFipsCode;

    property PlaceName: WideString read FPlaceName write FPlaceName;

    property StateCode: WideString read FStateCode write FStateCode;

    property Status: WideString read FStatus write FStatus;

    property Details: ArrayOfWeatherData read FDetails write FDetails;

  end;

  // *************************************************************** //

  // Namespace : http://www.webservicex.net

  // soapAction: http://www.webservicex.net/%operationName%

  // transport : http://schemas.xmlsoap.org/soap/http

  // style     : document

  // binding   : WeatherForecastSoap

  // service   : WeatherForecast

  // port      : WeatherForecastSoap

  // URL       : http://www.webservicex.net/WeatherForecast.asmx

  // *************************************************************** //

  WeatherForecastSoap = interface(IInvokable)

  ['{45A46EB0-5550-8C38-49AC-AE13AD113F74}']

    function  GetWeatherByZipCode(const ZipCode: WideString): WeatherForecasts; stdcall;

    function  GetWeatherByPlaceName(const PlaceName: WideString): WeatherForecasts; stdcall;

  end;

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

implementation

function GetWeatherForecastSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): WeatherForecastSoap;

const

  defWSDL = 'http://www.webservicex.net/WeatherForecast.asmx?WSDL';

  defURL  = 'http://www.webservicex.net/WeatherForecast.asmx';

  defSvc  = 'WeatherForecast';

  defPrt  = 'WeatherForecastSoap';

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 WeatherForecastSoap);

    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;

destructor WeatherForecasts.Destroy;

var

  I: Integer;

begin

  for I := 0 to Length(FDetails)-1 do

    if Assigned(FDetails[I]) then

      FDetails[I].Free;

  SetLength(FDetails, 0);

  inherited Destroy;

end;

initialization

  InvRegistry.RegisterInterface(TypeInfo(WeatherForecastSoap), 'http://www.webservicex.net', 'utf-8');

  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(WeatherForecastSoap), 'http://www.webservicex.net/%operationName%');

  InvRegistry.RegisterInvokeOptions(TypeInfo(WeatherForecastSoap), ioDocument);

  RemClassRegistry.RegisterXSClass(WeatherData, 'http://www.webservicex.net', 'WeatherData');

  RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfWeatherData), 'http://www.webservicex.net', 'ArrayOfWeatherData');

  RemClassRegistry.RegisterXSClass(WeatherForecasts, 'http://www.webservicex.net', 'WeatherForecasts');

end.

When you read the information above, it is pretty easy to see what methods are available and how you can read them.

Conclusion

In this first part of the series we've covered what a web service is and how it works. We have also looked at some examples of what XML and SOAP messages look like. In the next installment we will be looking into building our own web service and client.


DISCLAIMER: The content provided in this article is not warranted or guaranteed by Developer Shed, Inc. The content provided is intended for entertainment and/or educational purposes in order to introduce to the reader key ideas, concepts, and/or product reviews. As such it is incumbent upon the reader to employ real-world tactics for security and implementation of best practices. We are not liable for any negative consequences that may result from implementing any information covered in our articles or tutorials. If this is a hardware review, it is not recommended to open and/or modify your hardware.

blog comments powered by Disqus
DELPHI-KYLIX ARTICLES

- Loading an XML Document into the DOM
- Delphi Wrapper Classes and XML
- Delphi and the DOM
- Delphi and XML
- Internet Access: Client Service
- Finishing the Client for an Internet Access ...
- The Client for an Internet Access Control Ap...
- User Management for an Internet Access Contr...
- Important Procedures for an Internet Access ...
- Server Code for an Internet Access Control A...
- Constructing the Interface for an Internet A...
- Building a Server Application for an Interne...
- Building an Internet Access Control Applicat...
- Client Dataset: Working with Data Packets an...
- Using the Client Dataset in an N-Tiered Appl...

Dev Articles Forums 
 RSS  Articles
 RSS  Forums
 RSS  All Feeds
Weekly Newsletter
 
Developer Updates  
Free Website Content 
Contact Us 
Site Map 
Privacy Policy 
Support 



© 2003-2012 by Developer Shed. All rights reserved. DS Cluster 2 - Follow our Sitemap
Popular Web Development Topics
All Web Development Tutorials