Introduction into SOAP, setting up a simple webservice with PHP SOAP

I was asked to create a simple webservice that would allow us to transfer a intranet post to an external CMS. In this post I will explain the steps you must take to set-up a simple webservice with the PHP SOAP extension.

The first step, create a simple class that we will use to request data from
We will create a class with one method that returns a string with the parameter we called it. The method will accept one parameter and will check if the value is correct.


Nothing special here, notice that we don’t throw a normal exception but return the SoapFault instead so we can handle the error clientside.

The second step, create a WSDL document

The WSDL document is a simple XML document that describes:
– the service itself
– the operations of the service
– the data types used in the service

The WSDL will describe our method getItem from our Blog service class so we can call it later on.

So how does this WSDL thing look like?

<?xml version="1.0" encoding="UTF-8" ?>
<definitions name="Entities"
            targetNamespace="urn:blog"
            xmlns:typens="urn:blog"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
            xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
            xmlns="http://schemas.xmlsoap.org/wsdl/">
    <types>
        <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:blog">
        </xsd:schema>
    </types>

    <message name="getItemResponse">
        <part name="string" type="xsd:string" />
    </message>

     <message name="getItemRequest">
        <part name="return" type="xsd:string" />
    </message>

    <portType name="blogPortType">
        <operation name="getItem">
            <documentation>Returns a simple test string</documentation>
            <input message="typens:getItemRequest" />
            <output message="typens:getItemResponse" />
        </operation>
    </portType>

    <binding name="blogBinding" type="typens:blogPortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

        <operation name="getItem">
            <soap:operation soapAction="urn:blog#getItem" style="rpc" />
            <input>
                <soap:body use="encoded" namespace="urn:blog" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </input>
            <output>
                <soap:body use="encoded" namespace="urn:blog" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
            </output>
        </operation>
        
    </binding>

    <service name="blog">
        <port name="blogPort" binding="typens:blogBinding">
            <soap:address location="http://{siteUrl}/webservice/server.php" />
        </port>
    </service>
</definitions>

As you can see the WSDL consists of different parts:

– the namespace
– the types
– messages
– ports (the porttype contains the set of operations, each operation has its own input and output messages)
– bindings (tells how to transport the requests, it describes the protocol used, just like the ports it contains the set of operations used)
– service (defines the ports that are supported by the service, its a collection of ports)

The third step, map our Blog service class to the webserver

After we have created our WSDL we can start building our server. In just a few lines we have a SOAP server up and running.

 // Init the server
$oServer = new SoapServer('blog.wsdl');

// Register the blog service class and all the methods
$oServer->setClass('BlogService');

// Rock 'n roll
$oServer->handle();

The fourth and final step, test our webservice

Its a good idea to test the webservice with a program like soapUI, it often can provide some additional information when troubleshooting. (They have a free version available on their website).

To test our webservice in PHP we can use the following code:

ini_set("soap.wsdl_cache_enabled", "0"); // Disable the wsdl cache

$oClient = new SoapClient(
				// Url to our wsdl, http://{siteUrl}/webservice/index.php?wsdl is also possible
				'{siteUrl}/webservice/blog.wsdl', 
				array(
					'trace'  => true,
					'exceptions'=> true
				));

try {
	$aResult = $oClient->getItem(4);
	var_dump($aResult);
} catch (SoapFault $e) {
	exit($e->faultstring);
}

You should see a SOAP fault, because the id number 4 we gave to the getItem function didn’t exist in our Blog service class. Change the value to 1,2,3 or 5 and you should get a nice response back.
Another pretty neat function is $oClient->__getFunctions(); it will return all the function that are available in the webservice.

This was just a short introduction to SOAP, a lot more is possible with SOAP.
Special thanks to David Zuelke for the nice SOAP introduction at the PHPbenelux conference 2010.

Example files:
Webservice.rar

Just deploy the example files on your webserver, change the {siteUrl} values in the files with your domain and call the client.php

Comments

264 responses to “Introduction into SOAP, setting up a simple webservice with PHP SOAP”

  1. gelatin trick Avatar

    Your style is really unique compared to other people I’ve read stuff from.
    Thanks for posting when you’ve got the opportunity,
    Guess I will just bookmark this web site.

  2. gelatin trick Avatar

    This site really has all of the information I needed concerning this subject and didn’t know who to ask.

  3. gelatin weight loss challenge Avatar

    I think the admin of this web site is really working hard in support of his website, since here every data is quality based data.

  4. 확인 Avatar

    Hi to every body, it’s my first pay a quick visit of this website; this weblog consists
    of awesome and really good stuff for readers.

  5. strona binance Avatar

    Hi, just wanted to mention, I enjoyed this article.
    It was inspiring. Keep on posting!

  6. Paito HK Avatar

    This is a topic that is close to my heart…
    Best wishes! Exactly where are your contact details though?

  7. jasa basmi rayap Avatar

    Wow! Terima kasih! Saya selalu ingin menulis di situs saya sesuatu seperti itu. Bolehkah saya mengambil fragmen dari posting Anda ke blog saya?

  8. jasa basmi rayap Avatar

    Menakjubkan! Blog ini terlihat persis seperti blog lama saya! Topiknya sepenuhnya berbeda tetapi memiliki layout halaman dan desain yang hampir sama. Pilihan yang sangat bagus!

  9. registrace Binance Avatar

    First off I would like to say excellent blog!
    I had a quick question which I’d like to ask if you do not mind.

    I was interested to find out how you center yourself and clear your thoughts
    before writing. I have had trouble clearing my mind in getting my ideas out.

    I do enjoy writing but it just seems like the first 10 to 15 minutes are generally
    lost just trying to figure out how to begin. Any ideas or tips?
    Cheers!

  10. Joe Doroski Avatar

    Instant access to millions of digital products you can brand and sell as your own 🚀 ! ✓ Expansive kids’ product collection ! ✓ Hundreds of thousands of professionally written eBooks ! ✓ Fully customizable guides and workbooks ! ✓ PowerPoint and presentation templates ! ✓ Infographics and visual templates ! ✓ High-definition logo templates ! ✓ Print-on-demand T-shirt designs ! ✓ Video editing assets and motion graphic ! ✓ Graphic design resources ! ✓ Social media content packs ! ✓ Trending digital products across multiple niches ! ✓ Business and productivity templates ! ✓ Digital art collections ! ✓ Music producer assets ! ✓ Cyberpunk-themed collections ! ✓ Advanced 3D printing files ! ✓ Planner & journal creator ! ✓ ChatGPT prompt collection ! ✓ Fitness and wellness mega bundles ! And much more to explore here : http://unlimited-ai-tools.advertising4you.co.uk

  11. casca de copiat Avatar

    Every weekend i used to pay a visit this site, for the reason that
    i want enjoyment, for the reason that this this site conations in fact
    nice funny data too.

  12. Regístrese para obtener 100 USDT Avatar

    Your point of view caught my eye and was very interesting. Thanks. I have a question for you. https://accounts.binance.com/register-person?ref=IHJUI7TF

Leave a Reply

Your email address will not be published. Required fields are marked *