- First we have to find web service we want to consume. In very serious project, you can create your own web service(s). For our tutorial we will visit www.xmethods.com that lists some web services to see if we can find an interesting one. Once you are there, click the Full list link at the bottom to view all the web services.
I found this one is interesting: QuoteOfTheDay. It says that this web service "Returns a daily random quote and its author.". Very interesting. Now click its link so we can get the wsdl of this web service. When opening the link, you will get to a page that has link to QuoteOfTheDay's wsdl (at the top, see picture). Let's copy this link.
- Open Delphi, and create new application, save both project and the main form. Now we want to import the wsdl into Delphi object(s).
- Click menu File- New - Other. From the dialog, select tab Web service and then select WSDL Importer (see picture below). This will start WSDL import wizard.
When the wizard started, it will ask for WSDL location to import. Since we have copied this information, just paste into the edit box then click button Next.
The wizard will show you the preview of the imported WSDL. Click button Finish to finish the wizard and use the imported codes.
The wizard then will create a new unit with name related with the web service. Now save this unit. In my case, I named the unit QuoteOfTheDay.
Before moving on, let's inspect the new unit. QuoteOfTheDay unit contains a class named Quotes having two properties, i.e. QuoteOfTheDay and Author. We can safely assume that the web service will return the quotes to our Delphi application using this class.
Beside the Quotes class, we also have QuoteofTheDaySoap interface. This interface only has one method, i.e. function GetQuote which returns an instance of Quotes class. Then we know that to get quote(s) from the web service we must execute this method, and then read the quote(s) from the returned instance of Quotes class.
But how can we invoke GetQuote method? Since it's declared in an interface, we can not directly call it. We need an object that supports the interface. Luckily for us, inside the new unit we also have public function GetQuoteofTheDaySoap which returns an object that supports QuoteofTheDaySoap interface. Further inspection on the function's body reveals that the function uses an instance of THTTPRIO and cast it into QuoteofTheDaySoap interface (see if you can find this line: "Result := (RIO as QuoteofTheDaySoap);"). So actually THTTPRIO is our SOAP client. Now we know that in order to consume a web service, we need an instance of THTTPRIO. Btw, THTTPRIO is available in design time (for drag and drop). Find it in component pallette in tab Web Services.
Let's move on with our project.
- Drop a TLabel onto our main form. Adjust its size and location. Name this TLabel as lblQuote.
- Drop a TButton or TBitBtn onto the main form. Adjust its location to be below lblQuote. Set its caption into "Refresh Now!".
- Add QuoteOfTheDay unit into our uses list.
- Add a function method named GetRandomQuote which returns string into protected section of the main form. Use the following codes for its implementation:
function TForm1.GetRandomQuote: string; var vQuoteSoap: QuoteofTheDaySoap; vQuote: Quotes; begin vQuoteSoap := GetQuoteofTheDaySoap; vQuote := vQuoteSoap.GetQuote; try Result := Format('"%s"'#13#10'(%s)', [vQuote.QuoteOfTheDay, vQuote.Author]); finally vQuote.Free; end; end;
- Add the following codes for the button's OnClick event
procedure TForm1.BitBtn1Click(Sender: TObject); var vQuote: string; begin try vQuote := GetRandomQuote; lblQuote.Caption := vQuote; except end; end;
- I also want that the quote gets updated automatically in 10 seconds interval. So drop a TTimer into our main form, set its interval into 10000 and enable it. Set its OnTimer event handler to point to the button's OnClick event handler. Since they both use same parameter, we can use same event handler method for them.
- Now we are finished with our web service consumer. Press F9 to compile and run your project. See if you get quotes similar like shown below:
Edited by LuthfiHakim, 12 April 2012 - 01:27 AM.