source: extensions/PiwigoLib/doc/ws.htm @ 7175

Last change on this file since 7175 was 3816, checked in by bayral, 15 years ago

Initial import

File size: 9.3 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<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
6<script type="text/javascript" src="prototype.js" ></script>
7
8<script type="text/javascript">
9
10function setVisibility(id, vis)
11{
12  $(id).style.visibility = vis;
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        }
29  $("error").update(s);
30}
31
32var gServiceUrl;
33var gCachedMethods;
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{
92  $("error").update("");
93  setVisibility("methodListWrapper", "hidden");
94  $("methodList").update("");
95  setVisibility("methodWrapper", "hidden");
96  setVisibility("methodDetailWrapper", "hidden");
97
98  gServiceUrl = $F('ws_url');
99  gCachedMethods = new Hash();
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        }
123        $("methodList").update(ml);
124        setVisibility("methodListWrapper", "visible");
125}
126
127function pwgSelectMethod(methodName)
128{
129  $("error").update("");
130  $("methodName").update(methodName);
131  setVisibility("methodDetailWrapper", "hidden");
132  setVisibility("methodWrapper", "visible");
133
134  if ( gCachedMethods[methodName] )
135    fillNewMethod( gCachedMethods[methodName] );
136  else
137  {
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    }
149  }
150  return false;
151}
152
153function onSuccess_getMethodDetails(transport)
154{
155        var result = pwgGetJsonResult(transport);
156  fillNewMethod( gCachedMethods[result.name] = result );
157}
158
159function fillNewMethod(method)
160{
161        var methodParamsElt = $("methodParams");
162        while (methodParamsElt.tBodies[0].rows.length)
163                methodParamsElt.tBodies[0].deleteRow(methodParamsElt.tBodies[0].rows.length-1);
164
165        if (method.params && method.params.length>0)
166        {
167                for (var i=0; i<method.params.length; i++)
168                {
169                        var row = methodParamsElt.tBodies[0].insertRow(-1);
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;
173
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>':'');
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                }
180        }
181        $("methodDescription").update(method.description);
182        setVisibility("methodDetailWrapper", "visible");
183}
184
185function pwgInvokeMethod( newWindow )
186{
187        var methodName = $('methodName').innerHTML;
188        var method = gCachedMethods[methodName];
189
190  var reqUrl = gServiceUrl;
191  reqUrl += "?format="+$F('responseFormat');
192
193  if ($('requestFormat').value == 'get')
194  {
195    reqUrl += "&method="+methodName;
196    for ( var i=0; i<method.params.length; i++)
197    {
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);
211    }
212    if ( !newWindow )
213      $("invokeFrame").src = reqUrl;
214    else
215      window.open(reqUrl);
216  }
217  else
218  {
219    var form = $("invokeForm");
220    form.action = reqUrl;
221    var t = '<input type="hidden" name="'+'method'+'" value="'+methodName+'"/>';
222    for ( var i=0; i<method.params.length; i++)
223    {
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)+'"/>';
237    }
238    form.innerHTML = t;
239    form.target = newWindow ? "_blank" : "invokeFrame";
240    form.submit();
241  }
242  return false;
243}
244</script>
245
246
247<style>
248#methodListWrapper {
249  width: 13em;
250  float: left;
251  display: inline;
252  visibility: hidden;
253}
254
255#methodList {
256  padding-left: 10px;
257  margin-left: 15px;
258}
259
260#methodWrapper {
261  margin-left: 14em;
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;
279  font-size: small;
280}
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
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
325<div id="methodListWrapper"><h2>Methods</h2>
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">
334
335    <table>
336    <tr style="vertical-align:top">
337
338    <td>
339      <div id="methodDescription"></div>
340      <table>
341        <tr>
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>
349        </tr>
350
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
369
370    <td>
371      <table id="methodParams"  border="1" cellspacing="0" cellpadding="2px">
372        <thead>
373          <tr>
374            <td style="width:150px">Parameter</td>
375            <td>Extra</td>
376            <td>Send</td>
377            <td style="width:160px">Value</td>
378          </tr>
379        </thead>
380        <tbody>
381        </tbody>
382      </table>
383    </td>
384
385    </tr>
386    </table>
387
388                <div style="display:none;">
389                        <!-- hiddenForm for POST -->
390                        <form method="post" action="" target="invokeFrame" id="invokeForm">
391                                <input type="submit" value="submit"/>
392                        </form>
393                </div>
394
395    <iframe width="100%" height="400px" id="invokeFrame" name="invokeFrame" style="clear:both"></iframe>
396  </div> <!-- methodDetailWrapper -->
397</div> <!-- methodWrapper -->
398
399</div>
400
401</body>
402</html>
Note: See TracBrowser for help on using the repository browser.