Building a stand-alone Web service with Indy

By: Dave Nottage

Abstract: This article shows how to build a Web service using Indy and Delphi 6. By Dave Nottage.

This article explains how to fit Indy into Delphi 6's Web services (SOAP) support. For more on creating Web services, please refer to Nick Hodges's excellent Borland Community article, Shakespeare on the Web.

I can't remember exactly why I built the application that follows. For whatever reason, I needed to find an easy way of building a stand-alone Web service -- that is, one that doesn't require a Web server.

A recent post in the borland.public.delphi.webservices.soap newsgroup and a gentle hint from elsewhere have prompted me to drag out the code, clean it up, and brush a few of the cobwebs out of my head. This article is the result.

Fitting Indy into WebBroker

The components in Delphi 6's SOAP support are based around WebBroker. Typically in a WebBroker application, a component that implements IWebDispatch lives on a TWebModule. In the case of a SOAP server, it's THTTPSoapDispatcher:

SOAP Web Module

The major goal here was to leave as much of this default arrangement intact as possible. So instead of attempting to fiddle with the SOAP components, I stuck with WebBroker.

Looking at the WebBroker architecture, I noted that the underlying technology is independent of the type of application. ISAPI, CGI, whatever -- it doesn't matter. The basic principles are the same: You have a request from the client (TWebRequest) and a response from the server (TWebResponse). 

Indy's Request/Response mechanism of TIdHTTPServer is similar, so I figured I could simply create wrapper classes similar to those used in ISAPI and CGI applications, and hook them into the CommandGet method of TIdHTTPServer so requests would be handled.

The result is the code in IndyApp.PAS and IndyHTTP.PAS (which correspond to xxxApp and xxxHTTP for ISAPI, CGI, COM, and son on). Note that not all of the methods of TWebRequestIndy and TWebResponseIndy have complete implementations. Perhaps someone with more knowledge of Indy than I have can finish it off. <g>

Turning a WebAppDebugger app into Indy

Since there is no "Indy SOAP Server Application" wizard (perhaps I'll find time to build one later), and the aim was to create a stand-alone executable, the most logical choice was to start with the SOAP Server Application wizard (File | New | Other, WebServices tab, SOAP Server Application):

Gallery - Web Services

...and choose Web App Debugger executable. That's just what I did. I used a dummy CoClass name, because the code generated for it would be removed later:

New SOAP Server

In the main form unit's implementation:

unit Unit1;

interface

uses
  SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses ComApp;

{$R *.DFM}

const
  CLASS_ComWebApp: TGUID = '{44139136-EFD0-4044-8A3C-13484508A833}';

initialization
  TWebAppAutoObjectFactory.Create(Class_ComWebApp, 'Dummy', 'Dummy Object');

end.

I removed the uses clause, the CLASS_ComWebApp const, and the initialization section. The conditional define: {$APPTYPE GUI} was not required, so that was removed also. In the uses clause, I changed COMApp to IndyApp, and the DefaultPort property was set to what I wanted (1024) before Application.Initialize, with Active set to true once the main form had been created.

Service, please

Using the Invokable Wizard (which I co-authored with Borland), I created a simple interface and invokable class. The implementation unit (DemoImpl) was added to the project's uses clause (to make sure that the invokable class is registered when the app runs), and I was away!

I ran the app, pointed my browser at http://localhost:1024/wsdl/IDemo, and lo and behold, the WSDL was published!

Thanks to my hours of blood, sweat and tears, you too can have your own stand-alone Web service application, all without the aid of .NET -- or even a Web server.

Refer to Nick Hodges's article for advice on how to create a Web service client to access the Web service.

The code for this article can be downloaded here.

Dave Nottage is CEO of Pure Software Technology, a software development company specializing in Delphi. He can be reached at dave@b3.com.au and the company's website is http://www.puresoftwaretech.com


Server Response from: ETNASC02