Changes

Jump to navigation Jump to search
534 bytes added ,  10:29, 3 August 2022
m
Text replacement - "8984" to "8080"
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.
=Usage=
By default, REST services are available at {{Code|http://localhost:89848080/rest/}}. If no default credentials are specified in the URL or when starting the web application, they will be requested by the client ([[Web Application#User Management|see further]]).
A web browser can be used to perform simple GET-based REST requests and display the response. Some alternatives for using REST are listed in the [[#Usage Examples|Usage Examples]].
 
With {{Announce|BaseX 10}}, results in the {{Code|rest}} namespace will be returned unprefixed:
 
<syntaxhighlight lang="xml">
<!-- before -->
<rest:databases xmlns:rest="http://basex.org/rest"/>
 
<!-- before -->
<databases xmlns="http://basex.org/rest"/>
</syntaxhighlight>
=URL Architecture=
 
A request to the root URL returns all available databases:
The root URL lists all available databases. The following examples assume thatyou have created a database instance from the [:<code>http://files.basex.orglocalhost:8080/xmlrest</factbook.xml factbook.xml] document:code>
:<code>http://localhost:8984/rest</code> <pre classsyntaxhighlight lang="brush:xml"> <rest:databases resources="1" xmlns:rest="http://basex.org/rest"> <rest:database resources="125742" size="181359943813599">factbookarticles</rest:database> ...</rest:databases></presyntaxhighlight>  The resources of a database (directories, resource metadata) are listed if a database and an optional directory path is specified:
The resources of a database can be listed by specifying the database, and potential sub directories, in the URL.In the given example, a single XML document is stored in the ''factbook'' database:<code>http://localhost:8080/rest/articles</code>
:<codesyntaxhighlight lang="xml"><database name="articles" xmlns="http://localhost:8984basex.org/rest"> <dir>binaries</factbookdir> <resource type="xml" content-type="application/xml" size="77192">1973-02-08-xltp325.xml</resource> ...</database></codesyntaxhighlight>
<pre class="brush:xml"> <rest:database name="factbook" The {{Code|dir}} elements were introduced with {{Announce|Version 10}}. Before, information on all resources="1" xmlns:rest="http://basex.org/rest"> <rest:resource type="xml" content-type="application/xml" size="77192">factbookwas listed that were located in the specified path or any of its subdirectories.xml</rest:resource></rest:database></pre> The contents of a database can be retrieved by directly addressing the resource:
If the path to a single resource is specified, the resource itself will be returned:<code>http://localhost:8984/rest/factbook/factbook.xml</code>
If a resource is not found, an HTTP response will be generated with :<code>404http://localhost:8080/rest/articles/1973-02-08-xltp325.xml</code> as status code.
==Parameters==
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. 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:89848080/rest/factbook/tmp</code> * Returns the number of documents in a database:<br/><code>http://localhost:8080/rest/database?query=count(.)</code>
* Serializes a document as JSONML:<br/><code>http://localhost:89848080/rest/factbook/factbook.xml?method=json&json=format=jsonml</code>
* <code>US-ASCII</code> is chosen as output encoding, and the query <code>eval.xq</code> is evaluated:<br/><code>http://localhost:89848080/rest?run=eval.xq&encoding=US-ASCII</code>
* The next URL lists all database users that are known to BaseX:<br/><code>http://localhost:89848080/rest?command=show+users</code>
==POST Method==
The name of the root element determines how the body will be evaluated:
* {{Code|commands}} (new since {{Version|9.0}}): 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
With {{Version|9.0}}, The root element may be bound to the optional REST namespace of the root element has become optional.This means, for example, that existing Existing command scripts can be sent to the server without any modifications:
* Create an empty database and return database information:
<pre classsyntaxhighlight lang="brush:xml">
<commands>
<create-db name='db'/>
<info-db/>
</commands>
</presyntaxhighlight>
For the other commands, the following child elements are supported:
* 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>
* Return string lengths of all text nodes that are found in the node that has been specified as initial context node:
<pre classsyntaxhighlight lang="brush:xml">
<query>
<text>for $i in .//text() return string-length($i)</text>
</context>
</query>
</presyntaxhighlight>
* Return the registered database users encoded in <code>ISO-8859-1</code>:
<pre classsyntaxhighlight lang="brush:xml">
<command>
<text>show users</text>
<parameter name='encoding' value='ISO-8859-1'/>
</command>
</presyntaxhighlight>
* Create a new database from the specified input and preserve all whitespaces:
<pre classsyntaxhighlight lang="brush:xml">
<command>
<text>create db test http://files.basex.org/xml/xmark.xml</text>
<option name='chop' value='false'/>
</command>
</presyntaxhighlight>
* Bind value to the {{Code|$person}} variable and run query <code>find-person.xq</code>, which must be located in the directory specified by <code>[[Options#WEBPATH{{Option|WEBPATH]]</code>}}:<pre classsyntaxhighlight lang="brush:xml">
<run>
<variable name='person' value='Johannes Müller'/>
<text>find-person.xq</text>
</run>
</presyntaxhighlight>
==PUT Method==
; Examples
* A new database with the name <b>XMark</b> is created. If XML input is sent in the HTTP body, the resulting database resource will be called <b>XMark.xml</b>:<br/><code><nowiki>http://localhost:89848080/rest/XMark</nowiki></code>* A new database is created, and no whitespaces will be removed from the passed on XML input:<br/><code><nowiki>http://localhost:89848080/rest/XMark?chop=false</nowiki></code>* The contents of the HTTP body will be taken as input for the document <b>one.xml</b>, which will be stored in the <b>XMark</b> database:<br/><code><nowiki>http://localhost:89848080/rest/XMark/one.xml</nowiki></code>
An HTTP response with status code <code>201</code> (CREATED)
; Example
* The <b>factbook</b> database is deleted:<br/><code><nowiki>http://localhost:89848080/rest/factbook</nowiki></code>* All resources of the <b>XMark</b> database are deleted that reside in the <b>tmp</b> path:<br/><code><nowiki>http://localhost:89848080/rest/XMark/tmp/</nowiki></code>
The HTTP status code <code>404</code> is returned if no database is specified.
; Example
* 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:89848080/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>).
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[
declare variable $x a as xs:integer external; declare variable $y b as xs:integer external;
<mult>{ $a * $b }</mult>
]]></text>
<variable name="b" value="2"/>
</query>
</presyntaxhighlight>
=Response=
The following three example requests all return <code>&lt;a/&gt;</code> with <code>application/xml</code> as content-type:
:<code>http://localhost:89848080/rest?query=%3Ca/%3E</code><br/><code>http://localhost:89848080/rest?query=%3Ca/%3E&method=xml</code><br/><code>http://localhost:89848080/rest?query=%3Ca/%3E&media-type=application/xml</code>
=Usage Examples=
<code>org.basex.util.Base64</code> can be used for that purpose:
<pre classsyntaxhighlight lang="brush:java">
import java.net.*;
import org.basex.util.*;
public static void main(String[] args) throws Exception {
// The java URL connection to the resource.
URL url = new URL("http://localhost:89848080/rest/factbook");
// Establish the connection to the URL.
String user = "bob";
String pw ="alice";
// Encode user name username and password pair with a base64 implementation.
String encoded = Base64.encode(user + ":" + pw);
// Basic access authentication header to connection request.
}
}
</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):
;GET
* <code><nowiki>curl -i "http://localhost:89848080/rest/factbook?query=//city/name"</nowiki></code>
;POST
* <code><nowiki>curl -i -X POST -H "Content-Type: application/xml" -d "&lt;query xmlns='http://basex.org/rest'&gt;&lt;text&gt;//city/name&lt;/text&gt;&lt;/query&gt;" "http://localhost:89848080/rest/factbook"</nowiki></code>* <code><nowiki>curl -i -X POST -H "Content-Type: application/xml" -T query.xml "http://localhost:89848080/rest/factbook"</nowiki></code>
;PUT
* <code><nowiki>curl -i -X PUT -T "etc/xml/factbook.xml" "http://localhost:89848080/rest/factbook"</nowiki></code>* <code><nowiki>curl -i -X PUT -H "Content-Type: application/json" -T "plain.json" "http://localhost:89848080/rest/plain"</nowiki></code>
;DELETE
* <code><nowiki>curl -i -X DELETE "http://admin:admin@localhost:89848080/rest/factbook"</nowiki></code>
=Changelog=
 
;Version 10.0
* Updated: Results in the {{Code|rest}} namespace will be returned unprefixed.
* Updated: {{Code|dir}} elements are returned when listing the contents of a database.
;Version 9.0
;Version 8.1
* Added: Support for input-specific content-type parameters
* Updated: The [[#GET Method|run operation]] now resolves file paths against the [[Options#RESTPATH{{Option|RESTPATH]] }} option.
;Version 8.0
Bureaucrats, editor, reviewer, Administrators
13,550

edits

Navigation menu