We have no SOAP implementation in Pharo (yet). But that does not mean we cannot 
do simple SOAP calls. Here is a practical example: checking the validity of a 
EU VAT number. 

This is a public service offered by the EU through a SOAP API. The WSDL can be 
found here: http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl

From this we know that the endpoint is 
http://ec.europa.eu/taxation_customs/vies/services/checkVatService

When you paste the WSDL URL in http://wsdlbrowser.com you can explore the API 
(this site parses the WSDL to reveal its contents). The call that we need is 
called 'checkVat'. We can copy the call template and POST it to the endpoint, 
manually. If we load the XML Parser, we can interpret the result.

Here is the complete code:

| xml result |
xml := ZnEntity 
        with: (
'<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"; 
xmlns:ns1="urn:ec.europa.eu:taxud:vies:services:checkVat:types">
  <SOAP-ENV:Body>
    <ns1:checkVat>
      <ns1:countryCode>{1}</ns1:countryCode>
      <ns1:vatNumber>{2}</ns1:vatNumber>
    </ns1:checkVat>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>' format: #('LU' '20165772')) 
        type: ZnMimeType applicationXml.
result := ZnClient new 
        url: 
'http://ec.europa.eu/taxation_customs/vies/services/checkVatService'; 
        entity: xml;
        contentReader: [ :entity | XMLDOMParser parse: entity contents ]; 
        post.
((result allElementsNamed: 'checkVatResponse') first 
        elementsCollect: [ :each | each name -> each contentString ]) 
asDictionary.

=>

a Dictionary(
  'address'->'31, RUE STE ZITHE L-2763  LUXEMBOURG' 
  'countryCode'->'LU' 
  'name'->'ITUNES S.A R.L.' 
  'requestDate'->'2015-03-03+01:00' 
  'valid'->'true' 
  'vatNumber'->'20165772' )

Of course, this will only work with simple SOAP interfaces.

Sven

--
Sven Van Caekenberghe
Proudly supporting Pharo
http://pharo.org
http://association.pharo.org
http://consortium.pharo.org





Reply via email to