source: trunk/tools/ws.htm @ 1933

Last change on this file since 1933 was 1912, checked in by rub, 18 years ago

Update svn properties (svn:eol-style and svn:keywords)

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