source: trunk/tools/ws.htm @ 3475

Last change on this file since 3475 was 3282, checked in by plg, 16 years ago

change: according to topic:15067, svn:keywords property was removed

  • Property svn:eol-style set to LF
File size: 9.3 KB
RevLine 
[1849]1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
[1698]2<html>
3<head>
4<title>PWG web service explorer</title>
[2134]5<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
[1698]6<script type="text/javascript" src="prototype.js" ></script>
7
8<script type="text/javascript">
9
10function setVisibility(id, vis)
11{
[1852]12  $(id).style.visibility = vis;
[1698]13}
14
15function dumpError(err)
16{
17        var s= 'Error ';
18        if ('string' === typeof err )
19         s += err;
20        else
21        {
22    s += err.name+'<br/>';
23         s += err.message;
24         if (err.stack!=null)
25         {//mozilla only
26                s += '<br/><small><pre>'+ err.stack + '</pre></small>';
27         }
28        }
[1852]29  $("error").update(s);
[1698]30}
31
32var gServiceUrl;
[1852]33var gCachedMethods;
[1698]34
35Ajax.Responders.register({
36
37onException: function(req, err) {
38        try {
39                document.pwgError = err;
40                dumpError(err);
41        }
42        catch (e)
43        {
44                alert (err);
45                alert (err.message);
46        }
47},
48
49onComplete: function(req, transport) {
50        if (!req.responseIsSuccess())
51        {
52                var s = 'Completion failure\n' + transport.status + ' ' + transport.statusText;
53                if (transport.status>=300)
54                {
55                        s += '\n';
56                        s += transport.responseText.substr(0,1000);
57                }
58                dumpError(s);
59        }
60 }
61}
62);
63
64
65function pwgGetJsonResult(transport)
66{
67  var resp;
68  try {
69                eval('resp = ' + transport.responseText);
70        }
71        catch (e)
72        {
73                var s = e.message;
74                s += '\n' + transport.responseText.substr(0,1000).escapeHTML();
75                throw new Error( s );
76        }
77  if (resp==null || resp.result==null || resp.stat==null || resp.stat!='ok')
78  {
79    var s = 'JSON evaluation error';
80    if (resp)
81    {
82                        if (resp.stat!=null) s+= '\n'+resp.stat;
83      if (resp.message!=null) s+= '\n'+ resp.message;
84    }
85    throw new Error(s);
86  }
87  return resp.result;
88}
89
90function pwgChangeUrl()
91{
[1852]92  $("error").update("");
[1698]93  setVisibility("methodListWrapper", "hidden");
[1852]94  $("methodList").update("");
[1698]95  setVisibility("methodWrapper", "hidden");
[1852]96  setVisibility("methodDetailWrapper", "hidden");
[1698]97
98  gServiceUrl = $F('ws_url');
[1852]99  gCachedMethods = new Hash();
[1698]100
101  try {
102                var ajaxReq = new Ajax.Request(
103                                gServiceUrl,
104                                {method:'get', parameters:'format=json&method=reflection.getMethodList',
105                                 onSuccess: function (r) { onSuccess_getMethodList(r); }
106                                }
107                        )
108  }catch (e)
109  {
110    dumpError(e);
111  }
112  return false;
113}
114
115function onSuccess_getMethodList(transport)
116{
117        var result = pwgGetJsonResult(transport);
118        var ml = '';
119        for (var i=0; i<result.methods.length; i++)
120        {
121                ml += '<li><a href="#" onclick="return pwgSelectMethod(this.innerHTML)">'+ result.methods[i]+'</a></li>';
122        }
[1852]123        $("methodList").update(ml);
[1698]124        setVisibility("methodListWrapper", "visible");
125}
126
[1852]127function pwgSelectMethod(methodName)
[1698]128{
[1852]129  $("error").update("");
130  $("methodName").update(methodName);
[1698]131  setVisibility("methodDetailWrapper", "hidden");
132  setVisibility("methodWrapper", "visible");
133
[1852]134  if ( gCachedMethods[methodName] )
135    fillNewMethod( gCachedMethods[methodName] );
136  else
[1698]137  {
[1852]138    try {
139                var ajaxReq = new Ajax.Request(
140                                gServiceUrl,
141                                {method:'get', parameters:'format=json&method=reflection.getMethodDetails&methodName='+methodName,
142                                 onSuccess: function (r) { onSuccess_getMethodDetails(r); }
143                                }
144                        )
145    }catch (e)
146    {
147      dumpError( e );
148    }
[1698]149  }
150  return false;
151}
152
153function onSuccess_getMethodDetails(transport)
154{
155        var result = pwgGetJsonResult(transport);
[2424]156  fillNewMethod( gCachedMethods[result.name] = result );
[1852]157}
158
159function fillNewMethod(method)
160{
[1698]161        var methodParamsElt = $("methodParams");
162        while (methodParamsElt.tBodies[0].rows.length)
163                methodParamsElt.tBodies[0].deleteRow(methodParamsElt.tBodies[0].rows.length-1);
164
[1852]165        if (method.params && method.params.length>0)
166        {
167                for (var i=0; i<method.params.length; i++)
[1849]168                {
169                        var row = methodParamsElt.tBodies[0].insertRow(-1);
[1852]170                        var isOptional = method.params[i].optional;
171                        var acceptArray = method.params[i].acceptArray;
172                        var defaultValue = method.params[i].defaultValue == null ? '' : method.params[i].defaultValue;
[2134]173
[1852]174                        row.insertCell(0).innerHTML = method.params[i].name;
175                        row.insertCell(1).innerHTML = '<span title="parameter is '+(isOptional ? 'optional':'required') +'">'+(isOptional ? '?':'*')+'</span>'
176          + (method.params[i].acceptArray ? ' <span title="parameter can be an array; use | (pipe) character to split values">[ ]</span>':'');
[1849]177                        row.insertCell(2).innerHTML = '<input id="methodParameterSend_'+i+'" type="checkbox" '+(isOptional ? '':'checked="checked"')+'/>';
178                        row.insertCell(3).innerHTML = '<input id="methodParameterValue_'+i+'"" value="'+defaultValue+'" style="width:99%" onchange="$(\'methodParameterSend_'+i+'\').checked=true;"/>';
179                }
[1852]180        }
181        $("methodDescription").update(method.description);
[1698]182        setVisibility("methodDetailWrapper", "visible");
183}
184
[1849]185function pwgInvokeMethod( newWindow )
[1698]186{
[1852]187        var methodName = $('methodName').innerHTML;
188        var method = gCachedMethods[methodName];
[1698]189
190  var reqUrl = gServiceUrl;
191  reqUrl += "?format="+$F('responseFormat');
192
[1852]193  if ($('requestFormat').value == 'get')
[1698]194  {
[1852]195    reqUrl += "&method="+methodName;
196    for ( var i=0; i<method.params.length; i++)
[1698]197    {
[1852]198      if (! $('methodParameterSend_'+i).checked)
199        continue;
200
201      if ( method.params[i].acceptArray &&  $F('methodParameterValue_'+i).split('|').length > 1 )
202      {
203        $F('methodParameterValue_'+i).split('|').each(
204            function(v) {
205              reqUrl += '&'+method.params[i].name+'[]='+v;
206            }
207          );
208      }
209      else
210        reqUrl += '&'+method.params[i].name+'='+$F('methodParameterValue_'+i);
[1698]211    }
[1849]212    if ( !newWindow )
[1852]213      $("invokeFrame").src = reqUrl;
[1849]214    else
215      window.open(reqUrl);
[1698]216  }
217  else
218  {
[1852]219    var form = $("invokeForm");
[1698]220    form.action = reqUrl;
[1852]221    var t = '<input type="hidden" name="'+'method'+'" value="'+methodName+'"/>';
222    for ( var i=0; i<method.params.length; i++)
[1698]223    {
[1852]224      if (! $('methodParameterSend_'+i).checked)
225        continue;
226
227      if ( method.params[i].acceptArray &&  $F('methodParameterValue_'+i).split('|').length > 1 )
228      {
229        $F('methodParameterValue_'+i).split('|').each(
230            function(v) {
231              t += '<input type="hidden" name="'+method.params[i].name+'[]" value="'+v+'"/>';
232            }
233          );
234      }
235      else
236        t += '<input type="hidden" name="'+method.params[i].name+'" value="'+$F('methodParameterValue_'+i)+'"/>';
[1698]237    }
238    form.innerHTML = t;
[1852]239    form.target = newWindow ? "_blank" : "invokeFrame";
[1698]240    form.submit();
241  }
242  return false;
243}
244</script>
245
246
247<style>
248#methodListWrapper {
[1849]249  width: 13em;
[1698]250  float: left;
251  display: inline;
252  visibility: hidden;
253}
254
255#methodList {
[1849]256  padding-left: 10px;
257  margin-left: 15px;
[1698]258}
259
260#methodWrapper {
[1849]261  margin-left: 14em;
[1698]262  visibility: hidden;
263}
264
265#methodName {
266  margin-top: 0;
267  margin-bottom: 3px;
268}
269
270
271#error {
272  height: 90px;
273  overflow: scroll;
274  color: red;
275}
276
277#methodParams {
278  border-collapse: collapse;
[1849]279  font-size: small;
[1698]280}
[1849]281
282#methodParams input {
283  font-size: 90%;
284  border: 1px solid black;
285  text-indent: 2px;
286}
287
288
289a {
290  color: #02f;
291  background-color: white;
292  text-decoration: underline;
293}
294
295a:hover {
296  color: white;
297  background-color: #02f;
298  text-decoration: none;
299  cursor:pointer;
300}
301
[1698]302</style>
303
304</head>
305
306
307<body>
308
309<div>
310 <label>PWG Web service url
311  <input name="ws_url" id="ws_url" size="64"/>
312<script type="text/javascript">
313  var match = document.location.toString().match(/^(https?.*\/)tools\/ws\.html?$/);
314  if (match!=null) $('ws_url').value = match[1]+'ws.php';
315</script>
316 </label>
317 <a href="#" onclick="return pwgChangeUrl();">Go!</a>
318</div>
319
320<div id="error">
321</div>
322
323<div>
324
[1849]325<div id="methodListWrapper"><h2>Methods</h2>
[1698]326  <ul id="methodList">
327    <li><a href="#" onclick="return pwgSelectMethod(this.innerHTML)">getVersion</a></li>
328  </ul>
329</div>
330
331<div id="methodWrapper">
332  <h2 id="methodName"></h2>
333  <div id="methodDetailWrapper">
[1849]334
[1698]335    <table>
[1849]336    <tr style="vertical-align:top">
[2134]337
[1849]338    <td>
339      <div id="methodDescription"></div>
340      <table>
[1698]341        <tr>
[1849]342          <td>Request format:</td>
343          <td>
344            <select id="requestFormat">
345              <option value="get" selected="selected">GET</option>
346              <option value="post">POST</option>
347            </select>
348          </td>
[1698]349        </tr>
[2134]350
[1849]351        <tr>
352          <td>Response format:</td>
353          <td>
354            <select id="responseFormat">
355              <option value="rest" selected="selected">REST (xml)</option>
356              <option value="json">JSON</option>
357              <option value="php">PHP serial</option>
358              <option value="xmlrpc">XML RPC</option>
359            </select>
360          </td>
361        </tr>
362      </table>
363      <p>
364        <a href="#" onclick="return pwgInvokeMethod(false)">Invoke</a>
365        <a href="#" onclick="return pwgInvokeMethod(true)">Invoke (new Window)</a>
366      </p>
367    </td>
368
[2134]369
[1849]370    <td>
371      <table id="methodParams"  border="1" cellspacing="0" cellpadding="2px">
372        <thead>
373          <tr>
374            <td style="width:150px">Parameter</td>
[1852]375            <td>Extra</td>
[1849]376            <td>Send</td>
377            <td style="width:160px">Value</td>
378          </tr>
379        </thead>
380        <tbody>
381        </tbody>
382      </table>
383    </td>
[2134]384
[1849]385    </tr>
[1698]386    </table>
[2134]387
[1849]388                <div style="display:none;">
[1698]389                        <!-- hiddenForm for POST -->
390                        <form method="post" action="" target="invokeFrame" id="invokeForm">
391                                <input type="submit" value="submit"/>
392                        </form>
393                </div>
394
[1849]395    <iframe width="100%" height="400px" id="invokeFrame" name="invokeFrame" style="clear:both"></iframe>
[1698]396  </div> <!-- methodDetailWrapper -->
397</div> <!-- methodWrapper -->
398
399</div>
400
401</body>
402</html>
Note: See TracBrowser for help on using the repository browser.