Hello,
I'm trying to send some arguments to a webservice, but every
variation I have tried other than generating the XML from scratch
keeps failing (eg. sends an empty message body). Relevant parts of
the WSDL are as follows:
<message name="sendStrings">
<part element="tns:sendStrings" name="parameters"></part>
</message>
<message name="sendStringsResponse">
<part element="tns:sendStringsResponse"
name="parameters"></part>
</message>
...
<operation name="sendStrings">
<input message="tns:sendStrings"></input>
<output message="tns:sendStringsResponse"></output>
</operation>
And from the XSD:
<xs:element
xmlns:ns3="http://server.webservices.tutorials.wakaleo.com/"
type="ns3:sendStrings" name="sendStrings"></xs:element>
<xs:complexType name="sendStrings">
<xs:sequence>
<xs:element type="xs:string" minOccurs="0" name="arg0"
maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:element
xmlns:ns4="http://server.webservices.tutorials.wakaleo.com/"
type="ns4:sendStringsResponse"
name="sendStringsResponse"></xs:element>
<xs:complexType name="sendStringsResponse">
<xs:sequence>
<xs:element type="xs:string" minOccurs="0" name="return"
maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:complexType>
Based on everything that I have been able to find in the
documentation and on flexcoders, there are a number of different
ways to send requests to the web service, so I tried each of the
ones that I could find.
However, only one of them succeeds -- specifically, the case where I
build an XMLDocument from scratch and send it. All the other cases
fail -- that is, they do not pass *any* arguments to the web
service.
The following TestCase (which is kind of long) shows the different
variations that have been tried. The main things of interest are
the variationN functions in the beginning of the class as these test
the different ways to call the web service. If TestCase had an
asyncSetup function the sample case could be quite a bit shorter...
(but perhaps I'll work on that next):
package code
{
import flash.events.Event;
import flexunit.framework.TestCase;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.soap.LoadEvent;
import mx.rpc.soap.mxml.WebService;
import flash.utils.describeType;
import mx.rpc.events.AbstractEvent;
import mx.rpc.AbstractOperation;
import flash.xml.XMLDocument;
import flash.xml.XMLNode;
public class TestSendStrings extends TestCase
{
private var ws:WebService;
private static const SERVICE_TIMEOUT:Number = 2000;
private var wsdlUrl:String
= "http://192.168.1.108:8080/stockquotes/stock_quote?wsdl";
private var responseHandler:String;
private var sendStringsFunc:String;
// these are the different variations that I have tried. Of
these
// different variations, variation9 succeeds because I have hand
// crafted a valid message body (NOTE that variation 8 fails and
// that the only difference is XML vs. XMLDocument). variation6
// generates a fault, so it fails for a different reason than
// some of the others
private function variation1():void {
trace('variation1');
var op:AbstractOperation = ws.getOperation('sendStrings');
op.arguments = new Array('variation','one');
op.send();
}
private function variation2():void {
trace('variation2');
ws.sendStrings.arguments = new Array('variation','two');
ws.sendStrings.send();
}
private function variation3():void {
trace('variation3');
ws.sendStrings.send(new Array('variation','three'));
}
private function variation4():void {
trace('variation4');
ws.sendStrings.send('variation','four');
}
private function variation5():void {
trace('variation5');
ws.sendStrings('variation','five');
}
private function variation6():void {
// this function results in a fault event:
// Unexpected parameter 'sendStrings' found in input
arguments.
trace('variation6');
var op:AbstractOperation = ws.getOperation('sendStrings');
op.arguments = {sendStrings:{arg0:new
Array('variation','six')}};
op.send();
}
private function variation7():void {
trace('variation7');
var op:AbstractOperation = ws.getOperation('sendStrings');
op.send({sendStrings:{arg0:new Array('variation','six')}});
}
private function variation8():void {
trace('variation8');
var xml:XML = new XML('<ns1:sendStrings
xmlns:ns1="http://server.webservices.tutorials.wakaleo.com/">' +
'<arg0>variation</arg0><arg0>eight</arg0>' +
'</ns1:sendStrings>');
var op:AbstractOperation = ws.getOperation('sendStrings');
op.send(xml);
}
private function variation9():void {
trace('variation9');
var xml:XMLDocument = new XMLDocument('<ns1:sendStrings
xmlns:ns1="http://server.webservices.tutorials.wakaleo.com/">' +
'<arg0>variation</arg0><arg0>nine</arg0>' +
'</ns1:sendStrings>');
var op:AbstractOperation = ws.getOperation('sendStrings');
op.send(xml);
}
protected function handleResult(event:ResultEvent,
expectedResult:Object):void {
trace('---------------------------');
trace('message body: ' + event.message.body);
var actualResult:String = "null";
var xml:XML = new XML(event.message.body);
var a:Array = resultToStringArray(xml);
if (a != null)
actualResult = a.toString();
assertEquals(expectedResult.toString(), actualResult);
}
private function resultToStringArray(xml:XML):Array {
if (xml != null) {
// I would be better off to iterate over the namespace
declarations
// to find out what the prefix is for the soap namespace,
but since
// I know what it is for the particular service that I'm
currently
// working with, I'm just going to hard code the fetch.
var soapNS:Namespace = xml.namespace("soapenv")
var tutNS:Namespace = xml.namespace("ns1");
var res:Array = new Array();
for each (var node:XML in
xml.soapNS::Body.tutNS::sendStringsResponse.children()) {
res.push(node.text());
}
return res;
}
return null;
}
private function privateSetup(func:Function):void{
trace('privateSetup');
ws = new WebService();
ws.addEventListener(LoadEvent.LOAD,func);
ws.addEventListener(FaultEvent.FAULT,handleFault);
ws.loadWSDL(wsdlUrl);
}
private function onLoadCompleted(e:LoadEvent,o:Object):void {
trace('onLoadCompleted');
ws.addEventListener(ResultEvent.RESULT,
addAsync(handleResult,SERVICE_TIMEOUT, o.expectedResult));
this[o.test]();
}
private function handleFault(e:FaultEvent):void {
trace('handleFault');
trace('FAULT: ' + e.fault.getStackTrace());
}
private function variation1():void {
trace('variation1');
var op:AbstractOperation = ws.getOperation('sendStrings');
op.arguments = new Array('variation','one');
op.send();
}
private function variation2():void {
trace('variation2');
ws.sendStrings.arguments = new Array('variation','two');
ws.sendStrings.send();
}
private function variation3():void {
trace('variation3');
ws.sendStrings.send(new Array('variation','three'));
}
private function variation4():void {
trace('variation4');
ws.sendStrings.send('variation','four');
}
private function variation5():void {
trace('variation5');
ws.sendStrings('variation','five');
}
private function variation6():void {
// this function results in a fault event:
// Unexpected parameter 'sendStrings' found in input
arguments.
trace('variation6');
var op:AbstractOperation = ws.getOperation('sendStrings');
op.arguments = {sendStrings:{arg0:new
Array('variation','six')}};
op.send();
}
private function variation7():void {
trace('variation7');
var op:AbstractOperation = ws.getOperation('sendStrings');
op.send({sendStrings:{arg0:new Array('variation','six')}});
}
private function variation8():void {
trace('variation8');
var xml:XML = new XML('<ns1:sendStrings
xmlns:ns1="http://server.webservices.tutorials.wakaleo.com/">' +
'<arg0>variation</arg0><arg0>eight</arg0>' +
'</ns1:sendStrings>');
var op:AbstractOperation = ws.getOperation('sendStrings');
op.send(xml);
}
private function variation9():void {
trace('variation9');
var xml:XMLDocument = new XMLDocument('<ns1:sendStrings
xmlns:ns1="http://server.webservices.tutorials.wakaleo.com/">' +
'<arg0>variation</arg0><arg0>nine</arg0>' +
'</ns1:sendStrings>');
var op:AbstractOperation = ws.getOperation('sendStrings');
op.send(xml);
}
public function testSendStrings1():void{
trace('testSendStrings1');
privateSetup(
addAsync(
onLoadCompleted,
SERVICE_TIMEOUT,
{test:'variation1',expectedResult:new
Array('variation0','one1')}
)
);
}
public function testSendStrings2():void{
trace('testSendStrings2');
privateSetup(
addAsync(
onLoadCompleted,
SERVICE_TIMEOUT,
{test:'variation2',expectedResult:new
Array('variation0','two1')}
)
);
}
public function testSendStrings3():void{
trace('testSendStrings3');
privateSetup(
addAsync(
onLoadCompleted,
SERVICE_TIMEOUT,
{test:'variation3',expectedResult:new
Array('variation0','three1')}
)
);
}
public function testSendStrings4():void{
trace('testSendStrings4');
privateSetup(
addAsync(
onLoadCompleted,
SERVICE_TIMEOUT,
{test:'variation4',expectedResult:new
Array('variation0','four1')}
)
);
}
public function testSendStrings5():void{
trace('testSendStrings5');
privateSetup(
addAsync(
onLoadCompleted,
SERVICE_TIMEOUT,
{test:'variation5',expectedResult:new
Array('variation0','five1')}
)
);
}
public function testSendStrings6():void{
trace('testSendStrings6');
privateSetup(
addAsync(
onLoadCompleted,
SERVICE_TIMEOUT,
{test:'variation6',expectedResult:new
Array('variation0','six1')}
)
);
}
public function testSendStrings7():void{
trace('testSendStrings7');
privateSetup(
addAsync(
onLoadCompleted,
SERVICE_TIMEOUT,
{test:'variation7',expectedResult:new
Array('variation0','seven1')}
)
);
}
public function testSendStrings8():void{
trace('testSendStrings8');
privateSetup(
addAsync(
onLoadCompleted,
SERVICE_TIMEOUT,
{test:'variation8',expectedResult:new
Array('variation0','eight1')}
)
);
}
public function testSendStrings9():void{
trace('testSendStrings9');
privateSetup(
addAsync(
onLoadCompleted,
SERVICE_TIMEOUT,
{test:'variation9',expectedResult:new
Array('variation0','nine1')}
)
);
}
}
}
Are there other variations that I missed? Is there anything
else that I can do to make this work? Generating XML is not a very
good solution and requires me to know the required namespaces.
Thanks for the help and suggestions.
--Kaleb
--
Flexcoders Mailing List
FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt
Search Archives: http://www.mail-archive.com/flexcoders%40yahoogroups.com
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/flexcoders/
<*> To unsubscribe from this group, send an email to:
[EMAIL PROTECTED]
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/