今回作ったアプリケーション(Eclipse WTP Project) > ExamWebService.zip
インターネットからアクセスできます > http://hondou.homedns.org/ExamWebService/
(Mac版Firefox 3.0 / Vista版IE7.0 で動作確認しています)
ダウンロード時の、License Agreement を逐語訳してみた。
商用にそのまま使う場合には、専門家の判断を仰いだ方が無難かな。
個人が非商用で使う分には問題ないでしょう。
Firefox の Firebug Plugin で、break point を設定して Javascript を実行すると分かる
Firefox の Http Fox Plugin で監視可能
<html>
<head>
<script type="text/javascript" src="scripts/prototype.js"></script>
<script type="text/javascript" src="scripts/ws.js"></script>
<script type="text/javascript">
function suggestColor(inpRed, inpGreen, inpBlue, container) {
var call = new WS.Call('/ExamWebService/services/ColorSuggestionWebService');
var nsuri = 'http://exam.snail.com';
var qn_op = new WS.QName('suggestColor', nsuri);
call.invoke_rpc(qn_op, [ {
name :'red',
value :inpRed
}, {
name :'green',
value :inpGreen
}, {
name :'blue',
value :inpBlue
} ], null, function(call, envelope) {
var colors = envelope.get_body().get_all_children()[0].get_all_children();
var ret = "<table border=\"1\"><tr><th>#</th><th>Color</th><th>R</th><th>G</th><th>B</th></tr>";
for ( var colorNo = 0; colorNo < colors.length; colorNo++) {
var color = colors[colorNo].get_all_children();
var red = undefined;
var green = undefined;
var blue = undefined;
var colorName = undefined;
for ( var elemNo = 0; elemNo < color.length; elemNo++) {
var name = color[elemNo].element.tagName;
var value = color[elemNo].get_value();
if (name == "red") {
red = new Number(value);
} else if (name == "green") {
green = new Number(value);
} else if (name == "blue") {
blue = new Number(value);
} else if (name == "name") {
colorName = value;
}
}
var bgcolor = "#" + red.toColorPart() + green.toColorPart() + blue.toColorPart();
ret = ret
+ "<tr><td bgcolor=\"" + bgcolor + "\">"
+ colorNo + "</td><td>"
+ "<a href=\"#\" onClick=\"suggestColor('"+red+"','"+green+"','"+blue+"',$('result'))\">"
+ colorName + "</a></td><td>"
+ red + "</td><td>"
+ green + "</td><td>"
+ blue + "</td></tr>";
}
ret = ret + "</table>";
container.innerHTML = ret;
$('soap').innerHTML = arguments[2].escapeHTML();
});
}
// -->
</script>
<style type="text/css">
body {
font-family: verdana;
}
#container {
margin: 10pt;
border: 1pt solid black;
padding: 2pt;
}
#result {
padding: 5pt;
background-color: #eeeeee;
}
#soap {
padding: 5pt;
background-color: #eeeeee;
font-size: 10pt;
}
</style>
</head>
<body>
R<input id="inpRed" name="inpRed" value="88" />
G<input id="inpGreen" name="inpGreen" value="88" />
B<input id="inpBlue" name="inpBlue" value="88" />
<input value="Invoke the Web Service" type="button"
onclick="suggestColor($('inpRed').value,$('inpGreen').value,$('inpBlue').value,$('result'))" />
<br />
<div id="container">Result:
<div id="result"></div>
<div id="soap"></div>
</div>
</body>
</html>
var call = new WS.Call( url ); var qn_op = new WS.QName( channel , xlsnamespace ); call.invoke_rpc(qn_op, arg, encoding style, call_back_func());
設定値 | 意味 |
url | WebサービスのURL (クラス名) |
channel | Webサービスのチャンネル (メソッド名) |
xlsnamespace | namespace |
arg | Webサービスの引数(cf.引数の指定の仕方) |
encoding style | ?(nullで良いみたい) |
call_back_func() | Webサービスの処理結果を処理する関数(cf.コールバック関数) |
[ {name :'red' , value :inpRed}, {name :'green' , value :inpGreen}, {name :'blue' , value :inpBlue} ]name属性 と value属性 を持つ構造体の配列で指定する
var name = color[elemNo].element.tagName; var value = color[elemNo].get_value();の形でタグ名と値を取得できる
envelope.body().get_all_children()[0].get_all_children()などとして構造をたどっていける
+ var MyHandler = Class.create(); + MyHandler.prototype = (new WS.Handler()).extend({ + on_reWebquest : function(envelope){ + // Webサービスを呼び出す直前に呼ばれる + container.innterHTML = "<img src=\"ajax-loader.gif\"/>"; + }, + on_response : function(envelope){ + // Webサービスから処理結果が帰ってきた直後に呼ばれる(コールバック関数が呼ばれる直前) + container.innterHTML = ""; + }, + on_error : function(call,envelope){ + // コイツはいつ呼ばれるのか不明? (HTTP認証失敗時など?) + } + }); var call = new WS.Call('/ExamWebService/services/ColorSuggestionWebService'); + call.add_handler(new MyHandler());
} ], null, function(call, envelope) { + var rootTag = envelope.get_body().get_all_children()[0].element.tagName; + if(rootTag == 'soapenv:Fault'){ + var errors = envelope.get_body().get_all_children()[0].get_all_children(); + container.innerHTML = '<table border=\"1\">' + + '<tr><td>fault code</td><td>' + + errors[0].get_value() + + '</td></tr>' + + '<tr><td>fault string</td><td>' + + errors[1].get_value() + + '</td></tr></table>'; + }else{ var colors = envelope.get_body().get_all_children()[0].get_all_children(); var ret = "<table border=\"1\"><tr><th>#</th><th>Color</th><th>R</th><th>G</th><th>B</th></tr>";コールバック関数の先頭で、エラー判定を入れる
var MyHandler = Class.create(); //instead of using .extend (no longer supported) // MyHandler.prototype = (new WS.Handler()).extend({ //we extend the WS.Handler() Object.extend(MyHandler.prototype,WS.Handler.prototype); //and then extend the SOAP.Header interface Object.extend(MyHandler.prototype,{ on_request : function(envelope){ // alert('on request'); container.innterHTML = "<img src=\"ajax-loader.gif\"/>"; }, on_response : function(envelope){ // alert('on response'); container.innterHTML = ""; }, on_error : function(call,envelope){ alert("ERROR"); } });