Mediamonkey
%Europe/Berlin %834 %2005, 21:00
Hey lui, JaFF/Tommyfied en Dauntless hebben 't voortouw al genomen dus ik volg.
Ik heb even een vluggertje die ik vanmorgen in elkaar knalde.
Ik werk momenteel aan een project voor de politieacademie waarin veel met webservices wordt gewerkt. Wat jammer is, is dat een WebService een hard pad nodig heeft. Je kunt dus, wanneer je weet dat de swf een dir hoger ligt, niet verwijzen naar "../webservices/system.asmx?wsdl". Het wordt helemaal lastig als die swf op 3 verschillende servers moet werken: http://politieacademie, http://localhost en http://andereserver maar die wel allemaal dezelfde directorystructuur hebben. Ik bedacht een scriptje om de swf's eigen url te gebruiken en dat pad aan te passen met de string die je invoert. Wat ie uitpoept is dan een absoluut pad, bruikbaar voor webservices.
Check dit:
// usage: var WSDLURL = getPath("../webservices/system.asmx?wsdl");
function getPath(path:String):String {
var arr:Array = _root._url.split("/");
arr.pop(); // remove own file
var splitpath:Array = path.split("../");
var timesback:Number = splitpath.length-1;
for (var i=0; i<timesback; i++) arr.pop(); // got the path!
var file:String = splitpath.pop(); // get rest of the path without ../
arr.push(file);
return arr.join("/");
}
Je ziet dat ie nogal rommelig in elkaar zit, maar ik had dan ook niet veel tijd om de applicaties op te leveren :p Rip 'em to pieces, guys! Jullie kunnen 'm vast verbeteren.
Nou okee, nog eentje dan.. Omdat ik in een gulle bui ben :)
Omdat m'n applicaties nogal groot begonnen te worden door al die componenten en ik amper zicht had op wat er zich achter de schermen van m'n swf afspeelde (controlfreak, ikke..) heb ik een SimpleService class geschreven die op zich hetzelfde doet als de WebServiceConnector, maar dan in minder regels. Je kunt mooi het vorige stukje code gebruiken om de WSDLURL in te vullen. Daar was ie immers voor bedoelt.
/* SimpleService class
* @author: Bart Wttewaall, Mediamonkey.nl
* @date: 23-07-2005
*
* Note: Don't forget to include the WebServiceClasses from:
* Window > Other Panels > Common Libraries > Classes
*/
import mx.events.EventDispatcher;
import mx.services.WebService;
import mx.utils.Delegate;
class SimpleService {
private var _params:Array;
private var service:WebService;
private var callback:Object;
private var intervalID:Number;
public var WSDLURL:String;
public var method:String;
public var addEventListener:Function;
public var removeEventListener:Function;
public var dispatchEvent:Function;
public var dispatchQueue:Function;
public function SimpleService(WSDLURL:String, method:String, parameters:Array) {
EventDispatcher.initialize(this);
this.WSDLURL = WSDLURL;
this.method = method;
params = parameters;
service = new WebService(WSDLURL);
}
public function trigger() {
callback = service[method].apply(service, params);
callback.onResult = Delegate.create(this, onResult);
callback.onFault = Delegate.create(this, onFault);
intervalID = setInterval(onStatus, 5000);
}
public function set params(p:Array) { _params = p; }
public function get params():Array { return _params; }
private function onResult(evt) {
clearInterval(intervalID);
callback.results = evt;
dispatchEvent({type:"result", target:callback, data:evt});
}
private function onFault(evt) {
clearInterval(intervalID);
dispatchEvent({type:"fault", target:callback, detail:evt.detail, faultcode:evt.faultcode, faultstring:evt.faultstring});
}
private function onStatus() {
// to do : build a real status event, this is crap.
trace("status: calling..");
dispatchEvent({type:"status", target:callback, message:"calling.."});
}
}
En je gebruikt 'm zo (werkt echt met flash-mx.com's testservice).
LET OP: vergeet niet om de WebServiceClasses aan je fla toe te voegen!!
Window > Other Panels > Common Libraries > Classes
// -- Usage:
import SimpleService;
var WSDLURL = "http://www.flash-mx.com/mm/tips/tips.cfc?WSDL";
var method = "getTipByProduct";
var product = "Flash";
var params = [product];
var service = new SimpleService(WSDLURL, method, params);
service.addEventListener("result", mx.utils.Delegate.create(this, result));
service.addEventListener("fault", mx.utils.Delegate.create(this, fault));
service.trigger();
// trace the webservice's result
function result(evt) {
trace("Result:"+mx.data.binding.ObjectDumper.toString(evt));
}
function fault(evt) {
trace("Fault:"+mx.data.binding.ObjectDumper.toString(evt));
}
// try another
var product2 = "DreamWeaver";
service.params = [product2]
service.trigger();
Als je niet in bezit bent van mx.data.binding.ObjectDumper (echt verrekte handig! ik gebruik 'm altijd!) dan kun je die hier (http://download.macromedia.com/pub/flashremoting/mx2004/components/actionscript_2.0/flashremoting_comp_sourcecode.zip) downloaden.
*edit* even wat extra functionaliteiten toegevoegd waar ik vandaag tegenaan liep.
Goed, laat me weten wat jullie er van vinden.
Greets, Mediamonkey
Ik heb even een vluggertje die ik vanmorgen in elkaar knalde.
Ik werk momenteel aan een project voor de politieacademie waarin veel met webservices wordt gewerkt. Wat jammer is, is dat een WebService een hard pad nodig heeft. Je kunt dus, wanneer je weet dat de swf een dir hoger ligt, niet verwijzen naar "../webservices/system.asmx?wsdl". Het wordt helemaal lastig als die swf op 3 verschillende servers moet werken: http://politieacademie, http://localhost en http://andereserver maar die wel allemaal dezelfde directorystructuur hebben. Ik bedacht een scriptje om de swf's eigen url te gebruiken en dat pad aan te passen met de string die je invoert. Wat ie uitpoept is dan een absoluut pad, bruikbaar voor webservices.
Check dit:
// usage: var WSDLURL = getPath("../webservices/system.asmx?wsdl");
function getPath(path:String):String {
var arr:Array = _root._url.split("/");
arr.pop(); // remove own file
var splitpath:Array = path.split("../");
var timesback:Number = splitpath.length-1;
for (var i=0; i<timesback; i++) arr.pop(); // got the path!
var file:String = splitpath.pop(); // get rest of the path without ../
arr.push(file);
return arr.join("/");
}
Je ziet dat ie nogal rommelig in elkaar zit, maar ik had dan ook niet veel tijd om de applicaties op te leveren :p Rip 'em to pieces, guys! Jullie kunnen 'm vast verbeteren.
Nou okee, nog eentje dan.. Omdat ik in een gulle bui ben :)
Omdat m'n applicaties nogal groot begonnen te worden door al die componenten en ik amper zicht had op wat er zich achter de schermen van m'n swf afspeelde (controlfreak, ikke..) heb ik een SimpleService class geschreven die op zich hetzelfde doet als de WebServiceConnector, maar dan in minder regels. Je kunt mooi het vorige stukje code gebruiken om de WSDLURL in te vullen. Daar was ie immers voor bedoelt.
/* SimpleService class
* @author: Bart Wttewaall, Mediamonkey.nl
* @date: 23-07-2005
*
* Note: Don't forget to include the WebServiceClasses from:
* Window > Other Panels > Common Libraries > Classes
*/
import mx.events.EventDispatcher;
import mx.services.WebService;
import mx.utils.Delegate;
class SimpleService {
private var _params:Array;
private var service:WebService;
private var callback:Object;
private var intervalID:Number;
public var WSDLURL:String;
public var method:String;
public var addEventListener:Function;
public var removeEventListener:Function;
public var dispatchEvent:Function;
public var dispatchQueue:Function;
public function SimpleService(WSDLURL:String, method:String, parameters:Array) {
EventDispatcher.initialize(this);
this.WSDLURL = WSDLURL;
this.method = method;
params = parameters;
service = new WebService(WSDLURL);
}
public function trigger() {
callback = service[method].apply(service, params);
callback.onResult = Delegate.create(this, onResult);
callback.onFault = Delegate.create(this, onFault);
intervalID = setInterval(onStatus, 5000);
}
public function set params(p:Array) { _params = p; }
public function get params():Array { return _params; }
private function onResult(evt) {
clearInterval(intervalID);
callback.results = evt;
dispatchEvent({type:"result", target:callback, data:evt});
}
private function onFault(evt) {
clearInterval(intervalID);
dispatchEvent({type:"fault", target:callback, detail:evt.detail, faultcode:evt.faultcode, faultstring:evt.faultstring});
}
private function onStatus() {
// to do : build a real status event, this is crap.
trace("status: calling..");
dispatchEvent({type:"status", target:callback, message:"calling.."});
}
}
En je gebruikt 'm zo (werkt echt met flash-mx.com's testservice).
LET OP: vergeet niet om de WebServiceClasses aan je fla toe te voegen!!
Window > Other Panels > Common Libraries > Classes
// -- Usage:
import SimpleService;
var WSDLURL = "http://www.flash-mx.com/mm/tips/tips.cfc?WSDL";
var method = "getTipByProduct";
var product = "Flash";
var params = [product];
var service = new SimpleService(WSDLURL, method, params);
service.addEventListener("result", mx.utils.Delegate.create(this, result));
service.addEventListener("fault", mx.utils.Delegate.create(this, fault));
service.trigger();
// trace the webservice's result
function result(evt) {
trace("Result:"+mx.data.binding.ObjectDumper.toString(evt));
}
function fault(evt) {
trace("Fault:"+mx.data.binding.ObjectDumper.toString(evt));
}
// try another
var product2 = "DreamWeaver";
service.params = [product2]
service.trigger();
Als je niet in bezit bent van mx.data.binding.ObjectDumper (echt verrekte handig! ik gebruik 'm altijd!) dan kun je die hier (http://download.macromedia.com/pub/flashremoting/mx2004/components/actionscript_2.0/flashremoting_comp_sourcecode.zip) downloaden.
*edit* even wat extra functionaliteiten toegevoegd waar ik vandaag tegenaan liep.
Goed, laat me weten wat jullie er van vinden.
Greets, Mediamonkey