Wiki source code of The XWiki RESTful API

Version 52.1 by Thomas Mortagne on 2015/10/27

Show last authors
1 {{box cssClass="floatinginfobox" title="**Contents**"}}
2 {{toc depth="2"/}}
3 {{/box}}
4
5 XWiki provides fine-grain access to virtually every element through an API that is based on HTTP semantics, i.e., a RESTful API. In this page you will find all the details to take advantage of this API and the instructions to use it at its full potential.
6
7 = Accessing the service =
8
9 By defaut the XWiki RESTful API entrypoint is rooted at the following URI:
10
11 {{code}}
12
13 http://host:port/xwiki/rest
14
15 {{/code}}
16
17 All the resource references described in the [[XWiki RESTful API Documentation>>#HXWikiRESTfulAPIDocumentation]] should be intended relative to this URL.
18
19 For example the ##/wikis## resources on a server running on ##localhost## on port ##8080## can be retrieved using the following URL : ##http:~/~/localhost:8080/xwiki/rest/wikis##
20
21 In addition to retrieving content in XML format, you can also retrieve it in JSON format by adding the parameter ##?media=json## in the URL. For example: ##http:~/~/localhost:8080/xwiki/rest/wikis?media=json##
22
23 = Dataset =
24
25 This section contains a brief and high-level description of the XWiki data set that should serve as a basis for presenting resources and their associated operations.
26
27 XWiki has **pages** organized in **spaces**. Each **page** is available in multiple **versions** (its **history**) and **translations**. Translated pages have their own **versions** and **history** which are independent. Each page might have **attachments**. Each attachment has its own **history**. Attachments are shared among all the different translations of a page (i.e., the same set of attachments is the same regardless of the page language). Pages can have one or more **objects**. Objects are instances of a **class** that contains a set of **properties**. Some objects might be directly exposed as first class entities, such as **comments** and **tags**. Objects, as attachments, are shared among all page translations.
28
29 = Understanding resources and representations =
30
31 "An important concept in REST is the existence of resources (sources of specific information), each of which is referenced with a global identifier (e.g., an URI in HTTP). In order to manipulate these resources, components of the network (user agents and origin servers) communicate via a standardized interface (e.g., HTTP) and exchange representations of these resources (the actual documents conveying the information)." ([[Wikipedia>>http://en.wikipedia.org/wiki/Representational_State_Transfer#Central_principle]])
32
33 Resources in XWiki are pages, attachments, objects, properties, spaces, and all the //things// we described in the previous section. XWiki has a default way of conveying the information about these resources, i.e., by providing well defined XML representations that contain all the information associated to the resource in an XML format. This format is described using an [[XML Schema Definition file>>https://github.com/xwiki/xwiki-platform/blob/master/xwiki-platform-core/xwiki-platform-rest/xwiki-platform-rest-model/src/main/resources/xwiki.rest.model.xsd]].
34
35 Of course the same resource can be represented in many different ways. This is yet to be documented.
36
37 Another important aspect of representations is that they contain useful information for linking related resources. This is a realization of the //Hypermedia As The Engine Of The Application State (HATEOAS)// principle. In XML representations this information is conveyed through the ##<link>## tag. This tag has two important parameters: **rel** and **href**. **rel** specifies the "semantics" of the link, while **href** is the URI of the linked resource.
38
39 For example, in the representation of a page, we can have links to the comments, tags, attachments which are independent resources associated to the current page. These links are provided in the XML representation of a page and allow a client to navigate to related resources... Like we do every day when we click on a link in a web page.
40
41 [[image:representation||height="430"]]
42
43 == Relations ==
44
45 The available relations that you might find in the XML resource representations are the following:
46
47 |=Rel|=Semantics
48 |{{{http://www.xwiki.org/rel/wikis}}}|The representation containing the list of virtual wikis.
49 |{{{http://www.xwiki.org/rel/spaces}}}|The representation containing the list of spaces in a wiki.
50 |{{{http://www.xwiki.org/rel/pages}}}|The representation containing the list of pages in a space.
51 |{{{http://www.xwiki.org/rel/translation}}}|The representation containing a translation of a page.
52 |{{{http://www.xwiki.org/rel/page}}}|The representation for a page.
53 |{{{http://www.xwiki.org/rel/space}}}|The representation for a space.
54 |{{{http://www.xwiki.org/rel/parent}}}|The representation for the page that is parent of the current resource.
55 |{{{http://www.xwiki.org/rel/home}}}|The representation for the page that is the home of the current resource.
56 |{{{http://www.xwiki.org/rel/attachmentData}}}|The representation of the actual attachment data.
57 |{{{http://www.xwiki.org/rel/comments}}}|The representation of the list of comments associated to the current resource.
58 |{{{http://www.xwiki.org/rel/attachments}}}|The representation of the list of attachments associated to the current resource.
59 |{{{http://www.xwiki.org/rel/objects}}}|The representation of the list of objects associated to the current resource.
60 |{{{http://www.xwiki.org/rel/object}}}|The representation for an object.
61 |{{{http://www.xwiki.org/rel/classes}}}|The representation of the list of classes associated to the current resource.
62 |{{{http://www.xwiki.org/rel/history}}}|The representation of the list of history information associated to the current resource.
63 |{{{http://www.xwiki.org/rel/class}}}|The representation for a class.
64 |{{{http://www.xwiki.org/rel/property}}}|The representation for a property.
65 |{{{http://www.xwiki.org/rel/properties}}}|The representation of the list of properties associated to the current resource.
66 |{{{http://www.xwiki.org/rel/modifications}}}|The representation of the list of modifications associated to the current resource.
67 |{{{http://www.xwiki.org/rel/children}}}|The representation of the list of children associated to the current resource.
68 |{{{http://www.xwiki.org/rel/tags}}}|The representation of the list of tags associated to the current resource.
69 |{{{http://www.xwiki.org/rel/tag}}}|The representation of a tag.
70 |{{{http://www.xwiki.org/rel/search}}}|The representation for a search resource.
71 |{{{http://www.xwiki.org/rel/syntaxes}}}|The representation for a syntax resource.
72
73 Relations are defined as URIs in order to provide a sort of namespace. Currently these URIs are not links to real web pages but, in the future, they might point to descriptions of their semantics on actual web pages (or other kinds of representations).
74
75 == The "HATEOAS" Graph ==
76
77 In order to better understand the relations among resources you might have a look at this [[graph>>attach:XWikiHATEOAS.pdf]] that pictures all the resources available in the XWiki RESTful API and the relations among them. In this graph, nodes are [[URI templates>>http://code.google.com/p/uri-templates/]] representing classes of resources. Edges are the possible links that you might find in a representation of a given resource, and their associated relations.
78
79 This graph shows that by starting from the API entry-point a client can navigate and discover all the resources just by following the links provided in representations (and by knowing their semantics). This was exactly the way how this graph was generated.
80
81 = Interacting with the XWiki RESTful API =
82
83 The XWiki RESTful API is accessible through HTTP so, in principle, you can use every client that is capable of "speaking" HTTP in order to interact with it. Even a web browser!
84 If you want to write more complex programs you might download an HTTP library for your favorite language (e.g., [[http://hc.apache.org/]]).
85
86 Java users might take advantage of the [[JAXB>>http://jaxb.java.net/]] framework and its [[XJC binding compiler>>http://jaxb.java.net/2.2.4/docs/xjc.html]] in order to generate domain object models directly from the [[XML Schema Definition>>https://github.com/xwiki/xwiki-platform/blob/master/xwiki-platform-core/xwiki-platform-rest/xwiki-platform-rest-model/src/main/resources/xwiki.rest.model.xsd]], and use them for serializing and de-serializing XML representations.
87
88 If you use this approach (Apache HTTP Client + JAXB) you will find yourself writing some code like this:
89
90 {{code language="java"}}
91 import javax.xml.bind.JAXBContext;
92 import javax.xml.bind.Unmarshaller;
93
94 import org.apache.commons.httpclient.HttpClient;
95 import org.apache.commons.httpclient.methods.GetMethod;
96 import org.xwiki.rest.model.jaxb.Page;
97
98 ...
99 HttpClient httpClient = new HttpClient();
100 JAXBContext context = JAXBContext.newInstance("org.xwiki.rest.model.jaxb");
101 Unmarshaller unmarshaller = context.createUnmarshaller();
102
103 GetMethod getMethod = new GetMethod("http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main/pages/WebHome");
104 getMethod.addRequestHeader("Accept", "application/xml");
105 httpClient.executeMethod(getMethod);
106
107 Page page = (Page) unmarshaller.unmarshal(getMethod.getResponseBodyAsStream());
108 {{/code}}
109
110 And you will have all the information about the Main.WebHome page in the Page object, without the need of handling XML directly.
111
112 Because of the wide variety of HTTP frameworks available we don't provide a full tutorial about using them. However, in order to show you how to interact with the XWiki RESTful API, we will use [[curl>>http://curl.haxx.se]]: a standard command line HTTP client that provides an interface to all the functionalities of the HTTP protocol.
113
114 By using curl, the previous example would have been:
115
116 {{code language="xml"}}
117 $ curl http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main/pages/WebHome
118 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
119 <page xmlns="http://www.xwiki.org">
120 <link rel="http://www.xwiki.org/rel/space" href="http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main"/>
121 ...
122 {{/code}}
123
124 == Authentication ==
125
126 The XWiki RESTful API supports two types of authentication:
127
128 * **HTTP BASIC Auth**: You provide your credentials using the Authorization HTTP header
129 * **XWiki session**: If you are logged in XWiki and you use the cookies provided by the authentication mechanism, you will also be authenticated to the XWiki RESTful API. This is useful, for example, when you are interacting with the API using the XMLHttpRequest object of a browser using Javascript.
130
131 If you don't provide any credentials the XWiki RESTful API will recognize you as a XWiki.Guest user.
132
133 So if you have, let's say a Main.PrivatePage, and you try to do:
134
135 {{code language="none"}}
136 $ curl -v http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main/pages/PrivatePage
137 ...
138 < HTTP/1.1 401 Unauthorized
139 ...
140 {{/code}}
141
142 You will get an Unauthorized empty response.
143
144 On the contrary, by specifying Admin credentials you gain access to the actual page:
145
146 {{code language="xml"}}
147 $ curl -u Admin:admin http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main/pages/PrivatePage
148 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
149 <page xmlns="http://www.xwiki.org">
150 <link rel="http://www.xwiki.org/rel/space" href="http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main"/>
151 ...
152 <content>Only admin can see this</content>
153 </page>
154 {{/code}}
155
156 == Sending representations ==
157
158 Many resources are modifiable, so you can send representations in order to change the state of those resources (e.g., pages).
159 All modifiable resources accept XML representations that conform to the [[XML Schema Definition>>https://github.com/xwiki/xwiki-platform/blob/master/xwiki-platform-core/xwiki-platform-rest/xwiki-platform-rest-model/src/main/resources/xwiki.rest.model.xsd]]. However, some other representations might be accepted as well (see the following sections).
160
161 Resource update is usually done by using the PUT method, while resource creation is done via PUT or POST.
162
163 For example, in order to create a page you might do the following:
164
165 {{code language="xml"}}
166 $ curl -u Admin:admin -X PUT --data-binary "@newpage.xml" -H "Content-Type: application/xml" http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main/pages/NewPage
167 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
168 <page xmlns="http://www.xwiki.org">
169 <link rel="http://www.xwiki.org/rel/space" href="http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main"/>
170 ...
171 <version>1.1</version>
172 <majorVersion>1</majorVersion>
173 <minorVersion>1</minorVersion>
174 <created>2009-03-21+01:00</created>
175 <creator>XWiki.Admin</creator>
176 <modified>2009-03-21+01:00</modified>
177 <modifier>XWiki.Admin</modifier>
178 <content>This is a new page</content>
179 </page>
180 {{/code}}
181
182 Where newpage.xml is an XML file containing
183
184 {{code language="xml"}}
185 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
186 <page xmlns="http://www.xwiki.org">
187 <title>Hello world</title>
188 <syntax>xwiki/2.0</syntax>
189 <content>This is a new page</content>
190 </page>
191 {{/code}}
192
193 The page has been created and is accessible. Subsequent PUT requests to the page URI will modify its content.
194
195 You can specify a subset of the three elements {{{title}}}, {{{syntax}}}, and {{{content}}} in the XML when updating/creating a page.
196 For example, if you just want to change the title, it is sufficient to specify only the {{{title}}} element. The current content and the syntax of the page will be left unchanged.
197
198 == Overcoming browser limitations ==
199
200 As said before, it could be useful to send information by using browser's XmlHttpRequest objects. However, currently many browsers only support GET and POST methods, so it is impossible to send, for example, PUT requests. In order to overcome this limitation you can override the HTTP Method by specifying a ##method## parameter in the URI query string.
201
202 In the previous example, if you send a POST request to the ##http:~/~/localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main/pages/NewPage?method=PUT## it will be interpreted as if it were an actual PUT request.
203
204 This overriding mechanism allows the interaction with the XWiki RESTful API by using any kind of browser.
205
206 == PUT vs POST ==
207
208 In the following sections you will see that sometimes resources are created by using PUT and sometimes by using POST. The general principle is that if the client is responsible for choosing the resource URI then PUT is used. If it's the server that bears this responsibility, then POST is used.
209
210 To be clearer, when a client wants to create a page it knows **where** that page should go, so it is able to communicate the server the target URI. PUT is used.
211
212 A client, on the contrary, cannot know beforehand what will be the URI of a comment, since comment URIs contains the ID of the comment and this information is generated by the server. In this case the client will do a POST and the server, in response, will communicate the URI it generated for the newly created comment.
213
214 = XWiki RESTful API Documentation =
215
216 In this section you will find the documentation of the whole XWiki RESTful API.
217
218 **application/xml** representations refers to the [[XML Schema Definition>>https://github.com/xwiki/xwiki-platform/blob/master/xwiki-platform-core/xwiki-platform-rest/xwiki-platform-rest-model/src/main/resources/xwiki.rest.model.xsd]].
219
220 Resource URIs are specified using [[URI templates>>http://code.google.com/p/uri-templates/]]. Bracketed elements are formal parameters and should be instantiated to actual values in order to retrieve the associated resource.
221
222 == Root resources ==
223
224 By defaut all the resources of the RESTful API are rooted at the following URI: ##http:~/~/server:port/xwiki/rest/## (depending on where your XWiki is running)
225
226 === / ===
227
228 * **HTTP Method:** GET
229 ** **Media types:**
230 *** application/xml (XWiki element)
231 ** **Description:** Retrieves the entry root description containing information about the server (currently returns the XWiki product Version).
232 ** **Status codes:**
233 *** 200: If the request was successful.
234
235 === /syntaxes ===
236
237 * **HTTP Method:** GET
238 ** **Media types:**
239 *** application/xml (Syntaxes element)
240 ** **Description:** The list of syntaxes supported by the XWiki instance.
241 ** **Status codes:**
242 *** 200: If the request was successful.
243
244 === /wikis ===
245
246 * **HTTP Method:** GET
247 ** **Media types:**
248 *** application/xml (Wikis element)
249 ** **Description:** The list of wikis available on the XWiki instance. Unless the wiki is configured to be a wiki farm, this list is usually made of a single element 'xwiki'.
250 ** **Status codes:**
251 *** 200: If the request was successful.
252
253 === /wikis/query?q~={query}&wikis~=wikiList[&distinct~={true,false}][&order~={asc,desc}][&start~=n][&number~=n][&prettyNames~={true,false}][&className~=className] ===
254
255 * **HTTP Method:** GET
256 ** **Media types:**
257 *** application/xml (SearchResults element)
258 ** **Description:** Search resources (pages and attachments):
259 *** [since 6.4] using a SOLR query (handled by the [[SOLR Query module>>extensions:Extension.Solr Search Query API]]) on the wikis that are specified as a comma separated list in the //wikis// parameter. If //className// is specified, the result will also contain the data for the first object of the corresponding class.
260 *** [before 6.4] using a Lucene query (handled by the [[Lucene Plugin>>extensions:Extension.Lucene Plugin]]) on the wikis that are specified as a comma separated list in the //wikis// parameter. If //className// is specified, the result will also contain the data for the first object of the corresponding class.
261 ** **Status codes:**
262 *** 200: If the request was successful.
263
264 === /wikis/{wikiName} ===
265
266 * **HTTP Method:** GET
267 ** **Media types:**
268 *** application/xml (Wiki element)
269 ** **Description:** information about the wiki
270 ** **Status codes:**
271 *** 200: If the request was successful.
272
273 * **HTTP Method:** POST
274 ** **Accepted Media types:**
275 *** octet/stream (A XAR file)
276 ** **Media types:**
277 *** application/xml (Wiki element)
278 ** **Query parameters**
279 *** backup={true/false} - import XAR as a backup XAR
280 *** history={RESET/REPLACE/ADD} - history importing
281 ** **Description:** import a XAR in a wiki.
282 ** **Status codes:**
283 *** 200: If the request was successful.
284
285 === /wikis/{wikiName}/search?q~={keywords}~[~[&scope~={name,content,title,objects}...]&start~=n][&number~=n][&orderField~=field&order~={asc,desc}][distinct~={true,false}][&prettyNames~={true,false}] ===
286
287 * **HTTP Method:** GET
288 ** **Media types:**
289 *** application/xml (SearchResults element)
290 ** **Description:** The list of pages and objects that contain the {keywords} in the specified {scope}s. Multiple scopes can be specified. Search results are relative to the whole {wikiName}
291 ** **Status codes:**
292 *** 200: If the request was successful.
293
294 === /wikis/{wikiName}/query?q~={query}&type~={hql,xwql,lucene,solr}[&distinct~={true,false}]~~[&order~={asc,desc}][&start~=n][&number~=n][&prettyNames~={true,false}][&className~=className] ===
295
296 * **HTTP Method:** GET
297 ** **Media types:**
298 *** application/xml (SearchResults element)
299 ** **Description:** Allow to execute HQL, XWQL, Lucene or SOLR queries on the given {wikiName}. The //q// parameter contains the corresponding query. See [[HQL Query Examples in Velocity>>platform:DevGuide.velocityHqlExamples]], [[XWiki Query Language Specification>>dev:Design.XWiki Query Language Specification]], [[Lucene Plugin>>extensions:Extension.Lucene Plugin]] and [[SOLR query API>>extensions:Extension.Solr Search Query API]] examples of the queries that can be specified in this parameter. If //className// is specified, the result will also contain the data for the first object of the corresponding class.
300 ** **Status codes:**
301 *** 200: If the request was successful.
302
303 === /wikimanager (This resource is only available when using XWiki Enterprise Manager) ===
304
305 * **HTTP Method:** POST
306 ** **Accepted Media types:**
307 *** application/xml (Wiki element)
308 ** **Media types:**
309 *** application/xml (Wiki element)
310 ** **Query parameters**
311 *** template - the wiki template to be used for initializing the wiki.
312 *** history={RESET/REPLACE/ADD} - history importing
313 ** **Description:** create a new wiki.
314 ** **Status codes:**
315 *** 200: If the request was successful.
316
317 == Space resources ==
318
319 === /wikis/{wikiName}/spaces[?start~=offset&number~=n] ===
320
321 * **HTTP Method:** GET
322 ** **Media types:**
323 *** application/xml (Spaces element)
324 ** **Description:** Retrieves the list of spaces available in the {wikiName} wiki.
325 ** **Status codes:**
326 *** 200: If the request was successful.
327
328 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/search?q~={keywords}~[~[&scope~={name,content,title,objects}...]&number~=n] ===
329
330 * **HTTP Method:** GET
331 ** **Media types:**
332 *** application/xml (Search results element)
333 ** **Description:** The list of pages and objects that contain the {keywords} in the specified {scope}s. Multiple scopes can be specified. Search results are relative to space {spaceName}
334 ** **Status codes:**
335 *** 200: If the request was successful.
336 *** 401: If the user is not authorized.
337
338 == Page resources ==
339
340 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages[?start~=offset&number~=n] ===
341
342 * **HTTP Method:** GET
343 ** **Media types:**
344 *** application/xml (Pages element)
345 ** **Description:** The list of pages in the space {spaceName}
346 ** **Status codes:**
347 *** 200: If the request was successful.
348 *** 401: If the user is not authorized.
349
350 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}[?prettyNames ===
351
352 {true,false}&objects={true,false}&class={true,false}&attachments={true,false}] ===
353
354 * **HTTP Method:** GET
355 ** **Media types:**
356 *** application/xml (Page element)
357 ** **Query parameters**
358 *** ##prettyNames##: also return the pretty name for various document information (like the author display name, etc). Disabled by default.
359 *** ##objects##: //[since 7.3M1]// also return the objects. Disabled by default.
360 *** ##class##: //[since 7.3M1]// also return the class. Disabled by default.
361 *** ##attachments##: //[since 7.3M1]// also return the attachments metadatas. Disabled by default.
362 ** **Description:**
363 ** **Status codes:**
364 *** 200: If the request was successful.
365 *** 401: If the user is not authorized.
366
367 \\
368
369 * **HTTP Method:** PUT
370 ** **Accepted Media types:**
371 *** application/xml (Page element)
372 *** text/plain (Only page content)
373 *** application/x-www-form-urlencoded (allowed field names: title, parent, content)
374 ** **Media types:**
375 *** application/xml (Page element)
376 ** **Description:** Create or updates a page.
377 ** **Status codes:**
378 *** 201: If the page was created.
379 *** 202: If the page was updated.
380 *** 304: If the page was not modified.
381 *** 401: If the user is not authorized.
382
383 \\
384
385 * **HTTP Method:** DELETE
386 ** **Media types:**
387 *** application/xml (Page element)
388 ** **Description:** Delete the page.
389 ** **Status codes:**
390 *** 204: If the request was successful.
391 *** 401: If the user is not authorized.
392
393 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history[?start~=offset&number~=n] ===
394
395 * **HTTP Method:** GET
396 ** **Media types:**
397 *** application/xml (History element)
398 ** **Description:** The list of all the versions of the given page.
399 ** **Status codes:**
400 *** 200: If the request was successful.
401 *** 401: If the user is not authorized.
402
403 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version} ===
404
405 * **HTTP Method:** GET
406 ** **Media types:**
407 *** application/xml (Page element)
408 ** **Description:** The page at version {version}
409 ** **Status codes:**
410 *** 200: If the request was successful.
411 *** 401: If the user is not authorized.
412
413 ==== /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/translations[?start~=offset&number~=n] ====
414
415 * **HTTP Method:** GET
416 ** **Media types:**
417 *** application/xml (Translations element)
418 ** **Description:** The list of available translation for the page
419 ** **Status codes:**
420 *** 200: If the request was successful.
421 *** 401: If the user is not authorized.
422
423 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/translations/{language} ===
424
425 * **HTTP Method:** GET
426 ** **Media types:**
427 *** application/xml (Page element)
428 ** **Description:** The page at in the given {language}.
429 ** **Status codes:**
430 *** 200: If the request was successful.
431 *** 401: If the user is not authorized.
432
433 \\
434
435 * **HTTP Method:** PUT
436 ** **Accepted Media types:**
437 *** application/xml (Page element)
438 *** text/plain (Only page content)
439 *** application/x-www-form-urlencoded (allowed field names: title, parent, content)
440 ** **Media types:**
441 *** application/xml (Page element)
442 ** **Description:** Create or updates a page translation.
443 ** **Status codes:**
444 *** 201: If the page was created.
445 *** 202: If the page was updated.
446 *** 304: If the page was not modified.
447 *** 401: If the user is not authorized.
448
449 \\
450
451 * **HTTP Method:** DELETE
452 ** **Media types:**
453 *** application/xml (Page element)
454 ** **Description:** Delete the page translation.
455 ** **Status codes:**
456 *** 204: If the request was successful.
457 *** 401: If the user is not authorized.
458
459 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/translations/{language}/history ===
460
461 * **HTTP Method:** GET
462 ** **Media types:**
463 *** application/xml (History element)
464 ** **Description:** The list of all the available revisions of the page in a given {language}.
465 ** **Status codes:**
466 *** 200: If the request was successful.
467 *** 401: If the user is not authorized.
468
469 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/translations/{lang}/history/{version} ===
470
471 * **HTTP Method:** GET
472 ** **Media types:**
473 *** application/xml (Page element)
474 ** **Description:** A page at a given {version} in a given {language}.
475 ** **Status codes:**
476 *** 200: If the request was successful.
477 *** 401: If the user is not authorized.
478
479 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/children ===
480
481 * **HTTP Method:** GET
482 ** **Media types:**
483 *** application/xml (Pages element)
484 ** **Description:** The list of the children of a given page.
485 ** **Status codes:**
486 *** 200: If the request was successful.
487 *** 401: If the user is not authorized.
488
489 === /wikis/{wikiName}/pages[?name~=paneName&space~=spaceName&author~=authorName] ===
490
491 * **HTTP Method:** GET
492 ** **Media types:**
493 *** application/xml (Pages element)
494 ** **Description:** The list of pages in the wiki {wikiName}. Filters can be set for the name, space and/or author to include only pages that match the given filters. This resource can be used to search for pages in a wiki.
495 ** **Status codes:**
496 *** 200: If the request was successful.
497 *** 401: If the user is not authorized.
498
499 == Tag resources ==
500
501 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/tags ===
502
503 * **HTTP Method:** GET
504 ** **Media types:**
505 *** application/xml (Tags element)
506 ** **Description:** List page tags.
507 ** **Status codes:**
508 *** 200: If the request was successful.
509 *** 401: If the user is not authorized.
510
511 \\
512
513 * **HTTP Method:** PUT
514 ** **Accepted Media types:**
515 *** application/xml (Tag element)
516 *** text/plain
517 *** application/x-www-form-urlencoded (allowed field names: tag)
518 ** **Media types:**
519 *** application/xml (Tags element)
520 ** **Description:** Add a tag to the page.
521 ** **Status codes:**
522 *** 202: If the request was successful.
523 *** 401: If the user is not authorized.
524
525 === /wikis/{wikiName}/tags ===
526
527 * **HTTP Method:** GET
528 ** **Media types:**
529 *** application/xml (Tags element)
530 ** **Description:** The list of all available tags
531 ** **Status codes:**
532 *** 200: If the request was successful.
533 *** 401: If the user is not authorized.
534
535 === /wikis/{wikiName}/tags/{tag1}[,{tag2},{tag3}...][?start~=offset&number~=n] ===
536
537 * **HTTP Method:** GET
538 ** **Media types:**
539 *** application/xml (Pages element)
540 ** **Description:** The list of pages having the specified tags.
541 ** **Status codes:**
542 *** 200: If the request was successful.
543 *** 401: If the user is not authorized.
544
545 == Comments resources ==
546
547 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/comments[?start~=offset&number~=n] ===
548
549 * **HTTP Method:** GET
550 ** **Media types:**
551 *** application/xml (Comments element)
552 ** **Description:** The list of comments on a given page.
553 ** **Status codes:**
554 *** 200: If the request was successful.
555 *** 401: If the user is not authorized.
556
557 \\
558
559 * **HTTP Method:** POST
560 ** **Accepted Media types:**
561 *** application/xml (Comment element)
562 *** text/plain
563 *** application/x-www-form-urlencoded - allowed field names: ##text##, ##replyTo## (object number of the replied comment, since XE 2.3)
564 ** **Media types:**
565 *** application/xml (Comment element)
566 ** **Description:** Create a comment on the given page.
567 ** **Status codes:**
568 *** 201: If the comment was created. (The Location header will contain the URI where the comment has been created.)
569 *** 401: If the user is not authorized.
570
571 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/comments/{commentId} ===
572
573 * **HTTP Method:** GET
574 ** **Media types:**
575 *** application/xml (Comment element)
576 ** **Description:** A specific comment on a page
577 ** **Status codes:**
578 *** 200: If the request was successful.
579 *** 401: If the user is not authorized.
580
581 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version}/comments ===
582
583 * **HTTP Method:** GET
584 ** **Media types:**
585 *** application/xml (Comments element)
586 ** **Description:** The list of comments at a specific page {version}.
587 ** **Status codes:**
588 *** 200: If the request was successful.
589 *** 401: If the user is not authorized.
590
591 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version}/comments/{commentId} ===
592
593 * **HTTP Method:** GET
594 ** **Media types:**
595 *** application/xml (Comment element)
596 ** **Description:** A comment at a specific page {version}.
597 ** **Status codes:**
598 *** 200: If the request was successful.
599 *** 401: If the user is not authorized.
600
601 == Attachments resources ==
602
603 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/attachments[?start~=offset&number~=n] ===
604
605 * **HTTP Method:** GET
606 ** **Media types:**
607 *** application/xml (Attachments element)
608 ** **Description:** The list of attachments of a given page.
609 ** **Status codes:**
610 *** 200: If the request was successful.
611 *** 401: If the user is not authorized.
612
613 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/attachments/{attachmentName} ===
614
615 * **HTTP Method:** GET
616 ** **Media types:**
617 *** The same of the attachment media type.
618 ** **Description:** The attachment identified by {attachmentName} on a given page.
619 ** **Status codes:**
620 *** 200: If the request was successful.
621 *** 401: If the user is not authorized.
622
623 \\
624
625 * **HTTP Method:** PUT
626 ** **Accepted media types:**
627 *** **/**
628 ** **Media types:**
629 *** application/xml (AttachmentSummary element)
630 ** **Description:** Create an attachment identified by {attachmentName} on a given page.
631 ** **Status codes:**
632 *** 201: If the attachment was created.
633 *** 202: If the attachment was updated.
634 *** 401: If the user is not authorized.
635
636 \\
637
638 * **HTTP Method:** DELETE
639 ** **Media types:**
640 ** **Description:** Delete the attachment identified by {attachmentName} on a given page.
641 ** **Status codes:**
642 *** 204: If the attachment was deleted.
643 *** 401: If the user is not authorized.
644
645 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version}/attachments[?start~=offset&number~=n] ===
646
647 * **HTTP Method:** GET
648 ** **Media types:**
649 *** application/xml (Attachments element)
650 ** **Description:** The list of attachments at a given page {version}.
651 ** **Status codes:**
652 *** 200: If the request was successful.
653 *** 401: If the user is not authorized.
654
655 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version}/attachments/{attachmentName} ===
656
657 * **HTTP Method:** GET
658 ** **Media types:**
659 *** The same of the attachment media type.
660 ** **Description:** The attachment identified by {attachmentName} on a given page {version}.
661 ** **Status codes:**
662 *** 200: If the request was successful.
663 *** 401: If the user is not authorized.
664
665 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/attachments/{attachmentName}/history ===
666
667 * **HTTP Method:** GET
668 ** **Media types:**
669 *** application/xml (Attachments element)
670 ** **Description:** The list of available version for the {attachmentName}
671 ** **Status codes:**
672 *** 200: If the request was successful.
673 *** 401: If the user is not authorized.
674
675 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/attachments/{attachmentName}/history/{version} ===
676
677 * **HTTP Method:** GET
678 ** **Media types:**
679 *** The same of the attachment media type.
680 ** **Description:** The {attachmentName} at a given {version}
681 ** **Status codes:**
682 *** 200: If the request was successful.
683 *** 401: If the user is not authorized.
684
685 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/attachments[?name~=attachmentName&page~=pageName&author~=authorName&types~=attachmentTypeList&start~=offset&number~=n] ===
686
687 * **HTTP Method:** GET
688 ** **Media types:**
689 *** application/xml (Attachments element)
690 ** **Description:** The list of attachments of pages located in a given {spaceName}. Filters can be set for the name, page, author and/or types (comma separated list of strings) to include only attachments that match the given filters. This resource can be used to search for attachments in a space.
691 ** **Status codes:**
692 *** 200: If the request was successful.
693 *** 401: If the user is not authorized.
694
695 === /wikis/{wikiName}/attachments[?name~=attachmentName&page~=pageName&space~=spaceName&author~=authorName&types~=attachmentTypeList&start~=offset&number~=n] ===
696
697 * **HTTP Method:** GET
698 ** **Media types:**
699 *** application/xml (Attachments element)
700 ** **Description:** The list of attachments in a given {wikiName}. Filters can be set for the name, page, space, author and/or type (comma separated list of strings) to include only attachments that match the given filters. This resource can be used to search for attachments in a wiki.
701 ** **Status codes:**
702 *** 200: If the request was successful.
703 *** 401: If the user is not authorized.
704
705 == Object resources ==
706
707 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/objects[?start~=offset&number~=n] ===
708
709 * **HTTP Method:** GET
710 ** **Media types:**
711 *** application/xml (Objects element)
712 ** **Description:** The list of objects associated to a page.
713 ** **Status codes:**
714 *** 200: If the request was successful.
715 *** 401: If the user is not authorized.
716
717 \\
718
719 * **HTTP Method:** POST
720 ** **Accepted media types:**
721 *** application/xml (Object element)
722 *** application/x-www-form-urlencoded (a set of property#name=value pairs representing properties and a field className)
723 ** **Media types:**
724 *** application/xml (Object element)
725 ** **Description:** Create a new object.
726 ** **Status codes:**
727 *** 201: If the object was created (The Location header will contain the URI associated to the newly created object).
728 *** 401: If the user is not authorized.
729
730 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/objects/{className}[?start~=offset&number~=n] ===
731
732 * **HTTP Method:** GET
733 ** **Media types:**
734 *** application/xml (Objects element)
735 ** **Description:** The list of objects of a given {className} associated to a page.
736 ** **Status codes:**
737 *** 200: If the request was successful.
738 *** 401: If the user is not authorized.
739
740 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/objects/{className}/{objectNumber} ===
741
742 * **HTTP Method:** GET
743 ** **Media types:**
744 *** application/xml (Object element)
745 ** **Description:** The object of type {className} identified by {objectNumber} associated to the given page.
746 ** **Status codes:**
747 *** 200: If the request was successful.
748 *** 401: If the user is not authorized.
749
750 \\
751
752 * **HTTP Method:** PUT
753 ** **Accepted media types:**
754 *** application/xml (Object element)
755 *** application/x-www-form-urlencoded (a set of property#name=value pairs representing properties)
756 ** **Media types:**
757 *** application/xml (Object element)
758 ** **Description:** Modify the object properties.
759 ** **Status codes:**
760 *** 202: If the object was updated.
761 *** 401: If the user is not authorized.
762
763 \\
764
765 * **HTTP Method:** DELETE
766 ** **Media types:**
767 ** **Description:** Delete the object.
768 ** **Status codes:**
769 *** 204: If the object was deleted.
770 *** 401: If the user is not authorized.
771
772 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/objects/{className}/{objectNumber}/properties ===
773
774 * **HTTP Method:** GET
775 ** **Media types:**
776 *** application/xml (Properties element)
777 ** **Description:** The properties of the object of type {className} identified by {objectNumber} associated to the given page.
778 ** **Status codes:**
779 *** 200: If the request was successful.
780 *** 401: If the user is not authorized.
781
782 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/objects/{className}/{objectNumber}/properties/{propertyName} ===
783
784 * **HTTP Method:** GET
785 ** **Media types:**
786 *** application/xml (Properties element)
787 ** **Description:** The property {propertyname} of the object of type {className} identified by {objectNumber} associated to the given page.
788 ** **Status codes:**
789 *** 200: If the request was successful.
790 *** 401: If the user is not authorized.
791
792 \\
793
794 * **HTTP Method:** PUT
795 ** **Accepted media types:**
796 *** application/xml (Property element)
797 *** text/plain
798 *** application/x-www-form-urlencoded (a field property#name=value pairs representing a property)
799 ** **Media types:**
800 *** application/xml (Property element)
801 ** **Description:** Modify the object properties.
802 ** **Status codes:**
803 *** 202: If the object was updated.
804 *** 401: If the user is not authorized.
805
806 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version}/objects[?start~=offset&number~=n] ===
807
808 * **HTTP Method:** GET
809 ** **Media types:**
810 *** application/xml (Objects element)
811 ** **Description:** The list of objects associated to a page at a given {version}.
812 ** **Status codes:**
813 *** 200: If the request was successful.
814 *** 401: If the user is not authorized.
815
816 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version}/objects/{className}/{objectNumber} ===
817
818 * **HTTP Method:** GET
819 ** **Media types:**
820 *** application/xml (Object element)
821 ** **Description:** The object of type {className} identified by {objectNumber} associated to the given page at a given {version}.
822 ** **Status codes:**
823 *** 200: If the request was successful.
824 *** 401: If the user is not authorized.
825
826 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version}/objects/{className}/{objectNumber}/properties ===
827
828 * **HTTP Method:** GET
829 ** **Media types:**
830 *** application/xml (Properties element)
831 ** **Description:** The properties of the object of type {className} identified by {objectNumber} associated to the given page at a given {version}.
832 ** **Status codes:**
833 *** 200: If the request was successful.
834 *** 401: If the user is not authorized.
835
836 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version}/objects/{className}/{objectNumber}/properties/{propertyName} ===
837
838 * **HTTP Method:** GET
839 ** **Media types:**
840 *** application/xml (Properties element)
841 ** **Description:** The property {propertyname} of the object of type {className} identified by {objectNumber} associated to the given page at a given {version}.
842 ** **Status codes:**
843 *** 200: If the request was successful.
844 *** 401: If the user is not authorized.
845
846 === /wikis/{wikiName}/class/{className}/objects ===
847
848 * **HTTP Method:** GET
849 ** **Media types:**
850 *** application/xml (Objects element)
851 ** **Description:** The list of all the objects of a given {className}.
852 ** **Status codes:**
853 *** 200: If the request was successful.
854 *** 401: If the user is not authorized.
855
856 == Class resources ==
857
858 === /wikis/{wikiName}/classes[?start~=offset&number~=n] ===
859
860 * **HTTP Method:** GET
861 ** **Media types:**
862 *** application/xml (Classes element)
863 ** **Description:** The list of all the classes defined in the wiki {wikiName}
864 ** **Status codes:**
865 *** 200: If the request was successful.
866 *** 401: If the user is not authorized.
867
868 === /wikis/{wikiName}/classes/{className} ===
869
870 * **HTTP Method:** GET
871 ** **Media types:**
872 *** application/xml (Class element)
873 ** **Description:** The {className} definition
874 ** **Status codes:**
875 *** 200: If the request was successful.
876 *** 401: If the user is not authorized.
877
878 === /wikis/{wikiName}/classes/{className}/properties ===
879
880 * **HTTP Method:** GET
881 ** **Media types:**
882 *** application/xml (Properties element)
883 ** **Description:** The properties of the class {className}.
884 ** **Status codes:**
885 *** 200: If the request was successful.
886 *** 401: If the user is not authorized.
887
888 === /wikis/{wikiName}/classes/{className}/properties/{property} ===
889
890 * **HTTP Method:** GET
891 ** **Media types:**
892 *** application/xml (Property element)
893 ** **Description:** The property {property} of the class {className}.
894 ** **Status codes:**
895 *** 200: If the request was successful.
896 *** 401: If the user is not authorized.
897
898 == Job resources ==
899
900 A job is identified by an ID (##jobId##) which is a list of strings. In the REST URL, you have to represent the ID with a list of strings separated by ##/##. (eg: ##refactoring/delete/11451##).
901
902 === /jobstatus/{jobId} {{info}}Since 7.2M3{{/info}} ===
903
904 * **HTTP Method:** GET
905 ** **Media types:**
906 *** application/xml (JobStatus element)
907 ** **Description:** status of a job
908 ** **Status codes:**
909 *** 200: If the request was successful.
910 *** 404: If the job status has not been found
911
912 === /joblog/{jobId}[?level~={error,warn,info,debug,trace}][?fromLevel~={error,warn,info,debug,trace}] {{info}}Since 7.2M3{{/info}} ===
913
914 * **HTTP Method:** GET
915 ** **Media types:**
916 *** application/xml (JobLog element)
917 ** **Description:** log of a job
918 ** **Status codes:**
919 *** 200: If the request was successful.
920 *** 404: If the job status has not been found
921
922 == Other resources ==
923
924 === /wikis/{wikiName}/modifications[?start~=offset&number~=n&date~=t] ===
925
926 * **HTTP Method:** GET
927 ** **Media types:**
928 *** application/xml (Modifications element)
929 ** **Description:** The list of the latest modification made to the wiki {wikiName} starting from time t (t is expressed in milliseconds from 1970 of the starting date)
930 ** **Status codes:**
931 *** 200: If the request was successful.
932 *** 401: If the user is not authorized.
933
934 = Custom resources =
935
936 It's possible to easily add any REST resource by registering a ##org.xwiki.rest.XWikiResource## java component on your wiki (see [[Component guide>>DevGuide.WritingComponents]] for more details).
937
938 {{code language="java"}}
939 package org.xwiki.contrib.rest;
940
941 import javax.ws.rs.DefaultValue;
942 import javax.ws.rs.GET;
943 import javax.ws.rs.Path;
944
945 import org.xwiki.component.annotation.Component;
946 import org.xwiki.rest.XWikiResource;
947
948 @Component("org.xwiki.contrib.rest.HelloWordResource")
949 @Path("/myresources/{myresourcename}")
950 class HelloWorldResource extends XWikiResource {
951 @GET
952 public String get(@PathParam("myresourcename") @DefaultValue("world") String myresourcename)
953 {
954 return "Hello " + myresourcename;
955 }
956 }
957 {{/code}}
958
959 The name of the component has to be the class FQN.
960
961 You can find more examples on [[this page>>https://github.com/xwiki/xwiki-platform/tree/master/xwiki-platform-core/xwiki-platform-rest/xwiki-platform-rest-server/src/main/java/org/xwiki/rest]].
962
963 Starting from release 4.3M2, the RESTful API modules have been refactored so that now resource declarations are available in a separate module.
964 This means that all the information about resources, i.e., URI Paths, supported methods, query parameters, and so on, are available to module developers without having to include the big REST Server module.
965
966 Clients willing to access/use the REST API can then declare a dependency on xwiki-platform-rest-api and have all this information available for interacting with it. There are two use cases for this:
967
968 * Another platform module that wants to generate responses with links to existing resources.
969 * HTTP clients that wants to make requests to the RESTful API.
970
971 The xwiki-platform-rest-api module can be also seen as an authoritative reference for the REST API.
972
973 = Generate a REST URL for a resource =
974
975 If you need to generate a REST URL as String for a resource inside a script, you can use the REST script services:
976
977 {{code language="velocity"}}
978 ## Return a relative URL String unless the reference wiki is different from the current wiki
979 $services.rest.url($entityReference)
980
981 ## Force returning an external form URL String, false as second parameter would have the same effect that the previous call
982 $services.rest.url($entityReference, true)
983 {{/code}}
984
985 Where ##$entityReference## could be:
986
987 * a ##DocumentReference##
988 * a ##SpaceReference##
989
990 We plan to add more supported entities in the future (ObjectReference, ClassReference, etc...).
991
992 = Using the RESTful API =
993
994 == Highlevel description and tutorial for a basic usage of the RESTful API ==
995
996 See [[this tutorial>>http://blog.fabio.mancinelli.me/2011/03/07/XWikis_RESTful_API.html]] by Fabio Mancinelli.
997
998 == Creating an XWiki Object ==
999
1000 In this example we will use the [[curl>>http://curl.haxx.se/]] utility as the HTTP client.
1001
1002 Imagine that you want to create on the page Test.Test a new object of the class XWiki.TestClass, supposing that the class has a property called ##text##.
1003
1004 So, on the command line, you have to do the following:
1005
1006 {{code}}
1007 $ curl -u Admin:admin
1008 -X POST
1009 -H "Content-type: application/xml"
1010 -H "Accept: application/xml"
1011 -d "@test.xml"
1012 http://localhost/xwiki/rest/wikis/xwiki/spaces/Test/pages/Test/objects
1013 {{/code}}
1014
1015 where ##test.xml## is:
1016
1017 {{code language="xml"}}
1018 <object xmlns="http://www.xwiki.org">
1019 <className>XWiki.TestClass</className>
1020 <property name="text">
1021 <value>Whatever you want to put here</value>
1022 </property>
1023 </object>
1024 {{/code}}
1025
1026 Alternatively you can use the less verbose ##application/x-www-form-urlencoded format##:
1027
1028 {{code}}
1029 $ curl -u Admin:admin
1030 -X POST
1031 -H "Content-type: application/x-www-form-urlencoded"
1032 -H "Accept: application/xml"
1033 -d "@test.txt"
1034 http://localhost/xwiki/rest/wikis/xwiki/spaces/Test/pages/Test/objects
1035 {{/code}}
1036
1037 where ##test.txt## contains something like:
1038
1039 {{code}}
1040 className=XWiki.TestClass&property#test=Whatever+you+want
1041 {{/code}}
1042
1043 Or, better, you can use directly curl to specify these parameters
1044 using multiple ##-d## switches:
1045
1046 {{code}}
1047 $ curl -u Admin:admin
1048 -X POST -H "Content-type: application/x-www-form-urlencoded"
1049 -H "Accept: application/xml"
1050 -d "className=XWiki.TestClass"
1051 -d "property#test=Whatever you want"
1052 http://localhost/xwiki/rest/wikis/xwiki/spaces/Test/pages/Test/objects
1053 {{/code}}
1054
1055 The advantage of the second approach is that curl will take care of url-encode your content, while if you send a file you are responsible for this.
1056
1057 === Remarks: ===
1058
1059 * In the ##application/x-www-form-urlencoded## format the "property#" is a standard immutable prefix that is used to distinguish attributes referring to property values from the attributes referring to the object. For example if we had ##className=XYZ&Text=FOO## we would have had an ambiguity on ##className## because we couldn't understand if ##className## is a property of the object to be set to XYZ or an attribute that describes the object itself (i.e., its metadata like the ##className##). By having the ##property### prefix this ambiguity is resolved.
1060
1061 * The information you get back when you retrieve an object (i.e., all
1062 the ##<attribute>## elements) are useful when clients need to understand the type of data contained in an object (e.g., when they want to display it). They are not necessary when creating an object because the system already has this information. That's why the XML to be sent is smaller. Actually the only information needed is the ##<className>## and a set of ##<property name="..."><value>## elements.
1063
1064 * How do you know what kind of information you can send with the XML? You can discover it by using the class description URI. If you go to ##http:~/~/localhost:8080/xwiki/rest/wikis/xwiki/classes ## you will get a list of all the classes defined in the Wiki. By looking at this you will understand what are the properties defined by each class, their types and attributes. In that way you will know what you're allowed to put in the ##<property><value>## elements of the XML you send.
1065
1066 = Examples =
1067
1068 == Getting the list of users ==
1069
1070 Since Users are stored as Objects, you can do a search of the type ##XWiki.XWikiUsers##. For example:
1071
1072 {{code}}
1073 http://<server>/xwiki/rest/wikis/query?q=object:XWiki.XWikiUsers
1074 {{/code}}

Get Connected