Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
CSS Stylesheet
h3 { background-color: #eee; padding: 0.6em; }
#content .code { margin-left: 2.5em!important; background-color: #fafafa!important; }
.pdl .syntaxhighlighter table td.code .container, .syntaxhighlighter .line.alt2, .syntaxhighlighter .line.alt1 { background-color: #fafafa!important; }

Table of Contents

Expand

Table of Contents

Overview

Introduction

Excerpt
The Fedora 4 HTTP API is generally a RESTful API. HTTP methods like GET, PUT, POST and DELETE are implemented on most resource paths. The API also relies heavily on content negotiation to deliver context-appropriate responses, and a HATEOAS-driven text/html response (providing a decent GUI experience on top of the repository).

...

The Fedora 4 RDF-based responses may be serialized as:

  • application/n3 (or text/rdf+n3 or text/n3)application/n-quadsld+json
  • application/n-triples
  • application/rdf+jsonapplicationxml
  • text/n3 (or text/rdf+xmln3)
  • text/trigplain
  • text/turtle (or application/x-turtle)

The text/html response also includes embedded RDFa markup.

The API is based loosely around the Fedora 4 implements the Linked Data Platform 1.0 Architecture, which:

[...] describes the use of HTTP for accessing, updating, creating and deleting resources from servers that expose their resources as Linked Data.  It provides clarifications and extensions of the rules of Linked Data [LINKED-DATA]:

  1. Use URIs as names for things
  2. Use HTTP URIs so that people can look up those names
  3. When someone looks up a URI, provide useful information, using the standards (RDF*, SPARQL)
  4. Include links to other URIs, so that they can discover more things

Changes planned

  • Asynchronous API support

Endpoints

Resources

Repository objects can be loosely divided into two classes of resources:

 - Object and containers Containers ("fedora:objectContainer"), containing RDF properties and 0 or more child nodesresources
 - Binaries, containing any binary payload (roughly corresponding to Fedora 3 datastreams)

Objects

Request URI: /path/to/some/resource

Methods: GET, POST, PUT, PATCH, DELETE, MOVE, COPY

 

 

Status
titleGET
  Retrieve all triples for the resource

Query Parameters:

Status
subtletrue
titlenon-member-properties
 By default, we include triples for all member resources, in addition to triples about the given node. Setting this to true will exclude member resources from the result.

Status
subtletrue
titleoffset
 Pagination control for member resources

Status
subtletrue
titleLIMIT
 Pagination control for member resources

 

Request Headers:

Status
subtletrue
titleAccept
  text/turtle, text/rdf+n3, application/n3, text/n3, application/rdf+xml, application/json+rdf, application/n-triples, text/html

Status
subtletrue
titleIf-None-Match

...

Example (1):

Code Block
curl -H "Accept: text/turtle" "http://localhost:8080/rest/"

Response:

Code Block
Status: 200 OK
 
Headers:
Content-Type: text/turtle
Cache-Control: 
Last-Modified-At: 2013-01-01T01:23:45Z
Link: http://localhost:8080/rest/?offset=0&limit=10;rel="first"
Link: http://www.w3.org/ns/ldp/Resource;rel="type"
Accept-Patch: application/sparql-update
 
Body:

<http://localhost:8080/rest/>
        a       <http://www.w3.org/ns/ldp#Container> , <http://www.w3.org/ns/ldp#Page> ;
        <http://www.w3.org/ns/ldp#membersInlined>
                "true" ;
        <http://www.w3.org/ns/ldp#membershipObject>
                <http://www.w3.org/ns/ldp#MemberSubject> ;
        <http://www.w3.org/ns/ldp#membershipPredicate>
                <http://fedora.info/definitions/v4/repository#hasChild> ;
        <http://www.w3.org/ns/ldp#membershipSubject>
                <http://localhost:8080/rest/> ;
        <http://www.w3.org/ns/ldp#pageOf>
                <http://localhost:8080/rest/> ;
		<http://fedora.info/definitions/v4/rest-api#exportsAs>
                <http://localhost:8080/rest//fcr:export?format=jcr/xml> ;
        <http://fedora.info/definitions/v4/rest-api#hasNamespaces>
                <http://localhost:8080/rest/fcr:namespaces> ;
        <http://fedora.info/definitions/v4/rest-api#hasTransactionProvider>
                <http://localhost:8080/rest/fcr:tx> ;
        <http://fedora.info/definitions/v4/rest-api#hasWorkspaces>
                <http://localhost:8080/rest/fcr:workspaces> ;
        <http://microformats.org/wiki/rel-sitemap>
                <http://localhost:8080/rest/sitemap> ;

Example (2):

Code Block
curl -H "Accept: text/turtle" "http://localhost:8080/rest/path/to/resource"

Response:

Code Block
Status: 200 OK
 
Headers:
ETag: "d98e86c48a3e31857f5311f51ad7a2e13a7cedee"
Content-Type: text/turtle
Cache-Control: must-revalidate
Last-Modified: Fri, 15 Nov 2013 23:31:07 +0000
Link: http://localhost:8080/rest/path/to/resource/?offset=0&limit=10;rel="first"
Link: http://www.w3.org/ns/ldp/Resource;rel="type"
Accept-Patch: application/sparql-update
 
Body:

<http://localhost:8080/rest/path/to/resource>
		a       <http://fedora.info/definitions/v4/rest-api#resource> , <http://fedora.info/definitions/v4/rest-api#object> , 		
				<http://www.w3.org/ns/ldp#Container> , <http://www.w3.org/ns/ldp#Page> ;
        <http://fedora.info/definitions/v4/repository#uuid>
                "e8baa85c-f05a-49e8-9578-9adef92ac60d"^^<http://www.w3.org/2001/XMLSchema#string> ;
        <http://www.w3.org/ns/ldp#inlinedResource>
                <http://localhost:8080/rest/path/to> ;
        <http://www.w3.org/ns/ldp#membersInlined>
                "true" ;
        <http://www.w3.org/ns/ldp#pageOf>
                <http://localhost:8080/rest/path/to/resource> .
        <http://fedora.info/definitions/v4/rest-api#exportsAs>
                <http://localhost:8080/rest/path/to/resource/fcr:export?format=jcr/xml> ;
        <http://fedora.info/definitions/v4/rest-api#hasVersions>
                <http://localhost:8080/rest/path/to/resource/fcr:versions> ;
        <http://fedora.info/definitions/v4/repository#created>
                "2013-11-15T23:31:07.275Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> ;
        <http://fedora.info/definitions/v4/repository#createdBy>
                "bypassAdmin"^^<http://www.w3.org/2001/XMLSchema#string> ;
        <http://fedora.info/definitions/v4/repository#hasParent>
                <http://localhost:8080/rest/path/to> ;
        <http://fedora.info/definitions/v4/repository#lastModified>
                "2013-11-15T23:31:07.268Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> ;

Status:

Status
subtletrue
colourGreen
title200
 OK

Status
subtletrue
colourYellow
title304
 Not Modified

Status
subtletrue
colourRed
title404
 Not Found

 

...

Create a new node at the given path, and recursively create any missing parent elements.

Query Parameters:

...

Example (1):

Code Block
curl -X POST "http://localhost:8080/rest/some/path/to/a/new/resource"

Response:

Code Block
Status: 201 Created
 
Headers:
Location: http://localhost:8080/rest/path/to/a/new/resource

Example (2):

Code Block
curl -X POST "http://localhost:8080/rest/some/path/to/a/new/resource?mixin=fedora:datastream" # Create a fedora:datastream

Status:

Status
subtletrue
colourGreen
title201
 Created

 

...

If the given resource path exists, a POST to that path will create a new node as a child of the given resource using a generated identifier.

Request Headers:

Status
subtletrue
titleSlug
  Use the slug header when creating the new resource (see AtomPub slug header). If no slug is provided, the identifier will be automatically generated.

Note

The slug you provide does not guarantee the location of the created node. Clients must check the Location header for the path to the created resource. For full control over the generated path, see POST Create a new node at the given path (link me!)

Query Parameters:

...

Example (1):

Code Block
curl -X POST "http://localhost:8080/rest/this/node/already/exists"

Response:

Code Block
Status: 201 Created
 
Headers:
Location: http://localhost:8080/rest/this/node/already/exists/some/generated/identifier

Example (2):

Code Block
curl -X POST -H "Slug: new-node-name" "http://localhost:8080/rest/this/node/already/exists"

Response:

Code Block
Status: 201 Created
 
Headers:
Location: http://localhost:8080/rest/this/node/already/exists/new/node/name

Status:

Status
subtletrue
colourGreen
title201
 Created

 

 

...

In addition to creating a new node, add the given properties to the object

Note

An RDF payload can be combined with any of the above forms.

Note

RDF will be interpreted using the current resource as the base URI (e.g. <> will be expanded to the current URI)

Query Parameters:

...

 

Example:

Code Block
curl -X POST -H "Content-Type: text/turtle" "http://localhost:8080/rest/node/to/create" -d "@body.rdf"
 
Request Body:
<> dc:title "some-resource-title"
 

Response:

Code Block
Status: 201 Created
 
Headers:
Location: http://localhost:8080/rest/node/to/create

 

Status:

Status
subtletrue
colourGreen
title201
 Created

 

 

...

In addition to creating a new node, execute a SPARQL-Update query against the newly created node. 

Query Parameters:

...

Note

RDF will be interpreted using the current resource as the base URI (e.g. <> will be expanded to the current URI)

 

Example:

Code Block
curl -X POST -H "Content-Type: application/sparql-update" "http://localhost:8080/rest/node/to/create" -d "@body.rdf"
 
Request Body:
 
INSERT {   
  <> dc:title "some-resource-title" .
}
WHERE { }
 

Response:

Code Block
Status: 201 Created
 
Headers:
Location: http://localhost:8080/rest/node/to/create

 

Status:

Status
subtletrue
colourGreen
title201
 Created

 

...

Note

If the binary content is RDF or a SPARQL-Update query, see Binary Content for an alternative way to create content

Query Parameters:

...

 

Header Parameters:

...

 

Example (1):

Code Block
curl -X POST "http://localhost:8080/rest/binary/resource/to/create" -d "@picture.jpg"

Response:

Code Block
Status: 201 Created
 
Headers:
Location: http://localhost:8080/rest/binary/resource/to/create/fcr:content

Example (2):

Code Block
curl -X POST "http://localhost:8080/rest/binary/resource/to/create?checksum=urn:sha1:cb1a576f22e8e3e110611b616e3e2f5ce9bdb941" -d "@picture.jpg"

Response:

Code Block
Status: 201 Created
 
Headers:
Location: http://localhost:8080/rest/binary/resource/to/create/fcr:content

Example (3):

Code Block
curl -X POST "http://localhost:8080/rest/binary/resource/to/create?checksum=urn:sha1:checksumdoesntmatch" -d "@picture.jpg"

Response:

Code Block
Status: 409 Conflict
 
Error:
Checksum Mismatch of cb1a576f22e8e3e110611b616e3e2f5ce9bdb941 and urn:sha1:checksumdoesntmatch
Note

By convention, binary content is accessed using the REST endpoint path/to/resource/fcr:content.

Status:

Status
subtletrue
colourGreen
title201
 Created

...

 

 

Status
colourYellow
titlePUT
 Modify the triples associated with the resource

Replace the existing triples for a resource with the triples provided in the request body.

Note

Some resource properties are repository managed and cannot be removed or modified. Any attempt to do so may result in a 4xx error.

Note

RDF will be interpreted using the current resource as the base URI (e.g. <> will be expanded to the current URI)

 

Request Headers:

...

Query Parameters:

...

 

Example:

Code Block
curl -X POST -H "Content-Type: text/turtle" "http://localhost:8080/rest/node/to/update" -d "@new-triples.rdf"
 
Request Body:
 
<> dc:title "some-resource-title" .
 

Response:

Code Block
Status: 204 No Content

 

Status:

...

 

 

Status
colourGreen
titlePATCH
 with SPARQL-Update

Request Headers:

...

Example:

Code Block
curl -X PATCH -H "Content-Type: application/sparql-update" "http://localhost:8080/rest/node/to/update" -d "@body.rdf"
 
Request Body:
 
INSERT {   
  <> dc:title "some-resource-title" .
}
WHERE { }
 

Response:

Code Block
Status: 204 No Content

 

Status:

...

 

 

Status
colourRed
titleDELETE
Delete a resource

Example:

Code Block
curl -X DELETE "http://localhost:8080/rest/node/to/delete"

Response:

Code Block
Status: 204 No Content

 

Status:

...

 

 

Status
subtletrue
colourRed
titleMOVE
 Move a resource (and its subtree) to a new location

Example (1):

Code Block
curl -X MOVE -H "Destination: http://localhost:8080/rest/new/path/to/node" "http://localhost:8080/rest/path/to/node"

Response:

Code Block
Status: 201 Created
 
Headers:
Location: http://localhost:8080/rest/new/path/to/node

 

Example (2):

Code Block
curl -X MOVE -H "Destination: http://duraspace.org/some/path" "http://localhost:8080/rest/path/to/node"

Response:

Code Block
Status: 502 Bad Gateway

Status:

...

Status
subtletrue
colourRed
title409
 Source path doesn't exists

...

 

 

Status
subtletrue
colourBlue
titleCOPY
 Copy a resource (and its subtree) to a new location

Example:

Code Block
curl -X COPY -H "Destination: http://localhost:8080/rest/new/path/to/node" "http://localhost:8080/rest/path/to/node"

Response:

Code Block
Status: 201 Created
 
Headers:
Location: http://localhost:8080/rest/new/path/to/node

 

Status:

...

Status
subtletrue
colourRed
title409
 Source path doesn't exists

...

Binary Content

Request URI: /path/to/some/resource/fcr:content

Methods: GET, PUT, POST

 

 

Status
titleGET
 Retrieve binary content

 

Request Headers:

Status
subtletrue
titleIf-None-Match

...

Status
subtletrue
titleRange

Example (1):

Code Block
curl "http://localhost:8080/rest/path/to/some/resource/fcr:content"

Response:

Code Block
Status: 200 OK
 
Headers:
ETag: "urn:sha1:cb1a576f22e8e3e110611b616e3e2f5ce9bdb941"
Content-Type: image/jpeg
Content-Length: 123456
Cache-Control: no-transform, must-revalidate, max-age=0
Last-Modified-At: 2013-01-01T01:23:45Z
Link: http://localhost:8080/rest/path/to/some/resource;rel="meta"
Accept-Ranges: bytes
 
Body:
<binary content>

Example (2):

Code Block
curl -H "Range: bytes=1-5" "http://localhost:8080/rest/path/to/some/resource/fcr:content"

Response:

Code Block
Status: 206 Partial Content
 
Headers:
ETag: "urn:sha1:cb1a576f22e8e3e110611b616e3e2f5ce9bdb941"
Content-Type: image/jpeg
Content-Range: bytes 1-5/9106
Content-Length: 5
Cache-Control: 
Last-Modified-At: 2013-01-01T01:23:45Z
Link: http://localhost:8080/rest/path/to/some/resource;rel="meta"
Accept-Ranges: bytes
 
Body:
<binary content>

Status:

Status
subtletrue
colourGreen
title200
 OK

...

Status
subtletrue
colourYellow
title304
 Not Modified

Status
subtletrue
colourRed
title404
 Not Found

...

 

 

...

Request Headers:

...

Query Parameters:

...

Example (1):

Code Block
curl -X POST -d "@image.jpg" "http://localhost:8080/rest/path/to/new/resource/fcr:content" 
Body:
<binary content>

Response (1):

Code Block
Status: 201 Created
 
Headers:
Location: http://localhost:8080/rest/path/to/new/resource/fcr:content

Example (2):

Code Block
curl -X POST -d "@image.jpg" -H "Content-Disposition: inline; filename=\"image.jpg\"" "http://localhost:8080/rest/path/to/new/resource/fcr:content" 
Body:
<binary content>

Response (2):

Code Block
Status: 201 Created
 
Headers:
Location: http://localhost:8080/rest/path/to/new/resource/fcr:content

Status:

Status
subtletrue
colourGreen
title201
 Created

...

 

 

Status
colourYellow
titlePUT
 Replace existing binary content

Request Headers:

...

Query Parameters:

...

Example:

Code Block
curl -X POST -d "@image.jpg" "http://localhost:8080/rest/path/to/some/existing/resource/fcr:content" 
Body:
<binary content>

Response:

Code Block
Status: 204 No Content

Status:

Status
subtletrue
colourGreen
title201
 You can also PUT to a new location and Fedora will create the appropriate nodes

...

 

Batch Operations

Request URI: /path/to/some/resource/fcr:batch

Methods: GET, POST, DELETE

 

Status
titleGET
 Retrieve multiple binary resources in a single request

Info

An HTTP method returning multipart/form-data is non-standard and a little unusual, but it seems to work well enough.

 

Query Parameters:

...

Example:

Code Block
curl "http://localhost:8080/rest/path/to/some/resource/fcr:batch?child=content&child=thumbnail"

Response:

Code Block
Status: 200 OK
 
Headers:
ETag: "686897696a7c876b7e"
Content-Type: multipart/form-data; boundary=AaB03x
Content-Length: 123456
Cache-Control: 
Last-Modified-At: 2013-01-01T01:23:45Z
 
Body:
--AaB03x
Content-Disposition: attachment; filename="content"
Content-Type: image/tiff
<binary content>
--AaB03x
Content-Disposition: attachment; filename="thumbnail"
Content-Type: image/jpeg
<binary content>

Status:

Status
subtletrue
colourGreen
title200
 

Status
subtletrue
colourRed
title404
 If the parent resource doesn't exist, we return a 404. (TODO: What if an explicitly provided dsid doesn't exist? Is this a 404 too?)

 

 

...

 

This endpoint supports two different content types, multipart/mixed (preferred) or multipart/form-data (see below).

Request Headers:

...

 

In multipart/mixed mode, the content-disposition of each part will determine the behavior of that part. The object-to-be-manipulated is given in the name of the part. The supported content-dispositions are:

  • inline; creates or modifies an object's properties (either by replacing the properties with the supplied RDF, or by executing a SPARQL-Update query)
  • attachment; creates and replaces the binary content of an object
  • delete; deletes an object

Example:

Code Block
# creates (or replaces) three datastreams:
# http://localhost:8080/rest/path/to/some/resource/a
# http://localhost:8080/rest/path/to/some/resource/b
# http://localhost:8080/rest/path/to/some/resource/c
curl -X POST -H "Content-Type: multipart/mixed; boundary=----" -d @multipart_request "http://localhost:8080/rest/path/to/some/resource/fcr:batch"
Code Block
# content of multipart_request
----
Content-Disposition: attachment; name="a"; filename="img002.jpg"
Content-Type: image/jpeg
<binary content here>
----
Content-Disposition: attachment; name="b"; filename="img003.jpg"
Content-Type: image/jpeg
<binary content here>
----
Content-Disposition: attachment; name="c"; filename="img002.jpg"
Content-Type: image/jpeg
<binary content here>
----

 

Example:

Code Block
# Creates or modifies properties of two objects:
# http://localhost:8080/rest/path/to/some/resource
# http://localhost:8080/rest/path/to/some/resource/a
curl -X POST -H "Content-Type: multipart/mixed; boundary=----" -d @multipart_request "http://localhost:8080/rest/path/to/some/resource/fcr:batch"
Code Block
# content of multipart_request
----
Content-Disposition: inline; name="."
Content-Type: application/sparql-update

INSERT { <> dc:title "abc" } WHERE { }
----
Content-Disposition: inline; name="a"
Content-Type: application/rdf+xml

<> dc:title "xyz"
----

Response:

Code Block
Status: 201 Created

Status:

...

 

 

...

 

Request Headers:

...

For clients unable to produce multipart/mixed requests, a multipart/form-data endpoint is also provided. It uses heuristics to determine which action to apply:

  •  if the entity has a supplied filename, it will create a new datastream at the part's name
  •  if the content is RDF or SPARQL-Update (and doesn't have a filename set), add or update triples
  •  if the entity's name is "delete[]", the content of the body is a relative path to a resource to delete 
    • otherwise, it will create a new datastream at the part's name using the part's content.

 

Example:

Code Block
# creates the ds1 resource
curl -X POST  -F "ds1=@image.png" "http://localhost:8080/rest/path/to/some/resource/fcr:batch"
 
# execute the supplied SPARQL-Update query against the resource
curl -X POST  -F ".=@sparql_update_query;type=application/sparql-update" "http://localhost:8080/rest/path/to/some/resource/fcr:batch"
 
# delete the ds1 resource
curl -X POST  -F "delete[]=ds1" "http://localhost:8080/rest/path/to/some/resource/fcr:batch"
 
# or any combination of the above.

Response:

Code Block
Status: 201 Created

Status:

...

 

 

Status
colourRed
titleDELETE
Delete multiple resources in a single request

Query Parameters:

...

Example:

Code Block
# removes both old-content and backup-content resources
curl -X DELETE "http://localhost:8080/rest/path/to/some/resource/fcr:batch?child=old-content&child=backup-content"

Response:

Code Block
Status: 204 No Content

Status:

...

Export / Import

Request URI: /path/to/some/resource

Methods: GET, POST

Note

Objects are exported and imported relative to the request URI path given. E.g., if you run:

Code Block
curl http://localhost:8080/rest/path/to/resource/fcr:export > export.xml
curl -X POST -d @export.xml http://localhost:8080/rest/somewhere/else

The resource will be imported to http://localhost:8080/rest/somewhere/else/resource.

 

Status
titleGET
  fcr:export Retrieve serialized form of a resource and its subtree.

Request Headers:

...

Note

The available export formats for an object are available as properties of nodes, e.g. this node exports jcr/xml:

Code Block
<> <http://fedora.info/definitions/v4/rest-api#exportsAs> <./fcr:export?format=jcr/xml> ;

 

Example:

Code Block
curl "http://localhost:8080/rest/path/to/some/resource/fcr:export"

Response:

Code Block
Status: 200
 
Headers:
Content-Type: application/xml
Body:

<?xml version="1.0" encoding="UTF-8"?><sv:node xmlns:dc="http://purl.org/dc/terms/" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:ns001="http://purl.org/dc/elements/1.1/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:test="info:fedora/test/" xmlns:image="http://www.modeshape.org/images/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fedorarelsext="http://fedora.info/definitions/v4/rels-ext#" xmlns:mix="http://www....

Status:

Status
subtletrue
colourGreen
title200
 OK

Status
subtletrue
colourRed
title404
 Not Found

 

 

...

Request Headers:

...

Example:

Code Block
curl -X POST -d "@export.xml" "http://localhost:8080/rest/path/to/some/fcr:import?format=jcr/xml"
 
Body:
<?xml version="1.0" encoding="UTF-8"?><sv:node xmlns:dc="http://purl.org/dc/terms/" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:ns001="http://purl.org/dc/elements/1.1/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:test="info:fedora/test/" xmlns:image="http://www.modeshape.org/images/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fedorarelsext="http://fedora.info/definitions/v4/rels-ext#" xmlns:mix="http://www....

Response:

Code Block
Status: 201 Created
 
Headers:
Location: http://localhost:8080/rest/path/to/some/resource/

Status:

...

Status
subtletrue
colourRed
title404
 Path not found

Versioning

Request URI: /path/to/some/resource/fcr:versions

Methods: GET, POST

 

Warning

Versioning is not fully implemented in Fedora 4 alpha

 

Status
titleGET
 Get a list of the available versions of an object

Status
titleGET
 Get a previous version of an object

...

Services

Backup and Restore

Request URI: /

Methods: GET, POST

 

...

Info

The backup will be stored in a temporary directory on the server. As yet, there is not a REST API method for retrieving the content of the backup.

 

Example:

Code Block
curl -X POST "http://localhost:8080/rest/fcr:backup"

 

Response:

Code Block
Status: 200 OK

Body:
/tmp/fcrepo4-data/path/to/backup/directory

 

Status:

Status
subtletrue
colourGreen
title200
 OK

 

   

...

Info

Does this overwrite existing data? Merge data with the backup?

 

Example:  

Code Block
curl -X POST -d "@backup.xml" "http://localhost:8080/rest/fcr:restore"
 
Body:
<binary content>

 

Response:

Code Block
Status: 204 No Content

 

Status:

...

Identifiers 

Request URI: /path/to/some/resource/fcr:identifier

Methods: GET, POST

 

...

Request Headers:

Status
subtletrue
titleAccept
  text/turtle, text/rdf+n3, application/n3, text/n3, application/rdf+xml, application/json+rdf, application/n-triples, text/html

Query Parameters:

...

Example (1):

Code Block
curl -X POST "http://localhost:8080/rest/fcr:identifier"

Response:

Code Block
Status: 200 OK
 
Headers:
Content-Type: text/turtle
 
Body:
 
<http://localhost:8080/rest/fcr:identifier> <http://fedora.info/definitions/v4/repository#hasMember> <<http://localhost:8080/rest/newly-minted-identifier>

Example (2):

Code Block
curl -X POST "http://localhost:8080/rest/fcr:identifier?count=3"

Response:

Code Block
Status: 200 OK
 
Headers:
Content-Type: text/turtle
 
Body:
 
<http://localhost:8080/rest/fcr:identifier> <http://fedora.info/definitions/v4/repository#hasMember> <http://localhost:8080/rest/newly-minted-identifier> , <http://localhost:8080/rest/another-newly-minted-identifier> , <http://localhost:8080/rest/yet-another-minted-identifier>

Example (3):

Code Block
curl -X POST "http://localhost:8080/rest/path/to/some/resource/fcr:identifier"

Response:

Code Block
Status: 200 OK
 
Headers:
Content-Type: text/turtle
 
Body:
 
<http://localhost:8080/rest/path/to/some/resource/fcr:identifier> <http://fedora.info/definitions/v4/repository#hasMember> <http://localhost:8080/rest/path/to/some/resource/newly-minted-identifier>

Status:

...

Transactions

Request URI: /fcr:tx; /path/to/transaction/fcr:tx

Methods: POST

 

Status
titleGET
 Get the current status of a transaction (TODO?)

...

Info

After retrieving a transaction resource, the client can execute any REST API method prefixed by the transaction location.

Warning

Transactions are automatically closed and rolled back after 3 minutes of inactivity. Transactions can be refreshed by POSTing to /rest/{tx:id}/fcr:tx

 

Example:

Code Block
curl -X POST "http://localhost:8080/rest/fcr:tx" 

Response:

Code Block
Status: 201 Created
 
Headers:
Location: http://localhost:8080/rest/tx:83e34464-144e-43d9-af13-b3464a1fb9b5
Expires: Sat, 16 Nov 2013 00:32:57 GMT

Usage:

Code Block
curl -X POST "http://localhost:8080/rest/tx:83e34464-144e-43d9-af13-b3464a1fb9b5/path/to/object/to/create"
curl -X DELETE "http://localhost:8080/rest/tx:83e34464-144e-43d9-af13-b3464a1fb9b5/path/to/resource/to/delete"
curl -X POST "http://localhost:8080/rest/tx:83e34464-144e-43d9-af13-b3464a1fb9b5/fcr:tx/fcr:commit

Status:

Status
subtletrue
colourGreen
title201
  Created

 

 

...

Containers

Excerpt Include
RESTful HTTP API - Containers
RESTful HTTP API - Containers
nopaneltrue

Export and Import

 

Excerpt Include
RESTful HTTP API - Export and Import
RESTful HTTP API - Export and Import
nopaneltrue

Versioning

 

Excerpt Include
RESTful HTTP API - Versioning
RESTful HTTP API - Versioning
nopaneltrue

Services

Access Roles

 

Excerpt Include
RESTful HTTP API - Access Roles
RESTful HTTP API - Access Roles
nopaneltrue

Backup and Restore

 

Excerpt Include
RESTful HTTP API - Backup and Restore
RESTful HTTP API - Backup and Restore
nopaneltrue

Fixity

 

Excerpt Include
RESTful HTTP API - Fixity
RESTful HTTP API - Fixity
nopaneltrue

Node Types

 

Excerpt Include
RESTful HTTP API - Node Types
RESTful HTTP API - Node Types
nopaneltrue

 

Transactions

 

Excerpt Include
RESTful HTTP API - Transactions
RESTful HTTP API - Transactions
nopaneltrue

Transform

 

Excerpt Include
RESTful HTTP API - Transform
RESTful HTTP API - Transform
nopaneltrue

Example:

Code Block
curl -X POST "http://localhost:8080/rest/tx:123456789/fcr:tx/fcr:commit" 

Response:

Code Block
Status: 204 No Content

Status:

...

 

 

...

Example:

Code Block
curl -X POST "http://localhost:8080/rest/tx:123456789/fcr:tx/fcr:rollback" 

Response:

Code Block
Status: 204 No Content

Status:

...

Fixity

Request URI: /path/to/some/resource/fcr:fixity

Methods: GET

Status
titleGET
 Get the fixity report for an object

Note

Checking fixity requires retrieving the content from the binary store and may take some time. In the event of fixity corruption, in some cases, this will be automatically repaired. See Self-healing storage (link me!)

 

Request Headers:

Status
subtletrue
titleAccept
  text/turtle, text/rdf+n3, application/n3, text/n3, application/rdf+xml, application/json+rdf, application/n-triples, text/html

 

Example:

Code Block
curl -H "Accept: text/turtle" "http://localhost:8080/rest/path/to/some/binary/resource/fcr:fixity"

Response:

Code Block
Status: 200 OK
 
Headers:
Content-Type: text/turtle
 
Body:

<http://localhost:8080/rest/path/to/some/binary/resource>
        a       <http://fedora.info/definitions/v4/rest-api#resource> , <http://fedora.info/definitions/v4/rest-api#datastream> ;
        <http://fedora.info/definitions/v4/repository#hasFixityResult>
                [ <http://fedora.info/definitions/v4/repository#computedChecksum>
                          <urn:sha1:5441456941dd8b3ee0832b991ee93ba0c0a558f7> ;
                  <http://fedora.info/definitions/v4/repository#computedSize>
                          "471019"^^<http://www.w3.org/2001/XMLSchema#long> ;
                  <http://fedora.info/definitions/v4/repository#hasLocation>                       </org.infinispan.loaders.file.FileCacheStore:FedoraRepositoryBinaryData:org.infinispan.loaders.file.FileCacheStore:/var/folders/v3/wl82s37145b6jydsh9y5n8l40000gp/T//fcrepo4-data/fcrepo.ispn.binary.CacheDirPath> ;
                  <http://fedora.info/definitions/v4/repository#isFixityResultOf>
                          <http://localhost:8080/rest/path/to/some/binary/resource> ;
                  <http://fedora.info/definitions/v4/repository#status>
                          "SUCCESS"
                ] .

Status:

Status
subtletrue
colourGreen
title200
  OK

Status
subtletrue
colourRed
title404
 Resource not found

Workspaces

Request URI: /fcr:workspaces/(workspace name)

Methods: POST, DELETE

...

Example:

Code Block
curl -X POST "http://localhost:8080/rest/fcr:workspaces/abc"  # create a new workspace called "abc"

Response:

Code Block
Status: 201 Created
 
Headers:
Location: http://localhost:8080/rest/workspace:abc

Usage:

After creating a workspace, you can execute other REST API methods by prefixing the workspace identifier to requests 

Code Block
curl -X POST "http://localhost:8080/rest/fcr:workspaces/abc"
curl -X POST "http://localhost:8080/rest/workspace:abc/path/to/some/new/resource

Status:

...

 

 

...

Example:

Code Block
curl -X DELETE "http://localhost:8080/rest/fcr:workspaces/abc"  # delete a new workspace called "abc"

Response:

Code Block
Status: 204 No Content

 

Status:

...

Content Modeling

Request URI: /fcr:nodetypes

Methods: GET, POST

Node types

Status
titleGET
  get a list of registered types (as RDFS triples)

Request Headers:

Status
subtletrue
titleAccept
  text/turtle, text/rdf+n3, application/n3, text/n3, application/rdf+xml, application/json+rdf, application/n-triples, text/html

Example:

Code Block
curl "http://localhost:8080/rest/fcr:nodetypes"

Response:

Code Block
Status: 200 OK
 
Headers:
Content-Type: text/turtle
Body:


<http://fedora.info/definitions/v4/rest-api#object>
        a       <http://www.w3.org/2000/01/rdf-schema#Class> ;
        <http://www.w3.org/2000/01/rdf-schema#label>
                "fedora:object" ;
        <http://www.w3.org/2000/01/rdf-schema#subClassOf>
                <http://fedora.info/definitions/v4/rest-api#resource> .


<http://fedora.info/definitions/v4/rest-api#resource>
        a       <http://www.w3.org/2000/01/rdf-schema#Class> ;
        <http://www.w3.org/2000/01/rdf-schema#label>
                "fedora:resource" ;
        <http://www.w3.org/2000/01/rdf-schema#subClassOf>
                <http://fedora.info/definitions/v4/rest-api#relations> , <http://www.jcp.org/jcr/mix/1.0created> , <http://www.jcp.org/jcr/mix/1.0lastModified> , <http://www.jcp.org/jcr/mix/1.0lockable> , <http://www.jcp.org/jcr/mix/1.0versionable> .

[...]

Status:

Status
subtletrue
colourGreen
title200
 OK

 

 

...

Warning

The request body format for updating nodetypes is JCR's CND syntax.  

Example:

Code Block
curl -X POST -H "Content-Type: text/cnd" -d "@cnd.txt" "http://localhost:8080/rest/fcr:nodetypes"
 
Body:
 
[fedora:custom_node_type] > fedora:resource mixin
    - fedora:thumbnail (string)
 

Response:

Code Block
Status: 204 No Content

Status:

...

Namespaces

Request URI: /fcr:namespaces

Methods: GET, POST

Status
titleGET
get a list of registered namespaces and default prefixes

Request Headers:

Status
subtletrue
titleAccept
  text/turtle, text/rdf+n3, application/n3, text/n3, application/rdf+xml, application/json+rdf, application/n-triples, text/html

Example:

Code Block
curl "http://localhost:8080/rest/fcr:namespaces"

Response:

Code Block
Status: 200 OK
 
Headers:
Content-Type: text/turtle

Body:

@prefix dc:    <http://purl.org/dc/terms/> .
@prefix nt:    <http://www.jcp.org/jcr/nt/1.0> .
@prefix fcrepo: <http://fedora.info/definitions/v4/repository#> .
dc:     a       <http://purl.org/vocommons/voaf#Vocabulary> ;
        <http://purl.org/vocab/vann/preferredNamespacePrefix>
                "dc" ;
        <http://purl.org/vocab/vann/preferredNamespaceUri>
                "http://purl.org/dc/terms/" .


fcrepo:  a      <http://purl.org/vocommons/voaf#Vocabulary> ;
        <http://purl.org/vocab/vann/preferredNamespacePrefix>
                "fcrepo" ;
        <http://purl.org/vocab/vann/preferredNamespaceUri>
                "http://www.jcp.org/jcr/1.0" .

nt:     a       <http://purl.org/vocommons/voaf#Vocabulary> ;
        <http://purl.org/vocab/vann/preferredNamespacePrefix>
                "nt" ;
        <http://purl.org/vocab/vann/preferredNamespaceUri>
                "http://www.jcp.org/jcr/nt/1.0" .
[....]

Status:

Status
subtletrue
colourGreen
title200
 Ok

 

 

...

Info

There are some restrictions on what can be modified. (TODO: what are the caveats?)

 

Example:

Code Block
curl -X POST -H "Content-Type: application/sparql-update" -d "@namespaces.rdf" "http://localhost:8080/rest/fcr:namespaces"
 
Body:
# Register the namespace 'info:some-namespace' with the prefix 'some'
INSERT { 
    <info:some-namespace> <http://purl.org/vocab/vann/preferredNamespacePrefix> "some" 
} WHERE { 
 
}

Response:

Code Block
Status: 204 No Content

Status:

...

Sitemaps

Request URI: /sitemap

Methods: GET, POST

Status
titleGET
get an XML Sitemap of content in the repository

Example (1):

Code Block
curl "http://localhost:8080/rest/sitemap"

Response:

Code Block
Status: 200 OK
 
Headers:
Content-Type: text/xml

Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><sitemap:sitemapindex xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"><sitemap:sitemap><sitemap:loc>http://localhost:8080/rest/sitemap/1</sitemap:loc><sitemap:lastmod>2013-11-15T16:51:38.132-08:00</sitemap:lastmod><sitemap:changefreq>monthly</sitemap:changefreq><sitemap:priority>0.8</sitemap:priority></sitemap:sitemap></sitemap:sitemapindex>

Example (2):

Code Block
curl "http://localhost:8080/rest/sitemap/1"

Response:

Code Block
Status: 200 OK
 
Headers:
Content-Type: text/xml

 
Body:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><sitemap:urlset xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"><sitemap:url><sitemap:loc>http://localhost:8080/rest/00/cf/42/b8/00cf42b8-3a11-4af0-8972-48be8d9db5cd</sitemap:loc><sitemap:lastmod>2013-11-15T16:52:32.418-08:00</sitemap:lastmod><sitemap:changefreq>monthly</sitemap:changefreq><sitemap:priority>0.8</sitemap:priority></sitemap:url></sitemap:urlset>

Status:

Status
subtletrue
colourGreen
title200
 OK

Properties text

Request URI: /fcr:search

Methods: GET

Status
titleGET
 HTML form for submitting SPARQL queries

Request Headers:

Status
subtletrue
titleAccept
 text/html

 

 

Status
titleGET
execute a fulltext search over indexed properties in the repository

Query Parameters:

...

Status
subtletrue
titleoffset
 Pagination control for member resources

Status
subtletrue
titleLIMIT
 Pagination control for member resources

 

Request Headers:

Status
subtletrue
titleAccept
  text/turtle, text/rdf+n3, application/n3, text/n3, application/rdf+xml, application/json+rdf, application/n-triples, text/html

 

Example:

Code Block
curl -H "Accept: text/turtle" "http://localhost:8080/rest/fcr:search?q=bypassAdmin"

Response:

Code Block
Status: 200
 
Headers:
Link: http://localhost:8080/rest/fcr:search?q=bypassAdmin&offset=0&limit=25;rel="first"
Content-Type: text/turtle
Body:

<http://localhost:8080/rest/fcr:search?q=bypassAdmin>
        a       <http://www.w3.org/ns/ldp#Page> , <http://sindice.com/vocab/search#Page> ;
        <http://fedora.info/definitions/v4/repository#hasMember>
                <http://localhost:8080/rest/00/cf/42/b8/00cf42b8-3a11-4af0-8972-48be8d9db5cd> ;
        <http://fedora.info/definitions/v4/rest-api#hasMoreResults>
                false ;
        <http://sindice.com/vocab/search#itemsPerPage>
                "25"^^<http://www.w3.org/2001/XMLSchema#int> ;
        <http://sindice.com/vocab/search#searchTerms>
                "bypassAdmin" ;
        <http://sindice.com/vocab/search#startIndex>
                "0"^^<http://www.w3.org/2001/XMLSchema#long> ;
        <http://sindice.com/vocab/search#totalResults>
                "1"^^<http://www.w3.org/2001/XMLSchema#long> ;
        <http://www.w3.org/ns/ldp#firstPage>
                <http://localhost:8080/rest/fcr:search?q=bypassAdmin&offset=0&limit=25> ;
        <http://www.w3.org/ns/ldp#nextPage>
                ()
         ;
        <http://www.w3.org/ns/ldp#pageOf>
                <http://localhost:8080/rest/fcr:search?q=bypassAdmin> .

<http://localhost:8080/rest/00/cf/42/b8/00cf42b8-3a11-4af0-8972-48be8d9db5cd>
        a       <http://fedora.info/definitions/v4/rest-api#object> , <http://fedora.info/definitions/v4/rest-api#resource> ;
        <http://fedora.info/definitions/v4/repository#created>
                "2013-11-16T00:52:32.432Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> ;
        <http://fedora.info/definitions/v4/repository#createdBy>
                "bypassAdmin"^^<http://www.w3.org/2001/XMLSchema#string> ;
        <http://fedora.info/definitions/v4/repository#lastModified>
                "2013-11-16T00:52:32.418Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> ;
        <http://fedora.info/definitions/v4/repository#lastModifiedBy>
                "bypassAdmin"^^<http://www.w3.org/2001/XMLSchema#string> ;
        <http://fedora.info/definitions/v4/repository#uuid>
                "b9fb7c68-c5c8-4ecd-a1b6-5ffeeeb2ba3d"^^<http://www.w3.org/2001/XMLSchema#string> ;

Status:

Status
subtletrue
colourGreen
title200
 OK

Status
subtletrue
colourRed
title400
 Bad Request

SPARQL

Request URI: /fcr:sparql

Methods: GET

Warning

SPARQL query functionality is experimental and is not yet in any fcrepo4 release.

 

Status
titleGET
HTML form for submitting SPARQL queries

Request Headers:

Status
subtletrue
titleAccept
 text/html

 

 

...

Example:

Code Block
curl -H "Content-Type: application/sparql-query" -d @sparqlQuery.txt -H "Accept: " "http://localhost:8080/rest/fcr:sparql"
 
Body:
SELECT ?subject FROM <> WHERE { ?subject dc:title ?title }

Response:

Code Block
Status: 200
 
Headers:
Content-Type: text/turtle
 
Body:

Status:

Status
subtletrue
colourGreen
title200
 OK

Status
subtletrue
colourRed
title400
 Bad Request

Transform

Request URI: /fcr:transform/{program}

Methods: GET, POST

Status
titleGET
get a resource transformed with the default transform

Request Headers:

Example:

Code Block
titledefault transform
@prefix fcrepo : <http://fedora.info/definitions/v4/repository#>
id      = . :: xsd:string ;
title = dc:title :: xsd:string;
uuid = fcrepo:uuid :: xsd:string ; 
Code Block
curl http://localhost:8080/rest/49/3d/24/41/493d2441-0541-41c7-a23b-09d1f17d4a0f/fcr:transform/default

Response:

Code Block
Status: 200 OK

Headers:

Content-Type: application/json
Transfer-Encoding: chunked
Server: Jetty(8.1.11.v20130520)

Body:

[{"id":["http://localhost:8080/rest/49/3d/24/41/493d2441-0541-41c7-a23b-09d1f17d4a0f"],"title":[],"uuid":["07630a24-5a0b-4ba7-80ab-0691f68667ce"]}]

Status:

Status
subtletrue
colourGreen
title200
 OK

Status
subtletrue
colourRed
title400
 Bad Request

 

 

...

Output formats: application/json,text/tab-separated-values,text/csv,text/sse,text/plain,application/sparql-results+json,application/sparql-results+xml,application/sparql-results+bio,text/turtle,text/rdf+n3,application/N-triples,application/rdf_xml

Example:

Code Block
curl -X POST -H "Content-Type: application/rdf+ldpath" -d "@post.txt" "http://localhost:8080/rest/49/3d/24/41/493d2441-0541-41c7-a23b-09d1f17d4a0f/fcr:transform"

Body:
@prefix fcrepo : <http://fedora.info/definitions/v4/repository#>
id      = . :: xsd:string ;
title = dc:title :: xsd:string;
uuid = fcrepo:uuid :: xsd:string ;

Response:

Code Block
Status: 200 OK

Headers:

Content-Type: application/json
Transfer-Encoding: chunked
Server: Jetty(8.1.11.v20130520)

Body:

[{"id":["http://localhost:8080/rest/49/3d/24/41/493d2441-0541-41c7-a23b-09d1f17d4a0f"],"title":[],"uuid":["07630a24-5a0b-4ba7-80ab-0691f68667ce"]}]

Status:

Status
subtletrue
colourGreen
title200
 OK

Status
subtletrue
colourRed
title400
 Bad Request

Access Roles

Request URI: /path/to/some/resource/fcr:accessroles

Methods: GET, POST, DELETE

Warning

Arbitrary access roles may be set through this API. However, they are only enforced when paired with a Policy Enforcement Point that is aware of access roles.

Status
titleGET
 Get a list of all the roles assigned to principals on this resource

Output formats: application/json

Query Parameters:

Status
subtletrue
titleeffective
  When supplied, gets the list of effective roles for this resource, including those inherited from the parent

Output formats: application/json

...

Example:

Code Block
curl -X POST -H "Content-Type: application/json" -d "@post.txt" "http://localhost:8080/rest/49/3d/24/41/493d2441-0541-41c7-a23b-09d1f17d4a0f/fcr:accessroles"

Body:
{
   "principal name 1" : [ "reader" ],
   "principal name 2" : [ "writer" ],
   "principal name 3" : [ "admin" ]
}

Response:

Code Block
Status: 201 Created

Headers:

Location: http://localhost:8080/rest/test/fcr:accessroles
Content-Length: 0
Server: Jetty(8.1.11.v20130520)

Status:

...

Status
subtletrue
colourRed
title400
Bad Request

 

StatuscolourRedtitleDELETE Clear all roles assignments from this resource