[Switch to "Elastic Layout" to see this properly.]
I get a lot of mileage using Web Services inside an intranet. I sometimes need to cross operating systems and languages to take advantage of pre-written services. One issue I've run across is the need to find the correct syntax in different languages that will generate a correct result. Some implementations are really easy and others require some delicate, precision work in order for them to respond correctly. Once written, however, they are consistent in their performance.
In this example, I've taken a minor Web Service (function: GetWeather(String City)) that returns random weather information when given a city. This is just for fun and to test parameters on Web Service calls. The service is at:
http://www.deeptraining.com/webservices/weather.asmx
This page has no HTML test page built for it, so your actual call will need to be the entity performing the test.
When a successful call is given, the responses are in the range of: Rain, Sunny, Partly Cloudy, Cloudy, etc.
Here is a sample result of three runs from the Ruby version:

If anyone wants to create the Scala and/or Python versions (before I do), I will gladly post them here.
FYI: Perl and Java were the most difficult / cumbersome and C++ was the easiest.
Here is the PHP version:
<?php
function doWebService()
{
########################################################################
# Do some SOAP / Call a Web Service
$client = new SoapClient("http://www.deeptraining.com/webservices/weather.asmx?WSDL");
$strWeather = $client->GetWeather(array('City' => 'Murfreesboro'))->GetWeatherResult;
echo $strWeather . "\nDone";
}
doWebService();
?>
Here is the Ruby version:
require 'soap/wsdlDriver' # Include the soap driver
require 'SuppressWarning' # Suppress the soap unused param warning
################################################################################
# Call to a web service on the Internet (passing a parameter)
def doWebService()
# Instantiate a soap driver for the given service and NameSpace
# Call the return from the driver creation, pass it a parameter and
# Append "Done" to the end of that
# of course, this is now unReadable...
puts (
soap = suppress_warning {
SOAP::WSDLDriverFactory.new(
'http://www.deeptraining.com/webservices/weather.asmx?WSDL'
).create_rpc_driver
}
).getWeather({'City' => 'Murfreesboro'}).getWeatherResult+"\nDone"
end
doWebService()
----------------------------[SuppressWarning.rb]----------------------------
def suppress_warning
back = $VERBOSE
$VERBOSE = nil
begin
yield
ensure
$VERBOSE = back
end
end
Here is the Perl version:
## WORKS as of 03/06/2010
use strict;
use SOAP::Lite;
###############################################################################
sub doWebService()
{
my $FUNCTION = 'GetWeather';
my $strParamName = 'City';
my $strParamValue = 'Murfreesboro';
my $strNamespace = 'http://litwinconsulting.com/webservices';
#############################################################################
# Set the value of ACTION to the value you need passed in the
# SOAPAction header
# Init the WebService
my $soap = SOAP::Lite
->proxy('http://www.deeptraining.com/webservices/weather.asmx')
->on_action(sub { return "$strNamespace/$FUNCTION"; } )
->ns("$strNamespace/");
#####################
# Call the WebService
my $resp = $soap->call(
SOAP::Data->name("$FUNCTION")->attr({xmlns => "$strNamespace/"}),
SOAP::Data->name($strParamName => $strParamValue)
);
#########################################################
# Since the result comes back as a string, just print it.
return $resp->result();
}
print &doWebService();
print "\nDone\n";
Here is the Java version:
import java.util.*;
import java.io.*;
import java.net.URLConnection;
import java.net.MalformedURLException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import javax.xml.namespace.QName;
import javax.xml.rpc.NamespaceConstants;
import javax.xml.rpc.ParameterMode;
import java.net.URL;
public class doWebService
{
public static void doWebServiceCall()
{
try
{
////////////////////////////////////////////////////////////////////
// Responds the same with or without the ?WSDL
String strEndPoint = "http://www.deeptraining.com/webservices/weather.asmx";
String strSoapAction = "http://litwinconsulting.com/webservices/GetWeather";
String strSchemaURL = "http://litwinconsulting.com/webservices/";
String strParamName1 = "City";
String strParameterVal1= "Murfreesboro";
String strFunctionName = "GetWeather";
//Call call = (Call) new Service().createCall();//Works
Call call = new Call(strEndPoint);//Works same
////////////////////////////////////////////////////////////////////
// first parameter in QName seemingly takes ANYTHING
call.setOperationName(new QName(strSchemaURL, strFunctionName));
////////////////////////////////////////////////////////////////////
// Set the name of the parameter and the return type
call.setReturnType(XMLType.XSD_STRING);
call.addParameter(new QName(strSchemaURL,strParamName1), XMLType.XSD_STRING, ParameterMode.IN);
//
////////////////////////////////////////////////////////////////////
// Catch the result and print it
// Parameter count is now ONE (1).
call.setSOAPActionURI(strSoapAction);//Yes Necessary
String strResult = (String) call.invoke(new Object[] {strParameterVal1});
System.out.println("Result='" + strResult + "'");
}
catch (Exception e)
{
e.printStackTrace();
System.err.println(e.toString());
}
}
public static void main(String[] args)
{
////////////////////////////////////////////////////////////////////////
// 6 Call a Web service (with parameters)
doWebServiceCall();
}
}
Here is the C++ version (once the WS is added to the project):
// doWebService_CPP.h
#pragma once
using namespace System;
using namespace WS_WEATHER;
namespace doWebService_CPP {
public ref class CDoWebService_CPP
{
public:
static void DoWebService(void)
{
Weather^ svcWeather = gcnew Weather();
Console::WriteLine(svcWeather->GetWeather("Murfreesboro") + "\nDone");
}
};
}
Here is the VB version (once the WS is added to the project):
Public Class CDoWebService_VB
Public Shared Sub DoWebService()
Dim svcWeather As New WS_WEATHER.Weather()
Console.WriteLine(svcWeather.GetWeather("Murfreesboro") & Chr(10) & "Done")
End Sub
End Class
Here is the C# version (once the WS is added to the project):
using System;
using doWebService_CS.WS_WEATHER;
namespace doWebService_CS
{
public class CDoWebService_CS
{
public static void DoWebService()
{
Weather svcWeather = new Weather();
Console.WriteLine(svcWeather.GetWeather("Murfreesboro") + "\nDone");
}
}
}
Here is the PowerShell version (borrowing from the C# version):
################################################################################
# Instead of attempting to dynamically reference a WebService, I leveraged the
# existing connection through a DLL created in C# in an earlier example.
# This example shows the loading of the DLL
# how to call a static method with PowerShell
[void][Reflection.Assembly]::LoadFile(
"c:\science\managed\doWebService_CS\bin\Debug\doWebService_CS.dll")
[doWebService_CS.CDoWebService_CS]::DoWebService()
## For a more thorough look at PowerShell and WebServices, check: http://poshcode.org/538