Bevezetés
TL;DR
Ha szükséged van egy webszolgáltatásra, amit gyorsan kipróbálhasz, itt egy WSDL, és mögötte egy működő SOAP webszolgáltatás:
(A WSDL dokumentum egy XML dokumentum, melyet a Firefox nem jelenít meg, csak a View Page Source menüpontra kattintva. A WSDL állomány olvasható formában itt található.
Figyelem!
A 2.0.0 verzióban a címhttp://www.learnwebservices.com/services/hello?WSDL
URL-ről a
https://apps.learnwebservices.com/services/hello?WSDL
URL-re változott.
A WSDL és az XML struktúrája is egyszerűsítésre került, így a klienseket módosítani kell, vagy újra kell generálni.
Az oldal célja
Ez az oldal azért jött létre, hogy ingyenes, publikus példa SOAP webszolgáltatásokat biztosítson tanuláshoz, oktatáshoz, kísérletezéshez. Az itt található webszolgáltatások kitűnőek a technológia bemutatásához és megismeréséhez, különböző eszközök és keretrendszerek teszteléséhez. Ezen webszolgáltatásokat lehet használni dokumentációkban, példákban, tutoriálokban, videókban, hisz célom, hogy hosszú távon megmaradjanak. Az oldalon ezen kívül megtalálhatóak különböző programozási nyelven implementált kliens programok (forráskóddal együtt), melyek jó kiindulási alapot biztosíthatnak a technológia használatba vételéhez. Gyakran frissítem ezeket, ahogy kijönnek a nyelvek és keretrendszerek új verziói.
Ha kérdésed van, felteheted ebben a Gitter szobában.
Webszolgáltatásokról
A SOAP webszolgáltatások alkalmazások közötti adatcserére valók. XML és főleg HTTP(S) technológiákra támaszkodnak. Ezért ember és számítógép által is könnyen értelmezhetőek, valamint a legtöbb platformon használhatóak, ezért különösen alkalmasak különböző platformon és programozási nyelven fejlesztett alkalmazások együttműködésére. A SOAP webszolgáltatások az OASIS és W3C szabványügyi szervezetek által karbantartott szabványokon nyugszanak. WS-I szervezet több profilt fejlesztett ki a különböző implementációk együttműködésének segítségére. A SOAP egy XML alapú üzenetformátum, mely egy SOAP borítékot definiál, melyben az üzenetek utaznak. A WSDL szintén egy XML alapú interfészleíró nyelv. A SOAP webszolgáltatásokat a modernebb, egyszerűbben használható RESTful webszolgáltatások kezdik kiszorítani. Azonban még történeti jelleggel sok helyen találhatóak SOAP webszolgáltatások, melyekhez modern programokból is csatlakozni kell.
Részletek
Egy példa webszolgáltatás
A webszolgáltatás egy nevet vár, és egy üdvözlőszöveget ad vissza.
A címre a következő formátumban kell posztolni egy XML dokumentumot (a WSDL-ben leírtaknak megfelelően).
A Name
tag értéke tetszőlegesen módosítható.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<HelloRequest xmlns="http://learnwebservices.com/services/hello">
<Name>John Doe</Name>
</HelloRequest>
</soapenv:Body>
</soapenv:Envelope>
Ennek hatására a SOAP webszolgáltatás a következő válaszüzenetet adja vissza.
A név alapján változó üzenetet a Message
tag tartalmazza.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<HelloResponse xmlns="http://learnwebservices.com/services/hello">
<Message>Hello John Doe!</Message>
</HelloResponse>
</soap:Body>
</soap:Envelope>
Hibakezelés
Amennyiben hiba történik a webszolgáltatás hívása közben, pl. hibás üzenetet küldünk be, ún. SOAP faultot kapunk.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Unmarshalling Error: Unexpected '<' character in element (missing closing '>'?)
at [row,col {unknown-source}]: [6,13]</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
További webszolgáltatások
Celsius to Fahrenheit converter
Szerver alkalmazás
Egy Spring Boot alkalmazás szolgálja ki a példa webszolgáltatásokat.
Az alkalmazás elérhető a Docker Hub-on is.
A következő paranccsal futtatható.
docker run -p 8080:8080 --name my-lwsapp vicziani/lwsapp
Utána elérhető a http://localhost:8080
címen!
Kliens Implementációk
SoapUI használatával a hivatalos dokumentáció alapján létre
kell hozni egy új SOAP projektet, és a Initial WSDL beviteli mezőben megadni a https://apps.learnwebservices.com/services/hello?WSDL
címet, majd kiválasztani bal oldalon a SayHello
operációt, és megnyitni a Request 1
példa kérést. A nevet
megadni a Name
tagen belül lehet. Majd meg kell nyomni a zöld Submit request gombot.
Kattints a képre, ha egy animációt néznél meg arról, hogy kell SoapUI-jal kérést létrehozni!
Kattints a képre, ha egy animációt néznél meg arról, hogy kell egy Postman kérést létrehozni!
Az Apache JMeter használható SOAP webszolgáltatások terheléses tesztelésére is.
Kattints a képre, ha egy animációt néznél meg arról, hogy kell egy JMeter projektet létrehozni!
A webszolgáltatás a curl segítségével is meghívható a következő módon. Egyrészt POST
metódust kell használni,
majd meg kell adni, hogy a tartalom típusa XML, végül a http kérés törzsében az elküldendő
SOAP kérést.
curl --request POST --header "Content-Type: text/xml;charset=UTF-8" \
--data '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header/> \
<soapenv:Body> \
<HelloRequest xmlns="http://learnwebservices.com/services/hello"><Name>John Doe</Name></HelloRequest> \
</soapenv:Body></soapenv:Envelope>' \
https://apps.learnwebservices.com/services/hello
A webszolgáltatás Wget parancs használatával a következő módon hívható meg.
wget -qO - --header "Content-Type: text/xml;charset=UTF-8" \
--post-data '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header/> \
<soapenv:Body> \
<HelloRequest xmlns="http://learnwebservices.com/services/hello"><Name>John Doe</Name></HelloRequest> \
</soapenv:Body></soapenv:Envelope>' \
https://apps.learnwebservices.com/services/hello
A webszolgáltatás HTTPie parancs használatával a következő módon hívható meg.
echo '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header/> \
<soapenv:Body> \
<HelloRequest xmlns="http://learnwebservices.com/services/hello"><Name>John Doe</Name></HelloRequest> \
</soapenv:Body></soapenv:Envelope>' | \
http -b POST https://apps.learnwebservices.com/services/hello 'Content-Type:text/xml;charset=UTF-8'
SOAP webszolgáltatás meghívása Javaban JAX-WS RI library-vel, jaxws-maven-plugin Maven pluginnel.
A kód ugyanez CXF library-vel és cxf-codegen-plugin Maven pluginnel.
HelloEndpointService service = new HelloEndpointService();
HelloEndpoint port = service.getHelloEndpointPort();
HelloRequest request = new HelloRequest();
request.setName("John Doe");
HelloResponse response = port.sayHello(request);
System.out.println(response.getMessage());
Javaban Spring Web Services library-vel, JAX-B marshallerrel, maven-jaxb2-plugin Maven pluginnel.
HelloRequest helloRequest = new HelloRequest();
helloRequest.setName("John Doe");
JAXBElement<HelloResponse> response = (JAXBElement<HelloResponse>)
webServiceTemplate.marshalSendAndReceive(new ObjectFactory().createHelloRequest(helloRequest));
System.out.println(response.getValue().getMessage());
A következő kód mutatja be, hogy kell webszolgáltatást hívni Apache Axis2/Java library, Axis2 Databinding Framework és axis2-wsdl2code-maven-plugin Maven plugin használatával.
HelloEndpointServiceStub stub =
new HelloEndpointServiceStub();
HelloEndpointServiceStub.HelloRequest helloRequest =
new HelloEndpointServiceStub.HelloRequest();
helloRequest.setName("John Doe");
HelloEndpointServiceStub.HelloRequestE sayHelloE =
new HelloEndpointServiceStub.HelloRequestE();
sayHelloE.setHelloRequest(helloRequest);
HelloEndpointServiceStub.HelloResponseE sayHelloResponseE =
stub.sayHello(sayHelloE);
System.out.println(sayHelloResponseE
.getHelloResponse()
.getMessage());
Webszolgáltatás hívása Goovy nyelven groovy-wslite library használatával.
@Grab('com.github.groovy-wslite:groovy-wslite:1.1.2')
import wslite.soap.*
def client = new SOAPClient('https://apps.learnwebservices.com/services/hello')
def response = client.send {
body {
HelloRequest('xmlns':'http://learnwebservices.com/services/hello') {
Name("John Doe")
}
}
}
println(response.HelloResponse.Message)
Használható a Zeep library.
wsdl = 'https://apps.learnwebservices.com/services/hello?wsdl'
client = zeep.Client(wsdl=wsdl)
request = 'John Doe'
print(client.service.SayHello(request))
A webszolgáltatást böngészőből is meg lehet hívni, ha ugyanazon a domainen van, vagy be van állítva a Cross-Origin Resource Sharing (CORS).
const url = "https://apps.learnwebservices.com/services/hello";
const request = `<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<HelloRequest xmlns="http://learnwebservices.com/services/hello">
<Name>John Doe</Name>
</HelloRequest>
</soapenv:Body>
</soapenv:Envelope>`;
const fetchData = {
method: 'POST',
body: request
};
fetch(url, fetchData)
.then(function(response) {
return response.text();
})
.then(function(xml) {
const xmlDoc = new DOMParser().parseFromString(xml, "text/xml");
console.log(xmlDoc.getElementsByTagNameNS("http://learnwebservices.com/services/hello", "Message")[0].textContent);
})
.catch(function(error) {
console.log("Error calling webservice: " + error);
});
Az alábbi űrlapon a gombra kattintva megtörténik a webszolgáltatás hívás.
Használható a SOAP projekt.
const soap = require("soap");
const url = "https://apps.learnwebservices.com/services/hello?wsdl";
const args = {Name: "John Doe"};
soap.createClient(url, function(err, client) {
client.SayHello(args, function(err, result) {
console.log(result.Message);
});
});
HelloEndpointClient proxy = new HelloEndpointClient();
var request = new helloRequest
{
Name = "John Doe"
};
var response = await proxy.SayHelloAsync(request);
Console.WriteLine(response.Body.HelloResponse.Message);
A következő példa mutatja, hogy kell webszolgáltatás hívni Ruby-ban, Savon library használatával.
require 'savon'
client = Savon.client(wsdl: 'https://apps.learnwebservices.com/services/hello?WSDL')
response = client.call(
:say_hello,
soap_action: '',
message: { 'Name' => 'John Doe' }
)
puts response.body[:hello_response][:message]
A következő példa mutatja, hogy kell webszolgáltatás hívni PHP-ban, SOAP bővítménnyel.
<?php
$client = new SoapClient('https://apps.learnwebservices.com/services/hello?wsdl');
echo $client
->SayHello(
[
'Name' => 'John Doe'
]
)
->Message
;