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>>platform:Features.XWikiRESTfulAPI#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/propertyValues}}}|The representation for the list of property values.
66 |{{{http://www.xwiki.org/rel/properties}}}|The representation of the list of properties associated to the current resource.
67 |{{{http://www.xwiki.org/rel/modifications}}}|The representation of the list of modifications associated to the current resource.
68 |{{{http://www.xwiki.org/rel/children}}}|The representation of the list of children associated to the current resource.
69 |{{{http://www.xwiki.org/rel/tags}}}|The representation of the list of tags associated to the current resource.
70 |{{{http://www.xwiki.org/rel/tag}}}|The representation of a tag.
71 |{{{http://www.xwiki.org/rel/search}}}|The representation for a search resource.
72 |{{{http://www.xwiki.org/rel/syntaxes}}}|The representation for a syntax resource.
73
74 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).
75
76 == The "HATEOAS" Graph ==
77
78 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.
79
80 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.
81
82 = Interacting with the XWiki RESTful API =
83
84 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!
85 If you want to write more complex programs you might download an HTTP library for your favorite language (e.g., [[http://hc.apache.org/]]), see [[this post>>xwiki:Blog.Use the Apache HTTP library to interact with the XWiki RESTful API]] by [[Mohamed Boussaa>>xwiki:XWiki.mouhb]].
86
87 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.
88
89 If you use this approach (Apache HTTP Client + JAXB) you will find yourself writing some code like this:
90
91 {{code language="java"}}
92 import javax.xml.bind.JAXBContext;
93 import javax.xml.bind.Unmarshaller;
94
95 import org.apache.commons.httpclient.HttpClient;
96 import org.apache.commons.httpclient.methods.GetMethod;
97 import org.xwiki.rest.model.jaxb.Page;
98
99 ...
100 HttpClient httpClient = new HttpClient();
101 JAXBContext context = JAXBContext.newInstance("org.xwiki.rest.model.jaxb");
102 Unmarshaller unmarshaller = context.createUnmarshaller();
103
104 GetMethod getMethod = new GetMethod("http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main/pages/WebHome");
105 getMethod.addRequestHeader("Accept", "application/xml");
106 httpClient.executeMethod(getMethod);
107
108 Page page = (Page) unmarshaller.unmarshal(getMethod.getResponseBodyAsStream());
109 {{/code}}
110
111 And you will have all the information about the Main.WebHome page in the Page object, without the need of handling XML directly.
112
113 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.
114
115 By using curl, the previous example would have been:
116
117 {{code language="xml"}}
118 $ curl http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main/pages/WebHome
119 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
120 <page xmlns="http://www.xwiki.org">
121 <link rel="http://www.xwiki.org/rel/space" href="http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main"/>
122 ...
123 {{/code}}
124
125 == Authentication ==
126
127 The XWiki RESTful API supports two types of authentication:
128
129 * **HTTP BASIC Auth**: You provide your credentials using the Authorization HTTP header
130 * **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.
131
132 If you don't provide any credentials the XWiki RESTful API will recognize you as a XWiki.Guest user.
133
134 So if you have, let's say a Main.PrivatePage, and you try to do:
135
136 {{code language="none"}}
137 $ curl -v http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main/pages/PrivatePage
138 ...
139 < HTTP/1.1 401 Unauthorized
140 ...
141 {{/code}}
142
143 You will get an Unauthorized empty response.
144
145 On the contrary, by specifying Admin credentials you gain access to the actual page:
146
147 {{code language="xml"}}
148 $ curl -u Admin:admin http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main/pages/PrivatePage
149 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
150 <page xmlns="http://www.xwiki.org">
151 <link rel="http://www.xwiki.org/rel/space" href="http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main"/>
152 ...
153 <content>Only admin can see this</content>
154 </page>
155 {{/code}}
156
157 == Sending representations ==
158
159 Many resources are modifiable, so you can send representations in order to change the state of those resources (e.g., pages).
160 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).
161
162 Resource update is usually done by using the PUT method, while resource creation is done via PUT or POST.
163
164 For example, in order to create a page you might do the following:
165
166 {{code language="xml"}}
167 $ 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
168 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
169 <page xmlns="http://www.xwiki.org">
170 <link rel="http://www.xwiki.org/rel/space" href="http://localhost:8080/xwiki/rest/wikis/xwiki/spaces/Main"/>
171 ...
172 <version>1.1</version>
173 <majorVersion>1</majorVersion>
174 <minorVersion>1</minorVersion>
175 <created>2009-03-21+01:00</created>
176 <creator>XWiki.Admin</creator>
177 <modified>2009-03-21+01:00</modified>
178 <modifier>XWiki.Admin</modifier>
179 <content>This is a new page</content>
180 </page>
181 {{/code}}
182
183 Where newpage.xml is an XML file containing
184
185 {{code language="xml"}}
186 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
187 <page xmlns="http://www.xwiki.org">
188 <title>Hello world</title>
189 <syntax>xwiki/2.0</syntax>
190 <content>This is a new page</content>
191 </page>
192 {{/code}}
193
194 The page has been created and is accessible. Subsequent PUT requests to the page URI will modify its content.
195
196 You can specify a subset of the three elements {{{title}}}, {{{syntax}}}, and {{{content}}} in the XML when updating/creating a page.
197 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.
198
199 == Overcoming browser limitations ==
200
201 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.
202
203 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.
204
205 This overriding mechanism allows the interaction with the XWiki RESTful API by using any kind of browser.
206
207 == PUT vs POST ==
208
209 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.
210
211 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.
212
213 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.
214
215 = XWiki RESTful API Documentation =
216
217 In this section you will find the documentation of the whole XWiki RESTful API.
218
219 **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]].
220
221 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.
222
223 == Root resources ==
224
225 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)
226
227 === / ===
228
229 * **HTTP Method:** GET
230 ** **Media types:**
231 *** application/xml (XWiki element)
232 ** **Description:** Retrieves the entry root description containing information about the server (currently returns the XWiki product Version).
233 ** **Status codes:**
234 *** 200: If the request was successful.
235
236 === /syntaxes ===
237
238 * **HTTP Method:** GET
239 ** **Media types:**
240 *** application/xml (Syntaxes element)
241 ** **Description:** The list of syntaxes supported by the XWiki instance.
242 ** **Status codes:**
243 *** 200: If the request was successful.
244
245 === /wikis ===
246
247 * **HTTP Method:** GET
248 ** **Media types:**
249 *** application/xml (Wikis element)
250 ** **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'.
251 ** **Status codes:**
252 *** 200: If the request was successful.
253
254 === /wikis/query?q~={query}&wikis~=wikiList[&distinct~={true,false}][&order~={asc,desc}][&start~=n][&number~=n][&prettyNames~={true,false}] ===
255
256 * **HTTP Method:** GET
257 ** **Media types:**
258 *** application/xml (SearchResults element)
259 ** **Description:** Search resources (pages and attachments):
260 *** [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.
261 *** [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.
262 ** **Status codes:**
263 *** 200: If the request was successful.
264
265 === /wikis/{wikiName} ===
266
267 * **HTTP Method:** GET
268 ** **Media types:**
269 *** application/xml (Wiki element)
270 ** **Description:** information about the wiki
271 ** **Status codes:**
272 *** 200: If the request was successful.
273
274 * **HTTP Method:** POST
275 ** **Accepted Media types:**
276 *** octet/stream (A XAR file)
277 ** **Media types:**
278 *** application/xml (Wiki element)
279 ** **Query parameters**
280 *** backup={true/false} - import XAR as a backup XAR
281 *** history={RESET/REPLACE/ADD} - history importing
282 ** **Description:** import a XAR in a wiki.
283 ** **Status codes:**
284 *** 200: If the request was successful.
285
286 === /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}] ===
287
288 * **HTTP Method:** GET
289 ** **Media types:**
290 *** application/xml (SearchResults element)
291 ** **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}
292 ** **Status codes:**
293 *** 200: If the request was successful.
294
295 === /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] ===
296
297 * **HTTP Method:** GET
298 ** **Media types:**
299 *** application/xml (SearchResults element)
300 ** **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 type is //hql// or //xwql// and //className// is specified, the result will also contain the data for the first object of the corresponding class.
301 ** **Status codes:**
302 *** 200: If the request was successful.
303
304 === /wikimanager (This resource is only available when using the [[multi-wiki>>extensions:Extension.Wiki Application]] feature) ===
305
306 * **HTTP Method:** POST
307 ** **Accepted Media types:**
308 *** application/xml (Wiki element)
309 ** **Media types:**
310 *** application/xml (Wiki element)
311 ** **Query parameters**
312 *** template - the wiki template to be used for initializing the wiki.
313 *** history={RESET/REPLACE/ADD} - history importing
314 ** **Description:** create a new wiki.
315 ** **Status codes:**
316 *** 200: If the request was successful.
317
318 == Space resources ==
319
320 === /wikis/{wikiName}/spaces[?start~=offset&number~=n] ===
321
322 * **HTTP Method:** GET
323 ** **Media types:**
324 *** application/xml (Spaces element)
325 ** **Description:** Retrieves the list of spaces available in the {wikiName} wiki.
326 ** **Status codes:**
327 *** 200: If the request was successful.
328
329 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/search?q~={keywords}~[~[&scope~={name,content,title,objects}...]&number~=n] ===
330
331 * **HTTP Method:** GET
332 ** **Media types:**
333 *** application/xml (Search results element)
334 ** **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}
335 ** **Status codes:**
336 *** 200: If the request was successful.
337 *** 401: If the user is not authorized.
338
339 == Page resources ==
340
341 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages[?start~=offset&number~=n] ===
342
343 * **HTTP Method:** GET
344 ** **Media types:**
345 *** application/xml (Pages element)
346 ** **Description:** The list of pages in the space {spaceName}
347 ** **Status codes:**
348 *** 200: If the request was successful.
349 *** 401: If the user is not authorized.
350
351 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}[?prettyNames~={true,false}&objects~={true,false}&class~={true,false}&attachments~={true,false}&minorRevision~={true,false}] ===
352
353 * **HTTP Method:** GET
354 ** **Media types:**
355 *** application/xml (Page element)
356 ** **Query parameters**
357 *** ##prettyNames##: also return the pretty name for various document information (like the author display name, etc). Disabled by default.
358 *** ##objects##: //[since 7.3M1]// also return the objects. Disabled by default.
359 *** ##class##: //[since 7.3M1]// also return the class. Disabled by default.
360 *** ##attachments##: //[since 7.3M1]// also return the attachments metadatas. Disabled by default.
361 ** **Description:**
362 ** **Status codes:**
363 *** 200: If the request was successful.
364 *** 401: If the user is not authorized.
365
366 \\
367
368 * **HTTP Method:** PUT
369 ** **Accepted Media types:**
370 *** application/xml (Page element)
371 *** text/plain (Only page content)
372 *** application/x-www-form-urlencoded (allowed field names: title, parent, hidden //[since 7.3]//, content)
373 ** **Media types:**
374 *** application/xml (Page element)
375 ** **Query parameters**
376 *** ##minorRevision## ({{info}}Since 9.11.4 & 10.2RC1{{/info}}): Create a minor revision for the page. Disabled by default.
377 ** **Description:** Create or updates a page.
378 ** **Status codes:**
379 *** 201: If the page was created.
380 *** 202: If the page was updated.
381 *** 304: If the page was not modified.
382 *** 401: If the user is not authorized.
383
384 \\
385
386 * **HTTP Method:** DELETE
387 ** **Media types:**
388 *** application/xml (Page element)
389 ** **Description:** Delete the page.
390 ** **Status codes:**
391 *** 204: If the request was successful.
392 *** 401: If the user is not authorized.
393
394 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history[?start~=offset&number~=n] ===
395
396 * **HTTP Method:** GET
397 ** **Media types:**
398 *** application/xml (History element)
399 ** **Description:** The list of all the versions of the given page.
400 ** **Status codes:**
401 *** 200: If the request was successful.
402 *** 401: If the user is not authorized.
403
404 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version} ===
405
406 * **HTTP Method:** GET
407 ** **Media types:**
408 *** application/xml (Page element)
409 ** **Description:** The page at version {version}
410 ** **Status codes:**
411 *** 200: If the request was successful.
412 *** 401: If the user is not authorized.
413
414 ==== /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/translations[?start~=offset&number~=n] ====
415
416 * **HTTP Method:** GET
417 ** **Media types:**
418 *** application/xml (Translations element)
419 ** **Description:** The list of available translation for the page
420 ** **Status codes:**
421 *** 200: If the request was successful.
422 *** 401: If the user is not authorized.
423
424 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/translations/{language}[?minorRevision~={true,false}] ===
425
426 * **HTTP Method:** GET
427 ** **Media types:**
428 *** application/xml (Page element)
429 ** **Description:** The page at in the given {language}.
430 ** **Status codes:**
431 *** 200: If the request was successful.
432 *** 401: If the user is not authorized.
433
434 \\
435
436 * **HTTP Method:** PUT
437 ** **Accepted Media types:**
438 *** application/xml (Page element)
439 *** text/plain (Only page content)
440 *** application/x-www-form-urlencoded (allowed field names: title, parent, content)
441 ** **Media types:**
442 *** application/xml (Page element)
443 ** **Query parameters**
444 *** ##minorRevision## ({{info}}Since 9.11.4 & 10.2RC1{{/info}}): Create a minor revision for the page. Disabled by default.
445 ** **Description:** Create or updates a page translation.
446 ** **Status codes:**
447 *** 201: If the page was created.
448 *** 202: If the page was updated.
449 *** 304: If the page was not modified.
450 *** 401: If the user is not authorized.
451
452 \\
453
454 * **HTTP Method:** DELETE
455 ** **Media types:**
456 *** application/xml (Page element)
457 ** **Description:** Delete the page translation.
458 ** **Status codes:**
459 *** 204: If the request was successful.
460 *** 401: If the user is not authorized.
461
462 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/translations/{language}/history ===
463
464 * **HTTP Method:** GET
465 ** **Media types:**
466 *** application/xml (History element)
467 ** **Description:** The list of all the available revisions of the page in a given {language}.
468 ** **Status codes:**
469 *** 200: If the request was successful.
470 *** 401: If the user is not authorized.
471
472 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/translations/{lang}/history/{version} ===
473
474 * **HTTP Method:** GET
475 ** **Media types:**
476 *** application/xml (Page element)
477 ** **Description:** A page at a given {version} in a given {language}.
478 ** **Status codes:**
479 *** 200: If the request was successful.
480 *** 401: If the user is not authorized.
481
482 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/children ===
483
484 * **HTTP Method:** GET
485 ** **Media types:**
486 *** application/xml (Pages element)
487 ** **Description:** The list of the children of a given page.
488 ** **Status codes:**
489 *** 200: If the request was successful.
490 *** 401: If the user is not authorized.
491
492 === /wikis/{wikiName}/pages[?name~=paneName&space~=spaceName&author~=authorName] ===
493
494 * **HTTP Method:** GET
495 ** **Media types:**
496 *** application/xml (Pages element)
497 ** **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.
498 ** **Status codes:**
499 *** 200: If the request was successful.
500 *** 401: If the user is not authorized.
501
502 == Tag resources ==
503
504 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/tags[?minorRevision~={true,false}] ===
505
506 * **HTTP Method:** GET
507 ** **Media types:**
508 *** application/xml (Tags element)
509 ** **Description:** List page tags.
510 ** **Status codes:**
511 *** 200: If the request was successful.
512 *** 401: If the user is not authorized.
513
514 \\
515
516 * **HTTP Method:** PUT
517 ** **Accepted Media types:**
518 *** application/xml (Tag element)
519 *** text/plain
520 *** application/x-www-form-urlencoded (allowed field names: tag)
521 ** **Media types:**
522 *** application/xml (Tags element)
523 ** **Query parameters**
524 *** ##minorRevision## ({{info}}Since 9.11.4 & 10.2RC1{{/info}}): Create a minor revision for the page. Disabled by default.
525 ** **Description:** Add a tag to the page.
526 ** **Status codes:**
527 *** 202: If the request was successful.
528 *** 401: If the user is not authorized.
529
530 === /wikis/{wikiName}/tags ===
531
532 * **HTTP Method:** GET
533 ** **Media types:**
534 *** application/xml (Tags element)
535 ** **Description:** The list of all available tags
536 ** **Status codes:**
537 *** 200: If the request was successful.
538 *** 401: If the user is not authorized.
539
540 === /wikis/{wikiName}/tags/{tag1}[,{tag2},{tag3}...][?start~=offset&number~=n] ===
541
542 * **HTTP Method:** GET
543 ** **Media types:**
544 *** application/xml (Pages element)
545 ** **Description:** The list of pages having the specified tags.
546 ** **Status codes:**
547 *** 200: If the request was successful.
548 *** 401: If the user is not authorized.
549
550 == Comments resources ==
551
552 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/comments[?start~=offset&number~=n] ===
553
554 * **HTTP Method:** GET
555 ** **Media types:**
556 *** application/xml (Comments element)
557 ** **Description:** The list of comments on a given page.
558 ** **Status codes:**
559 *** 200: If the request was successful.
560 *** 401: If the user is not authorized.
561
562 \\
563
564 * **HTTP Method:** POST
565 ** **Accepted Media types:**
566 *** application/xml (Comment element)
567 *** text/plain
568 *** application/x-www-form-urlencoded - allowed field names: ##text##, ##replyTo## (object number of the replied comment, since XE 2.3)
569 ** **Media types:**
570 *** application/xml (Comment element)
571 ** **Description:** Create a comment on the given page.
572 ** **Status codes:**
573 *** 201: If the comment was created. (The Location header will contain the URI where the comment has been created.)
574 *** 401: If the user is not authorized.
575
576 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/comments/{commentId} ===
577
578 * **HTTP Method:** GET
579 ** **Media types:**
580 *** application/xml (Comment element)
581 ** **Description:** A specific comment on a page
582 ** **Status codes:**
583 *** 200: If the request was successful.
584 *** 401: If the user is not authorized.
585
586 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version}/comments ===
587
588 * **HTTP Method:** GET
589 ** **Media types:**
590 *** application/xml (Comments element)
591 ** **Description:** The list of comments at a specific page {version}.
592 ** **Status codes:**
593 *** 200: If the request was successful.
594 *** 401: If the user is not authorized.
595
596 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version}/comments/{commentId} ===
597
598 * **HTTP Method:** GET
599 ** **Media types:**
600 *** application/xml (Comment element)
601 ** **Description:** A comment at a specific page {version}.
602 ** **Status codes:**
603 *** 200: If the request was successful.
604 *** 401: If the user is not authorized.
605
606 == Attachments resources ==
607
608 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/attachments[?start~=offset&number~=n] ===
609
610 * **HTTP Method:** GET
611 ** **Media types:**
612 *** application/xml (Attachments element)
613 ** **Description:** The list of attachments of a given page.
614 ** **Status codes:**
615 *** 200: If the request was successful.
616 *** 401: If the user is not authorized.
617
618 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/attachments/{attachmentName} ===
619
620 * **HTTP Method:** GET
621 ** **Media types:**
622 *** The same of the attachment media type.
623 ** **Description:** The attachment identified by {attachmentName} on a given page.
624 ** **Status codes:**
625 *** 200: If the request was successful.
626 *** 401: If the user is not authorized.
627
628 \\
629
630 * **HTTP Method:** PUT
631 ** **Accepted media types:**
632 *** **/**
633 ** **Media types:**
634 *** application/xml (AttachmentSummary element)
635 ** **Description:** Create an attachment identified by {attachmentName} on a given page.
636 ** **Status codes:**
637 *** 201: If the attachment was created.
638 *** 202: If the attachment was updated.
639 *** 401: If the user is not authorized.
640
641 \\
642
643 * **HTTP Method:** DELETE
644 ** **Media types:**
645 ** **Description:** Delete the attachment identified by {attachmentName} on a given page.
646 ** **Status codes:**
647 *** 204: If the attachment was deleted.
648 *** 401: If the user is not authorized.
649
650 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version}/attachments[?start~=offset&number~=n] ===
651
652 * **HTTP Method:** GET
653 ** **Media types:**
654 *** application/xml (Attachments element)
655 ** **Description:** The list of attachments at a given page {version}.
656 ** **Status codes:**
657 *** 200: If the request was successful.
658 *** 401: If the user is not authorized.
659
660 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version}/attachments/{attachmentName} ===
661
662 * **HTTP Method:** GET
663 ** **Media types:**
664 *** The same of the attachment media type.
665 ** **Description:** The attachment identified by {attachmentName} on a given page {version}.
666 ** **Status codes:**
667 *** 200: If the request was successful.
668 *** 401: If the user is not authorized.
669
670 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/attachments/{attachmentName}/history ===
671
672 * **HTTP Method:** GET
673 ** **Media types:**
674 *** application/xml (Attachments element)
675 ** **Description:** The list of available version for the {attachmentName}
676 ** **Status codes:**
677 *** 200: If the request was successful.
678 *** 401: If the user is not authorized.
679
680 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/attachments/{attachmentName}/history/{version} ===
681
682 * **HTTP Method:** GET
683 ** **Media types:**
684 *** The same of the attachment media type.
685 ** **Description:** The {attachmentName} at a given {version}
686 ** **Status codes:**
687 *** 200: If the request was successful.
688 *** 401: If the user is not authorized.
689
690 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/attachments[?name~=attachmentName&page~=pageName&author~=authorName&types~=attachmentTypeList&start~=offset&number~=n] ===
691
692 * **HTTP Method:** GET
693 ** **Media types:**
694 *** application/xml (Attachments element)
695 ** **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.
696 ** **Status codes:**
697 *** 200: If the request was successful.
698 *** 401: If the user is not authorized.
699
700 === /wikis/{wikiName}/attachments[?name~=attachmentName&page~=pageName&space~=spaceName&author~=authorName&types~=attachmentTypeList&start~=offset&number~=n] ===
701
702 * **HTTP Method:** GET
703 ** **Media types:**
704 *** application/xml (Attachments element)
705 ** **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.
706 ** **Status codes:**
707 *** 200: If the request was successful.
708 *** 401: If the user is not authorized.
709
710 == Object resources ==
711
712 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/objects[?start~=offset&number~=n] ===
713
714 * **HTTP Method:** GET
715 ** **Media types:**
716 *** application/xml (Objects element)
717 ** **Description:** The list of objects associated to a page.
718 ** **Status codes:**
719 *** 200: If the request was successful.
720 *** 401: If the user is not authorized.
721
722 \\
723
724 * **HTTP Method:** POST
725 ** **Accepted media types:**
726 *** application/xml (Object element)
727 *** application/x-www-form-urlencoded (a set of property#name=value pairs representing properties and a field className)
728 **** e.g. {{code language="none"}}className=XWiki.XWikiUsers&property#first_name=John&property#last_name=Doe{{/code}}
729 ** **Media types:**
730 *** application/xml (Object element)
731 ** **Description:** Create a new object.
732 ** **Status codes:**
733 *** 201: If the object was created (The Location header will contain the URI associated to the newly created object).
734 *** 401: If the user is not authorized.
735
736 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/objects/{className}[?start~=offset&number~=n] ===
737
738 * **HTTP Method:** GET
739 ** **Media types:**
740 *** application/xml (Objects element)
741 ** **Description:** The list of objects of a given {className} associated to a page.
742 ** **Status codes:**
743 *** 200: If the request was successful.
744 *** 401: If the user is not authorized.
745
746 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/objects/{className}/{objectNumber}[?minorRevision~={true,false}] ===
747
748 * **HTTP Method:** GET
749 ** **Media types:**
750 *** application/xml (Object element)
751 ** **Description:** The object of type {className} identified by {objectNumber} associated to the given page.
752 ** **Status codes:**
753 *** 200: If the request was successful.
754 *** 401: If the user is not authorized.
755
756 \\
757
758 * **HTTP Method:** PUT
759 ** **Accepted media types:**
760 *** application/xml (Object element)
761 *** application/x-www-form-urlencoded (a set of property#name=value pairs representing properties)
762 ** **Media types:**
763 *** application/xml (Object element)
764 ** **Query parameters**
765 *** ##minorRevision## ({{info}}Since 9.11.4 & 10.2RC1{{/info}}): Create a minor revision for the page. Disabled by default.
766 ** **Description:** Modify the object properties.
767 ** **Status codes:**
768 *** 202: If the object was updated.
769 *** 401: If the user is not authorized.
770
771 \\
772
773 * **HTTP Method:** DELETE
774 ** **Media types:**
775 ** **Description:** Delete the object.
776 ** **Status codes:**
777 *** 204: If the object was deleted.
778 *** 401: If the user is not authorized.
779
780 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/objects/{className}/{objectNumber}/properties ===
781
782 * **HTTP Method:** GET
783 ** **Media types:**
784 *** application/xml (Properties element)
785 ** **Description:** The properties of the object of type {className} identified by {objectNumber} associated to the given page.
786 ** **Status codes:**
787 *** 200: If the request was successful.
788 *** 401: If the user is not authorized.
789
790 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/objects/{className}/{objectNumber}/properties/{propertyName}[?minorRevision~={true,false}] ===
791
792 * **HTTP Method:** GET
793 ** **Media types:**
794 *** application/xml (Properties element)
795 ** **Description:** The property {propertyname} of the object of type {className} identified by {objectNumber} associated to the given page.
796 ** **Status codes:**
797 *** 200: If the request was successful.
798 *** 401: If the user is not authorized.
799
800 \\
801
802 * **HTTP Method:** PUT
803 ** **Accepted media types:**
804 *** application/xml (Property element)
805 *** text/plain
806 *** application/x-www-form-urlencoded (a field property#name=value pairs representing a property)
807 ** **Media types:**
808 *** application/xml (Property element)
809 ** **Query parameters**
810 *** ##minorRevision## ({{info}}Since 9.11.4 & 10.2RC1{{/info}}): Create a minor revision for the page. Disabled by default.
811 ** **Description:** Modify the object properties.
812 ** **Status codes:**
813 *** 202: If the object was updated.
814 *** 401: If the user is not authorized.
815
816 === /wikis/{wikiName}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version}/objects[?start~=offset&number~=n] ===
817
818 * **HTTP Method:** GET
819 ** **Media types:**
820 *** application/xml (Objects element)
821 ** **Description:** The list of objects associated to a 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} ===
827
828 * **HTTP Method:** GET
829 ** **Media types:**
830 *** application/xml (Object element)
831 ** **Description:** 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 ===
837
838 * **HTTP Method:** GET
839 ** **Media types:**
840 *** application/xml (Properties element)
841 ** **Description:** The properties 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}/spaces/{spaceName}[/spaces/{nestedSpaceName}]*/pages/{pageName}/history/{version}/objects/{className}/{objectNumber}/properties/{propertyName} ===
847
848 * **HTTP Method:** GET
849 ** **Media types:**
850 *** application/xml (Properties element)
851 ** **Description:** The property {propertyName} of the object of type {className} identified by {objectNumber} associated to the given page at a given {version}.
852 ** **Status codes:**
853 *** 200: If the request was successful.
854 *** 401: If the user is not authorized.
855
856 === /wikis/{wikiName}/classes/{className}/objects[?start~=offset&number~=n] ===
857
858 * **HTTP Method:** GET
859 ** **Media types:**
860 *** application/xml (Objects element)
861 ** **Description:** The list of all the objects of a given {className}.
862 ** **Status codes:**
863 *** 200: If the request was successful.
864 *** 401: If the user is not authorized.
865
866 == Class resources ==
867
868 === /wikis/{wikiName}/classes[?start~=offset&number~=n] ===
869
870 * **HTTP Method:** GET
871 ** **Media types:**
872 *** application/xml (Classes element)
873 ** **Description:** The list of all the classes defined in the wiki {wikiName}
874 ** **Status codes:**
875 *** 200: If the request was successful.
876 *** 401: If the user is not authorized.
877
878 === /wikis/{wikiName}/classes/{className} ===
879
880 * **HTTP Method:** GET
881 ** **Media types:**
882 *** application/xml (Class element)
883 ** **Description:** The {className} definition
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 ===
889
890 * **HTTP Method:** GET
891 ** **Media types:**
892 *** application/xml (Properties element)
893 ** **Description:** The properties of the class {className}.
894 ** **Status codes:**
895 *** 200: If the request was successful.
896 *** 401: If the user is not authorized.
897
898 === /wikis/{wikiName}/classes/{className}/properties/{propertyName} ===
899
900 * **HTTP Method:** GET
901 ** **Media types:**
902 *** application/xml (Property element)
903 ** **Description:** The property {propertyName} of the class {className}.
904 ** **Status codes:**
905 *** 200: If the request was successful.
906 *** 401: If the user is not authorized.
907
908 === /wikis/{wikiName}/classes/{className}/properties/{propertyName}/values {{info}}Since 9.8RC1{{/info}} ===
909
910 Request parameters:
911
912 |=Name|=Description|\\
913 |limit|Limit the number of values returned. Zero or a negative number means no limit.
914 |fp|Filter parameters, used to filter the returned values. You can pass multiple filter values by repeating the query string parameter. The way in which the property values are filtered depends on the property type.
915
916 * **HTTP Method:** GET
917 ** **Media types:**
918 *** application/xml (Property element)
919 ** **Description:** The list of values for the property {propertyName} of the class {className}. At the moment only Database List properties are supported.
920 ** **Status codes:**
921 *** 200: If the request was successful.
922 *** 401: If the user is not authorized to view the specified property.
923 *** 404: If the specified property doesn't exist.
924
925 == Job resources ==
926
927 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##).
928
929 === /jobstatus/{jobId} {{info}}Since 7.2M3{{/info}} ===
930
931 Request parameters:
932
933 |=Name|=Required|=Values|=Default|=Description|=Version
934 |##request##|no|##true~|false##|##false##|Return also the job request|9.1RC1
935 |##progress##|no|##true~|false##|##true##|Return also the job progress|9.1RC1
936 |##log##|no|##true~|false##|##false##|Return also the job log|9.1RC1
937 |##log_fromLevel##|no|##error~|warn~|info~|debug~|trace##||Indicate the level from which to return logs|9.1RC1
938
939 * **HTTP Method:** GET
940 ** **Media types:**
941 *** application/xml (JobStatus element)
942 ** **Description:** status of a job
943 ** **Status codes:**
944 *** 200: If the request was successful.
945 *** 404: If the job status has not been found
946
947 === /joblog/{jobId} {{info}}Since 7.2M3{{/info}} ===
948
949 Request parameters:
950
951 |=Name|=Required|=Values|=Default|=Description|=Version
952 |##level##|no|##error~|warn~|info~|debug~|trace##||Indicate the exact level for which to return logs|7.2M3
953 |##fromLevel##|no|##error~|warn~|info~|debug~|trace##||Indicate the level from which to return logs|7.2M3
954
955 * **HTTP Method:** GET
956 ** **Media types:**
957 *** application/xml (JobLog element)
958 ** **Description:** log of a job
959 ** **Status codes:**
960 *** 200: If the request was successful.
961 *** 404: If the job status has not been found
962
963 === /jobs {{info}}Since 9.1RC1{{/info}} ===
964
965 Request parameters:
966
967 |=Name|=Required|=Values|=Default|=Description|=Version
968 |##jobType##|yes|||The type of the job to pass to the Job Executor|9.1RC1
969 |##async##|no|##true~|false##|##true##|If false, return the response only when the job is done|9.1RC1
970
971 This API is designed to be a REST clone of the JobExecutor Java API (the only real difference right now being way to deal with asynchronous jobs) documented on http://extensions.xwiki.org/xwiki/bin/view/Extension/Job+Module#HUseanexistingjob so the concepts (job type, job request) are the same and the exact information to put in the job request depends on the job you want to run and are usually documented in the extension this job is coming from (extension module, refactoring, etc.). There is JAXB objects provided for the Java side to help generate proper HTTP request but for pure HTTP use case it usually helps to ask for the status of an existing job to have an hint of how the XML/JSON should look like (see [[jobstatus section>>||anchor="H2Fjobstatus2F7BjobId7D"]]).
972
973 Since 9.2RC1 jobs started trough the REST API automatically get their runtime context injected with the following REST HTTP request context properties:
974
975 * current wiki
976 * current user
977 * request URL and parameters
978
979 * **HTTP Method:** PUT
980 ** **Input:**
981 *** Media Types: ##application/xml## or ##application/json##
982 *** Input body: ##JobRequest## element
983 ** **Output:**
984 *** Media Types: ##application/xml## or ##application/json##
985 *** Response body: ##JobStatus## element
986 ** **Description:** Start a new job synchronously or asynchronously
987 ** **Status codes:**
988 *** 200: If the job was successfully executed
989 *** 401: If the user is not authorized (i.e. doesn't have Programming Rights)
990 *** 500: Failing jobs with ##async=false## return an error 500 (Since 9.7RC1)
991
992 == Other resources ==
993
994 === /wikis/{wikiName}/modifications[?start~=offset&number~=n&date~=t] ===
995
996 * **HTTP Method:** GET
997 ** **Media types:**
998 *** application/xml (Modifications element)
999 ** **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)
1000 ** **Status codes:**
1001 *** 200: If the request was successful.
1002 *** 401: If the user is not authorized.
1003
1004 = Custom resources =
1005
1006 == In Wiki Pages ==
1007
1008 If you can't find an existing REST endpoint for your needs, you can create your own own by creating a wiki page and putting script in it. For example let's imagine you'd like to get a list of all pages under a given space. You could write a page, say ##GetChildren## with the following content:
1009
1010 {{code language="velocity"}}
1011 {{velocity}}
1012 #if ("$!request.space" != '')
1013 #set ($discard = $response.setContentType('text/xml'))
1014 <?xml version="1.0" encoding="UTF-8"?>
1015 <pages>
1016 #set ($query = $services.query.xwql("select doc.fullName from Document doc where ((doc.space like :spacelike escape '!') or (doc.space = :space)) and language='' order by doc.date desc"))
1017 #set ($spaceReferenceString = $request.space)
1018 #set ($spaceLike = $spaceReferenceString.replaceAll('([%_!])', '!$1').concat('.%'))
1019 #set ($query = $query.bindValue('spacelike', $spaceLike))
1020 #set ($query = $query.bindValue('space', $spaceReferenceString))
1021 #foreach ($item in $query.execute())
1022 <page>$item</page>
1023 #end
1024 </pages>
1025 #end
1026 {{/velocity}}
1027 {{/code}}
1028
1029 The calling it for example with the following URL ##http:~/~/localhost:8080/xwiki/bin/get/GetChildren/?space=Sandbox&xpage=plain&outputSyntax=plain## would give something like:
1030
1031 {{code language="none"}}
1032 <pages>
1033 <page>Sandbox.Test.WebHome</page>
1034 <page>Sandbox.TestPage2</page>
1035 <page>Sandbox.ApplicationsPanelEntry</page>
1036 <page>Sandbox.TestPage3</page>
1037 <page>Sandbox.TestPage1</page>
1038 <page>Sandbox.WebPreferences</page>
1039 <page>Sandbox.WebHome</page>
1040 </pages>
1041 {{/code}}
1042
1043 == In Java ==
1044
1045 It's possible to easily add any REST resource by registering a ##org.xwiki.rest.XWikiResource## java component on your wiki (see [[Component guide>>platform:DevGuide.WritingComponents]] for more details).
1046
1047 {{code language="java"}}
1048 package org.xwiki.contrib.rest;
1049
1050 import javax.ws.rs.DefaultValue;
1051 import javax.ws.rs.GET;
1052 import javax.ws.rs.Path;
1053
1054 import org.xwiki.component.annotation.Component;
1055 import org.xwiki.rest.XWikiResource;
1056
1057 @Component("org.xwiki.contrib.rest.HelloWorldResource")
1058 @Path("/myresources/{myresourcename}")
1059 public class HelloWorldResource extends XWikiResource {
1060 @GET
1061 public String get(@PathParam("myresourcename") @DefaultValue("world") String myresourcename)
1062 {
1063 return "Hello " + myresourcename;
1064 }
1065 }
1066 {{/code}}
1067
1068 The name of the component has to be the class FQN.
1069
1070 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]].
1071
1072 Starting from release 4.3M2, the RESTful API modules have been refactored so that now resource declarations are available in a separate module.
1073 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.
1074
1075 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:
1076
1077 * Another platform module that wants to generate responses with links to existing resources.
1078 * HTTP clients that wants to make requests to the RESTful API.
1079
1080 The xwiki-platform-rest-api module can be also seen as an authoritative reference for the REST API.
1081
1082 = Generate a REST URL for a resource =
1083
1084 If you need to generate a REST URL as String for a resource inside a script, you can use the REST script services:
1085
1086 {{code language="velocity"}}
1087 ## Return a relative URL String unless the reference wiki is different from the current wiki
1088 $services.rest.url($entityReference)
1089
1090 ## Force returning an external form URL String, false as second parameter would have the same effect that the previous call
1091 $services.rest.url($entityReference, true)
1092
1093 ## String parameter automaticallly converter to entity reference
1094 $services.rest.url('MySpace.MyPage')
1095 $services.rest.url('document:MySpace.MyPage')
1096 $services.rest.url('space:MySpace')
1097 {{/code}}
1098
1099 Where ##$entityReference## could be:
1100
1101 * a ##DocumentReference##
1102 * a ##SpaceReference##
1103
1104 We plan to add more supported entities in the future (ObjectReference, ClassReference, etc...).
1105
1106 = Using the RESTful API =
1107
1108 == Tutorial ==
1109
1110 See [[this tutorial>>http://blog.fabio.mancinelli.me/2011/03/07/XWikis_RESTful_API.html]] by Fabio Mancinelli.
1111
1112 == Creating an XWiki Object ==
1113
1114 In this example we will use the [[curl>>http://curl.haxx.se/]] utility as the HTTP client.
1115
1116 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##.
1117
1118 So, on the command line, you have to do the following:
1119
1120 {{code}}
1121 $ curl -u Admin:admin
1122 -X POST
1123 -H "Content-type: application/xml"
1124 -H "Accept: application/xml"
1125 -d "@test.xml"
1126 http://localhost/xwiki/rest/wikis/xwiki/spaces/Test/pages/Test/objects
1127 {{/code}}
1128
1129 where ##test.xml## is:
1130
1131 {{code language="xml"}}
1132 <object xmlns="http://www.xwiki.org">
1133 <className>XWiki.TestClass</className>
1134 <property name="text">
1135 <value>Whatever you want to put here</value>
1136 </property>
1137 </object>
1138 {{/code}}
1139
1140 Alternatively you can use the less verbose ##application/x-www-form-urlencoded format##:
1141
1142 {{code}}
1143 $ curl -u Admin:admin
1144 -X POST
1145 -H "Content-type: application/x-www-form-urlencoded"
1146 -H "Accept: application/xml"
1147 -d "@test.txt"
1148 http://localhost/xwiki/rest/wikis/xwiki/spaces/Test/pages/Test/objects
1149 {{/code}}
1150
1151 where ##test.txt## contains something like:
1152
1153 {{code}}
1154 className=XWiki.TestClass&property#test=Whatever+you+want
1155 {{/code}}
1156
1157 Or, better, you can use directly curl to specify these parameters
1158 using multiple ##-d## switches:
1159
1160 {{code}}
1161 $ curl -u Admin:admin
1162 -X POST -H "Content-type: application/x-www-form-urlencoded"
1163 -H "Accept: application/xml"
1164 -d "className=XWiki.TestClass"
1165 -d "property#test=Whatever you want"
1166 http://localhost/xwiki/rest/wikis/xwiki/spaces/Test/pages/Test/objects
1167 {{/code}}
1168
1169 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.
1170
1171 === Remarks: ===
1172
1173 * 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.
1174
1175 * The information you get back when you retrieve an object (i.e., all
1176 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.
1177
1178 * 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.
1179
1180 == Formats of files ==
1181
1182 A XSD schema exists for XWiki (look [[here>>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]] for the source).
1183
1184 However, you may not know exactly how to write the XML files to use when using the PUT method. First thing to know, you may try to get examples by using ##GET## HTTP request to the REST service using cURL or similar tools.
1185
1186 But in order to help you, you'll find below the different formats that you can use. Note that the following XML files are exhaustive files but not all the elements are required.
1187
1188 === Example of a file for a ##wiki## ===
1189
1190 {{code language="xml"}}
1191 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
1192 <wiki xmlns="http://www.xwiki.org">
1193 <id>xwiki</id>
1194 <name>xwiki</name>
1195 <description>Some description of the wiki</description>
1196 <owner>Admin</owner>
1197 </wiki>
1198 {{/code}}
1199
1200 === Example of a file for a ##space## ===
1201
1202 {{code language="xml"}}
1203 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
1204 <space xmlns="http://www.xwiki.org">
1205 <id>xwiki:Main</id>
1206 <wiki>xwiki</wiki>
1207 <name>Main</name>
1208 <home>xwiki:Main.WebHome</home>
1209 <xwikiRelativeUrl>http://localhost:8080/xwiki/bin/view/Main/</xwikiRelativeUrl>
1210 <xwikiAbsoluteUrl>http://localhost:8080/xwiki/bin/view/Main/</xwikiAbsoluteUrl>
1211 </space>
1212 {{/code}}
1213
1214 === Example of a file for a ##page## ===
1215
1216 {{code language="xml"}}
1217 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
1218 <page xmlns="http://www.xwiki.org">
1219 <id>xwiki:Main.WebHome</id>
1220 <fullName>Main.WebHome</fullName>
1221 <wiki>xwiki</wiki>
1222 <space>Main</space>
1223 <name>WebHome</name>
1224 <title>Home</title>
1225 <parent/>
1226 <parentId/>
1227 <version>1.1</version>
1228 <author>XWiki.Admin</author>
1229 <authorName>Administrator</authorName>
1230 <xwikiRelativeUrl>http://localhost:8080/xwiki/bin/view/Main/</xwikiRelativeUrl>
1231 <xwikiAbsoluteUrl>http://localhost:8080/xwiki/bin/view/Main/</xwikiAbsoluteUrl>
1232 <translations/>
1233 <syntax>xwiki/2.0</syntax>
1234 <language/>
1235 <majorVersion>1</majorVersion>
1236 <minorVersion>1</minorVersion>
1237 <hidden>false</hidden>
1238 <created>2009-09-09T02:00:00+02:00</created>
1239 <creator>XWiki.Admin</creator>
1240 <creatorName>Administrator</creatorName>
1241 <modified>2015-10-29T11:19:02+01:00</modified>
1242 <modifier>XWiki.Admin</modifier>
1243 <modifierName>Administrator</modifierName>
1244 <comment>Imported from XAR</comment>
1245 <content>{{include reference="Dashboard.WebHome" context="new"/}}</content>
1246 </page>
1247 {{/code}}
1248
1249 === Example of a file for a ##tag## ===
1250
1251 {{code language="xml"}}
1252 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
1253 <tags xmlns="http://www.xwiki.org">
1254 <tag name="food"></tag>
1255 </tags>
1256 {{/code}}
1257
1258 === Example of a file for a ##comment## ===
1259
1260 {{code language="xml"}}
1261 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
1262 <comments xmlns="http://www.xwiki.org">
1263 <comment>
1264 <id>0</id>
1265 <pageId>xwiki:Main.WebHome</pageId>
1266 <author>XWiki.Admin</author>
1267 <authorName>Administrator</authorName>
1268 <date>2015-11-13T18:20:51.936+01:00</date>
1269 <highlight/>
1270 <text>This is a comment</text>
1271 <replyTo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
1272 </comment>
1273 </comments>
1274 {{/code}}
1275
1276 === Example of a file for an ##object## ===
1277
1278 {{code language="xml"}}
1279 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
1280 <object xmlns="http://www.xwiki.org">
1281 <id>xwiki:Main.WebHome:c170a0a8-cc17-41cd-aa1e-6f6faf1d9f28</id>
1282 <guid>c170a0a8-cc17-41cd-aa1e-6f6faf1d9f28</guid>
1283 <pageId>xwiki:Main.WebHome</pageId>
1284 <pageVersion>1.1</pageVersion>
1285 <wiki>xwiki</wiki>
1286 <space>Main</space>
1287 <pageName>WebHome</pageName>
1288 <pageAuthor>XWiki.superadmin</pageAuthor>
1289 <className>XWiki.EditModeClass</className>
1290 <number>0</number>
1291 <headline>edit</headline>
1292 <property name="defaultEditMode" type="String">
1293 <attribute name="name" value="defaultEditMode"/>
1294 <attribute name="prettyName" value="Default Edit Mode"/>
1295 <attribute name="unmodifiable" value="0"/>
1296 <attribute name="disabled" value="0"/>
1297 <attribute name="size" value="15"/>
1298 <attribute name="number" value="1"/>
1299 <value>edit</value>
1300 </property>
1301 </object>
1302 {{/code}}
1303
1304 === Example of a file for a ##property## ===
1305
1306 {{code language="xml"}}
1307 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
1308 <property xmlns="http://www.xwiki.org" name="defaultEditMode" type="String">
1309 <attribute name="name" value="defaultEditMode"/>
1310 <attribute name="prettyName" value="Default Edit Mode"/>
1311 <attribute name="unmodifiable" value="0"/>
1312 <attribute name="disabled" value="0"/>
1313 <attribute name="size" value="15"/>
1314 <attribute name="number" value="1"/>
1315 <value>edit</value>
1316 </property>
1317 {{/code}}
1318
1319 = Examples =
1320
1321 == Getting the list of users ==
1322
1323 Since Users are stored as Objects, you can do a search of the type ##XWiki.XWikiUsers##. For example:
1324
1325 {{code}}
1326 http://<server>/xwiki/rest/wikis/query?q=object:XWiki.XWikiUsers
1327 {{/code}}
1328
1329 == Getting the list of users using XWQL ==
1330
1331 Using the parameter "className" the result includes the data for the first object of the ##XWiki.XWikiUsers##:
1332
1333 {{code}}
1334 http://<server>/xwiki/rest/wikis/xwiki/query?q=,doc.object(XWiki.XWikiUsers) as obj&type=xwql&className=XWiki.XWikiUsers
1335 {{/code}}

Get Connected