Changes

Jump to navigation Jump to search
1,444 bytes added ,  13:20, 2 July 2020
BaseX offers a RESTful API for accessing database resources via URLs.
REST ([httphttps://en.wikipedia.org/wiki/Representational_State_Transfer REpresentational State Transfer])
facilitates a simple and fast access to databases through HTTP. The HTTP methods
GET, PUT, DELETE, and POST can be used to interact with the database.
The root URL lists all available databases. The following examples assume that
you have created a database instance from the [httphttps://files.basex.org/xml/factbook.xml factbook.xml] document:
:<code>http://localhost:8984/rest</code>
<pre classsyntaxhighlight lang="brush:xml">
<rest:databases resources="1" xmlns:rest="http://basex.org/rest">
<rest:database resources="1" size="1813599">factbook</rest:database>
</rest:databases>
</presyntaxhighlight>
The resources of a database can be listed by specifying the database, and potential sub directories, in the URL.
:<code>http://localhost:8984/rest/factbook</code>
<pre classsyntaxhighlight lang="brush:xml">
<rest:database name="factbook" resources="1" xmlns:rest="http://basex.org/rest">
<rest:resource type="xml" content-type="application/xml" size="77192">factbook.xml</rest:resource>
</rest:database>
</presyntaxhighlight>
The contents of a database can be retrieved by directly addressing the resource:
While '''Options''' can be specified for all operations, the remaining parameters will only make sense for '''Query''' and '''Run'''.
=Request Methods=
==GET RequestsMethod==
If the GET method is used, all query parameters are directly specified within the URL.
Additionally, the following '''operations''' can be specified:
* {{Code|query}}: Evaluate an XQuery expression. If a database or database path is specified in the URL, it is used set as initial query context.
* {{Code|command}}: Execute a single [[Commands|database command]].
* {{Code|run}}: Evaluate an XQuery file or command script located on the server. Since {{Version 8.1}}, the The file path is resolved against the directory specified by <code>[[Options#WEBPATH{{Option|RESTPATH]]</code> }} (before, it was resolved against <code>[[Options#WEBPATH{{Option|WEBPATH]]</code>}}). Similar to {{Code|query}}, a database or database path is set as context.
; Examples
* Lists all resources found in the '''tmp''' path of the ''factbook'' database:<br/><code>http://localhost:8984/rest/factbook/tmp</code>
 
* Returns the number of documents in a database:<br/><code>http://localhost:8984/rest/database?query=count(.)</code>
* Serializes a document as JSONML:<br/><code>http://localhost:8984/rest/factbook/factbook.xml?method=json&json=format=jsonml</code>
* The next URL lists all database users that are known to BaseX:<br/><code>http://localhost:8984/rest?command=show+users</code>
==POST RequestsMethod== The body of a POST request is interpreted as XML fragment, which specifies the operation to perform.The name of the root element determines how the body will be evaluated: * {{Code|commands}}: Run [[Commands#Command Scripts|Command Script]]* {{Code|query}}: Execute XQuery expression* {{Code|run}}: Run server-side file (query or command script)* {{Code|command}}: Execute single command
The body of a POST request is interpreted as XML fragmentroot element may be bound to the optional REST namespace. Existing command scripts can be sent to the server without any modifications: * Create an empty database and return database information: <syntaxhighlight lang="xml"><commands> <create-db name='db'/> <info-db/></commands></syntaxhighlight> For the other commands, which specifies thefollowing child elements are supported: {| class="wikitable"|-! Name! Description|-operation | {{Code|text}}| Required; contains the query string, command string, or file to perform. The body must conform to a given [[REST: POST Schemabe run|-| {{Code|parameter}}| Serialization parameter (with {{Code|@name}} and {{Code|@value}} attributes)|-| {{Code|option}}| Database option (with {{Code|@name}} and {{Code|@value}} attributes)|-| {{Code|variable}}| Variable bindings|-| {{Code|context}}| Initial context item|XML Schema]].}
; Examples
* The following query returns Return the first five city names of the <b>factbook</b> database: <pre classsyntaxhighlight lang="brush:xml"><rest:query xmlns:rest="http://basex.org/rest"> <rest:text><![CDATA[ (//city/name)[position() <= 5] ]]></rest:text></rest:query></presyntaxhighlight>
* The second query returns the Return string lengths of all text nodes, which that are found in the node that has been specified as initial context node:<pre classsyntaxhighlight lang="brush:xml"><rest:query xmlns:rest="http://basex.org/rest"> <rest:text>for $i in .//text() return string-length($i)</rest:text> <rest:context>
<xml>
<text>Hello</text>
<text>World</text>
</xml>
</rest:context></rest:query></presyntaxhighlight>
* The following request returns Return the registered database users encoded in <code>ISO-8859-1</code>:<pre classsyntaxhighlight lang="brush:xml"><command xmlns="http://basex.org/rest">
<text>show users</text>
<parameter name='encoding' value='ISO-8859-1'/>
</command>
</presyntaxhighlight>
* This example creates Create a new database from the specified input and retains preserve all whitespaces:<pre classsyntaxhighlight lang="brush:xml"><command xmlns="http://basex.org/rest">
<text>create db test http://files.basex.org/xml/xmark.xml</text>
<option name='chop' value='false'/>
</command>
</presyntaxhighlight>
* The last request runs a Bind value to the {{Code|$person}} variable and run query <code>queryfind-person.xq</code> , which must be located in the directory specified by <code>[[Options#WEBPATH{{Option|WEBPATH]]</code>}}:<pre classsyntaxhighlight lang="brush:xml"><run xmlns> <variable name="http://basex.org'person' value='Johannes Müller'/rest"> <text>queryfind-person.xq</text>
</run>
</presyntaxhighlight>
==PUT RequestsMethod==
The PUT method is used to create new databases, or to add or update existing database resources:
There are two ways to store non-XML data in BaseX:
* '''Store as rawRaw Data''':<br/> If <code>application/octet-stream</code> is chosen as content-type, the input data is added as raw[[Binary Data]].
* '''Convert to XML''':<br/> Incoming data is converted to XML if a parser is available for the specified content-type. The following content types are supported:
** <code>application/json</code>: Stores JSON as XML.
** <code>text/html</code>: Stores HTML input as XML.
Since {{Version|8.1}}, conversion Conversion can be influenced by specifying additional content-type parameters (see [[RESTXQ#Content Types|RESTXQ]] for more information).
If raw data is added and if no content type, or a wrong content, is specified, a <code>400</code> (BAD REQUEST) error will be raised.
Have a look at the [[REST#Usage Examples|usage examples]] for more detailed examples using Java and shell tools like cURL.
==DELETE RequestsMethod==
The DELETE method is used to delete databases or resources within a database.
=Assigning Variables=
==GET RequestsMethod==
All query parameters that have not been processed before will be treated as variable assignments:
* The following request assigns two variables to a server-side query file <code>mult.xq</code> placed in the HTTP directory:<br/><code>http://localhost:8984/rest?run=mult.xq&$a=21&$b=2</code>
<pre classsyntaxhighlight lang="brush:xquery">
(: XQuery file: mult.xq :)
declare variable $a as xs:integer external;
declare variable $b as xs:integer external;
<mult>{ $a * $b }</mult>
</presyntaxhighlight>
The dollar sign can be omitted as long as the variable name does not equal a parameter keyword (e.g.: <code>method</code>).
==POST RequestsMethod==
If <code>query</code> or <code>run</code> is used as operation, external variables can be specified via the <code><variable/></code> element:
<pre classsyntaxhighlight lang="brush:xml">
<query xmlns="http://basex.org/rest">
<text><![CDATA[
<variable name="b" value="2"/>
</query>
</presyntaxhighlight=Response=
==Content Type==
As the content type of a REST response cannot necessarily be dynamically determined in all cases, it can be enforced by the user. The final content type of a REST response is chosen in several stepsas follows:
# By default, If the content type of a response depends on the chosen operation:#* '''Query'''/'''Run''' → serialization parameter <code>application/xml</code>#* '''Command''' → <code>text/plain</code>#* '''Get''' → <code>application/xml[[Serialization|media-type]]</code>is supplied, or it will be adopted as content -type of the addressed resource.# The default content type is overwritten Otherwise, if a the serialization parameter <code>[[Serialization|serialization method]] </code> is specifiedsupplied, either as [[#Parameters|query parameter]] or within the XQuery expression. The following method/content-type mappings are availablewill be chosen according to the following mapping:#* <code>xml</code>, <code>adaptive</code>, <code>basex</code> → <code>application/xml</code>
#* <code>xhtml</code> → <code>text/html</code>
#* <code>html</code> → <code>text/html</code>
#* <code>text</code> → <code>text/plain</code>
#* <code>raw</code> → <code>application/octet-stream</code>
#* <code>json</code> → <code>application/json</code>
# The If no media-type or serialization method is supplied, the content type is overwritten in any case if of a specific response depends on the chosen REST operation:#* '''Query'''/'''Run''' → <code>application/xml</code>#* '''Command''' → <code>text/plain</code>#* '''Get''' → <code>application/xml</code>, or content type of the addressed resource Serialization parameters can either be supplied as [[Serialization#Parameters|media-typequery parameters]] is chosen, again as query parameter or within the query.
The following three example requests all return <code>&lt;a/&gt;</code> with <code>application/xml</code> as content-type:
<code>org.basex.util.Base64</code> can be used for that purpose:
<pre classsyntaxhighlight lang="brush:java">
import java.net.*;
import org.basex.util.*;
}
}
</presyntaxhighlight>
===Content-Types===
the connection (in this example we explicitly store the input file as raw):
<pre classsyntaxhighlight lang="brush:java">
// store input as raw
conn.setRequestProperty("Content-Type", "application/octet-stream");
</presyntaxhighlight>
See the [[REST#PUT Requests|PUT Requests]] section for a description of the possible content-types.
==Command Line==
Tools such as the Linux commands [httphttps://www.gnu.org/s/wget/ Wget] or [http://curl.haxx.se/ cURL] exist to
perform HTTP requests (try copy &amp; paste):
=Changelog=
 
;Version 9.0
* Added: Support for command scripts in the [[#POST Method|POST Method]].
* Updated: The REST namespace in the [[#POST Method|POST Method]] has become optional.
;Version 8.1
* Added: support Support for input-specific content-type parameters* Updated: The [[#GET Method|run operation]] now resolves file paths against the {{Option|RESTPATH}} option.
;Version 8.0
;Version 7.9
* Updated: Also evaluate command scripts via the <code>[[#GET RequestsMethod|run]]</code> operation.
;Version 7.2
* Removed: direct Direct evaluation of adresses resources with <code>application/xquery</code> as content type
;Version 7.1.1
;Version 7.0
* REST API introduced, replacing the old JAX-RX API
 
[[Category:Server]]
[[Category:HTTP]]
[[Category:Developer]]
Bureaucrats, editor, reviewer, Administrators
13,550

edits

Navigation menu