This section provides a tutorial example of SOAP 1.1 request to use the GetSpeech Web service provided at xmlme.com. A 'Bad Request' error is received, if Content-Length is not enough to cover the entire XML message in the request.
Now let's use my Perl socket test program to send a SOAP 1.1 request to
a public Web service provided at xmlme.com.
xmlme.com provides a public Web service called GetSpeech with SOAP 1.1.
GetSpeech reads a phrase from one of Shakespeare's plays from the request
and returns speech, speaker, and play in the response.
According to the instructions given at
http://www.xmlme.com/WSShakespeare.asmx?op=GetSpeech,
I prepared by first request sample, soap_1_1_GetSpeech.req:
POST /WSShakespeare.asmx HTTP/1.1
Host: www.xmlme.com
Content-Type: text/xml; charset=utf-8
Content-Length: 100
SOAPAction: "http://xmlme.com/WebServices/GetSpeech"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetSpeech xmlns="http://xmlme.com/WebServices">
<Request>To be, or not to be</Request>
</GetSpeech>
</soap:Body>
</soap:Envelope>
Here is the response I got from my first test:
\herong>SocketRequestResponse.pl www.xmlme.com 80
soap_1_1_GetSpeech.req soap_1_1.res
\herong>type soap_1_1.res
HTTP/1.1 400 Bad Request
Connection: close
Date: ... 2009
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Length: 0
The "Bad Request" error was expected, because I put 100 as the "Content-Length"
in the request. Here is my guess on what happened to this example:
When using the "POST" command in a HTTP request, the HTTP server reads content
of the request upto the number of bytes given in the Content-Length header line.
In this example, the server reads only the first 100 bytes of the XML message in
request content, because of "Content-Length: 100".
If "text/xml" is specified in the "Content-Type" header line,
the HTTP server will make sure the content is well-formed XML message.
If not, the server will return the "Bad Request" error.
In this example, the server stopped reading the XML after first 100 bytes.
Then it checked the XML message and declared that XML is bad and the request is bad.
Now I learned that HTTP servers do pay attention to the "Content-Length" header line
in the request. I will provide a better value for "Content-Length" and try again
in the next tutorial.