Difference between revisions of "API:EPrints/Apache/CRUD"

From EPrints Documentation
Jump to: navigation, search
(23 intermediate revisions by one other user not shown)
Line 4: Line 4:
  
  
<!-- Pod2Wiki=_private_ --><!-- Pod2Wiki=head_name -->
+
<!-- Pod2Wiki=_private_ -->{{Version|since=3.3.0}}
 +
 
 +
<!-- Pod2Wiki=head_name -->
 
==NAME==
 
==NAME==
EPrints::Apache::CRUD
+
EPrints::Apache::CRUD - Create, read, update and delete via HTTP
  
 
<!-- Edit below this comment -->
 
<!-- Edit below this comment -->
Line 42: Line 44:
 
Create a new eprint based on a single file:
 
Create a new eprint based on a single file:
  
<pre>  curl -x POST \
+
<pre>  curl -X POST \
 
     -i \
 
     -i \
 
     -u user:password \
 
     -u user:password \
Line 65: Line 67:
 
   HTTP/1.1 201 Created
 
   HTTP/1.1 201 Created
 
   Content-Type: application/atom+xml;charset=utf-8
 
   Content-Type: application/atom+xml;charset=utf-8
 +
  ...</pre>
 +
 +
Add a PDF file to an existing eprint with eprintid 100 (naming the file myfile.pdf inside EPrints):
 +
 +
<pre>  curl -X POST \
 +
    -i \
 +
    -u user:password \
 +
    --data-binary '@filename.pdf' \
 +
    -H 'Content-Disposition: attachment; filename=myfile.pdf' \
 +
    -H 'Content-Type: application/pdf' \
 +
    https://myrepo/id/eprint/100/contents
 +
 
 +
  HTTP/1.1 100 Continue
 +
 +
  HTTP/1.1 201 Created
 
   ...</pre>
 
   ...</pre>
  
Line 90: Line 107:
 
   Content-Type: application/atom+xml;charset=utf-8
 
   Content-Type: application/atom+xml;charset=utf-8
 
   ...</pre>
 
   ...</pre>
 +
 +
You can find more examples in the ''tests/84_sword.t'' unit test.
 +
 +
<!-- Edit below this comment -->
 +
 +
 +
<!-- Pod2Wiki= -->
 +
<!-- Pod2Wiki=head_uri_layout -->
 +
===URI layout===
 +
These URIs are relative to your EPrints HTTP/HTTPs root.
 +
 +
* /id/contents GET,HEAD,OPTIONS,POST
 +
: Requires authentication.
 +
 +
: GET a list of the eprints owned by the user. POST to create a new EPrint object.
 +
 +
* /id/[datasetid]/[dataobjid] DELETE,GET,HEAD,OPTIONS,PUT
 +
: Requires authentication depending on user's privileges and object visibility.
 +
 +
: GET an object's metadata or, for [[API:EPrints/DataObj/File|File]] objects, the file content. PUT to replace the metadata and/or contents (see [[API:EPrints/Apache/CRUD#Updating_complex_objects_using_PUT|Updating complex objects using PUT]]). If the object does not exist will attempt to create it with the given dataobjid (requires 'upsert' privilege).
 +
 +
* /id/[datasetid]/[dataobjid]/contents DELETE,GET,HEAD,OPTIONS,POST,PUT
 +
: Requires authentication depending on user's privileges and object visibility.
 +
 +
: GET the logical contents of the object: documents for eprints or files for documents. PUT to replace the existing contents or POST to add to the existing contents.
  
 
<!-- Edit below this comment -->
 
<!-- Edit below this comment -->
Line 97: Line 139:
 
<!-- Pod2Wiki=head_http_content_negotiation -->
 
<!-- Pod2Wiki=head_http_content_negotiation -->
 
===HTTP Content Negotiation===
 
===HTTP Content Negotiation===
GET/HEAD requests are processed using {{API:PodLink|file=EPrints/Plugin/Export|package_name=EPrints::Plugin::Export|section=|text=Export}} plugins. POST/PUT requests are processed using {{API:PodLink|file=EPrints/Plugin/Import|package_name=EPrints::Plugin::Import|section=|text=Import}} plugins.
+
GET/HEAD requests are processed using [[API:EPrints/Plugin/Export|Export]] plugins. POST/PUT requests are processed using [[API:EPrints/Plugin/Import|Import]] plugins.
 +
 
 +
The plugin used depends on the request's <em>Accept</em> (GET/HEAD) or <em>Content-Type</em> (POST/PUT) header and the type of object being acted on. For example, the following request:
 +
 
 +
<pre>  GET /id/eprint/23 HTTP/1.1
 +
  Accept: application/vnd.eprints.data+xml</pre>
 +
 
 +
Will search for an Export plugin that accepts objects of type '''dataobj/eprint''' and can produce output in the MIME type '''application/vnd.eprints.data+xml'''. This will most likely be the [[API:EPrints/Plugin/Export/XML|EP3 XML]] plugin.
 +
 
 +
In addition to the general plugin negotiation behaviour some special cases are supported to improve compatibility with Atom Pub/Web Browser clients:
  
When GETing, your repository should support at least:
+
* /id/eprint/...
 +
: Requesting [[API:EPrints/DataObj/EPrint|EPrint]] objects as text/html will result in a 303 Redirect to the eprint object's abstract page or, if the eprint is not public, its [[API:EPrints/Plugin/Screen/EPrint/View|View]] page.
  
<pre>  application/vnd.eprints.data+xml - EPrints XML
+
* /id/document/.../contents
  application/atom+xml - Atom XML</pre>
+
: Requesting the <em>/contents</em> of a [[API:EPrints/DataObj/Document|Document]] object will return the content of the document's main file.
  
Depending on the object type requested (eprint, document etc.) additional formats may be available. These are defined by the 'mime-type' in the plugin. See [[API:EPrints/Plugin/Import#accept|EPrints::Plugin::Import/accept]]  
+
* /id/file/...
 +
: Requesting a [[API:EPrints/DataObj/File|File]] object with no <em>Accept</em> header (or '''*/*''') will return the file's content.
  
{{API:PodLink|file=EPrints/DataObj/EPrint|package_name=EPrints::DataObj::EPrint|section=|text=EPrint}} objects are always available as text/html, which will result in a 303 Redirect to the EPrint's abstract page or, if the EPrint is not public, the {{API:PodLink|file=EPrints/Plugin/Screen/EPrint/View|package_name=EPrints::Plugin::Screen::EPrint::View|section=|text=View}} page.
+
* POST /id/.../contents
 +
: When creating new records via POST, content negotiation is performed against the Import plugins.
  
Requesting the <code>/contents</code> of a {{API:PodLink|file=EPrints/DataObj/Document|package_name=EPrints::DataObj::Document|section=|text=Document}} will return the content of the main file. Requesting a {{API:PodLink|file=EPrints/DataObj/File|package_name=EPrints::DataObj::File|section=|text=File}} with no Accept header (or '*/*') will return the file content.
+
: If no Import plugin supports the <em>Content-Type</em> header the content will be treated as '''application/octet-stream''' and stored in a new object. The resulting Atom entry will describe the new object (e.g. the <em>eprint</em> object in which the new <em>document</em> and <em>file</em> objects were created).
  
When creating new records via POST content negotiation is performed against the Import plugins. If no Import plugin supports the given Content-Type the content will be treated as binary and stored in a new, blank object. The returned Atom entry will describe the new object (e.g. the root 'eprint' object, in which the new document and file were created).
+
: Otherwise, the result will depend on the Import plugin's output. Import plugins may produce a single object, multiple objects or an object plus content file(s).
  
If the POSTed content is in a recognised format the resulting object(s) will depend on what the Import plugin outputs. This may be a single object, if the output is only an object, or an object plus content file(s).
+
* Content-Type header
 +
: If no <em>Content-Type</em> header is given the MIME type defaults to '''application/octet-stream''' for POSTs and PUTs.
  
If no Content-Type is given the MIME type defaults to application/octet-stream. If no Content-Disposition with a 'filename' argument is given the filename will be set to 'main.bin'.
+
* Content-Disposition header
 +
: If the <em>Content-Disposition</em> header is missing or does not contain a <em>filename</em> parameter the filename defaults to ''main.bin'' for POSTs and PUTs.
  
 
<!-- Edit below this comment -->
 
<!-- Edit below this comment -->
Line 122: Line 178:
 
<!-- Pod2Wiki=head_updating_complex_objects_using_put -->
 
<!-- Pod2Wiki=head_updating_complex_objects_using_put -->
 
===Updating complex objects using PUT===
 
===Updating complex objects using PUT===
EPrint objects contain zero or more documents, which each contain zero or more files. When you update (PUT) an EPrint object the contained documents will only be replaced if the Import plugin defines new documents e.g. the Atom Import plugin will never define new documents so PUTing Atom content will only update the EPrint's metadata. PUTing EPrints XML will replace the documents if you include a &lt;documents&gt; XML element.
+
Eprint objects contain zero or more documents, which each contain zero or more files. When you update (PUT) an eprint object the contained documents will only be replaced if the Import plugin defines new documents e.g. the Atom Import plugin will never define new documents so PUTing Atom content will only update the eprint's metadata. PUTing [[API:EPrints/Plugin/Export/XML|EP3 XML]] will replace the documents if you include a &lt;documents&gt; XML element.
  
PUTing to <code>/contents</code> will always replace all contents e.g. PUTing to <code>/eprint/23/contents</code> is equivalent to <code>DELETE /eprint/23/contents</code> then <code>POST /eprint/23/contents</code>.
+
PUTing to <em>/contents</em> will always replace all contents - PUTing to <em>/eprint/23/contents</em> is equivalent to <em>DELETE /eprint/23/contents</em> then <em>POST /eprint/23/contents</em>.
  
 
<!-- Edit below this comment -->
 
<!-- Edit below this comment -->
Line 130: Line 186:
  
 
<!-- Pod2Wiki= -->
 
<!-- Pod2Wiki= -->
<!-- Pod2Wiki=head_uris -->
+
<!-- Pod2Wiki=head_put_delete_from_javascript -->
===URIs===
+
===PUT/DELETE from Javascript===
* /id/contents GET,HEAD,OPTIONS,POST
+
<!-- Pod2Wiki=_private_ -->{{Available|since=3.3.9}}
: Requires authentication.
 
  
: GET a list of the eprints owned by the user. POST to create a new EPrint object.
+
Web browsers only allow GET and POST requests. To perform other requests use the 'X-Method' header with POST to specify the actual method you want:
  
* /id/[datasetid]/[dataobjid] DELETE,GET,HEAD,OPTIONS,PUT
+
<pre>  POST /id/eprint/23 HTTP/1.1
: Requires authentication depending on user's privileges and object visibility.
+
  X-Method: PUT
 
+
  ...</pre>
: GET an object's metadata or, for {{API:PodLink|file=EPrints/DataObj/File|package_name=EPrints::DataObj::File|section=|text=File}} objects, the file content. PUT to replace the metadata and/or contents (see [[API:EPrints/Apache/CRUD#Updating_complex_objects_using_PUT|Updating complex objects using PUT]]). If the object does not exist will attempt to create it with the given dataobjid (requires 'upsert' privilege).
 
 
 
* /id/[datasetid]/[dataobjid]/contents DELETE,GET,HEAD,OPTIONS,POST,PUT
 
: Requires authentication depending on user's privileges and object visibility.
 
 
 
: GET the logical contents of the object: documents for eprints or files for documents. PUT to replace the existing contents or POST to add to the existing contents.
 
  
 
<!-- Edit below this comment -->
 
<!-- Edit below this comment -->
Line 151: Line 200:
  
 
<!-- Pod2Wiki= -->
 
<!-- Pod2Wiki= -->
<!-- Pod2Wiki=head_ajax_requests -->
+
<!-- Pod2Wiki=head_upserting_objects_with_put -->
==AJAX REQUESTS==
+
===Upserting objects with PUT===
Browsers only allow GET and POST requests. To perform other requests use the 'X-Method' header with POST to specify the actual method you want.
+
<!-- Pod2Wiki=_private_ -->{{Available|since=3.3.9}}
  
<pre> POST /id/eprint/23 HTTP/1.1
+
If you have the <em>upsert</em> privilege objects will be created on demand, otherwise attempting to PUT to a non-existant object will result in an error.
  X-Method: PUT
 
  ...</pre>
 
  
 
<!-- Edit below this comment -->
 
<!-- Edit below this comment -->
Line 316: Line 363:
 
</source>
 
</source>
 
Check the Packaging header is ok, if given.
 
Check the Packaging header is ok, if given.
 +
 +
<!-- Edit below this comment -->
 +
 +
 +
<!-- Pod2Wiki= -->
 +
<!-- Pod2Wiki=head_resolve_relations -->
 +
===resolve_relations===
 +
 +
<source lang="perl">$dataobj = $crud->resolve_relations( $dataobj [, @relations ] )
 +
 +
</source>
 +
Resolve the relation path from $dataobj and return the resulting dataobj.
 +
 +
Returns undef if there is no such related object.
  
 
<!-- Edit below this comment -->
 
<!-- Edit below this comment -->
Line 366: Line 427:
 
</source>
 
</source>
 
Work out the best plugin to export/update an object based on the client-headers.
 
Work out the best plugin to export/update an object based on the client-headers.
 +
 +
<!-- Edit below this comment -->
 +
 +
 +
<!-- Pod2Wiki= -->
 +
<!-- Pod2Wiki=head_DELETE -->
 +
===DELETE===
 +
 +
<source lang="perl">$rc = $crud->DELETE()
 +
 +
</source>
 +
Handle DELETE requests.
 +
 +
* HTTP_METHOD_NOT_ALLOWED
 +
: Can't perform DELETE on ''/id/contents''.
 +
 +
* HTTP_NOT_FOUND
 +
: No such object.
 +
 +
* HTTP_CONFLICT
 +
: Lock conflict with another user.
 +
 +
* HTTP_NO_CONTENT
 +
: Successfully removed the object.
 +
 +
<!-- Edit below this comment -->
 +
 +
 +
<!-- Pod2Wiki= -->
 +
<!-- Pod2Wiki=head_GET -->
 +
===GET===
 +
 +
<source lang="perl">$rc = $crud->GET( [ $owner ] )
 +
 +
</source>
 +
Handle GET requests.
 +
 +
* HTTP_NO_CONTENT
 +
: No sub-objects in <em>/id/.../contents</em>.
 +
 +
* HTTP_NOT_ACCEPTABLE
 +
: More than one sub-object in <em>/id/.../contents</em>.
 +
 +
* HTTP_UNSUPPORTED_MEDIA_TYPE
 +
: No [[API:EPrints/Plugin/Export|Export]] plugin matches the <em>Accept</em> header/object type.
 +
 +
* HTTP_SEE_OTHER
 +
: Redirect to a non-CRUD EPrints page.
 +
 +
* HTTP_NOT_FOUND
 +
: Object not found.
 +
 +
* HTTP_OK
 +
: Object outputted successfully.
 +
 +
<!-- Edit below this comment -->
 +
 +
 +
<!-- Pod2Wiki= -->
 +
<!-- Pod2Wiki=head_POST -->
 +
===POST===
 +
 +
<source lang="perl">$rc = $crud->POST( [ $owner ] )
 +
 +
</source>
 +
Handle POST requests.
 +
 +
* HTTP_METHOD_NOT_ALLOWED
 +
: Can only POST to <em>/id/.../contents</em>.
 +
 +
* HTTP_BAD_REQUEST
 +
: No plugin for the SWORD <em>Packaging</em> header.
 +
 +
* HTTP_CREATED
 +
: Object(s) successfully created.
 +
 +
<!-- Edit below this comment -->
 +
 +
 +
<!-- Pod2Wiki= -->
 +
<!-- Pod2Wiki=head_PUT -->
 +
===PUT===
 +
 +
<source lang="perl">$rc = $crud->PUT( [ $owner ] )
 +
 +
</source>
 +
Handle PUT requests.
 +
 +
* HTTP_UNSUPPORTED_MEDIA_TYPE
 +
: No [[API:EPrints/Plugin/Import|Import]] plugin matched the <em>Content-Type</em> header/object type.
 +
 +
* HTTP_RANGE_NOT_SATISFIABLE
 +
: <em>Range</em> header is invalid or unsupported for the <em>object type</em>.
 +
 +
* HTTP_FORBIDDEN
 +
: User does not have permission to create/update the <em>object</em>.
 +
 +
* HTTP_CREATED
 +
: Object was successfully created.
 +
 +
* HTTP_NO_CONTENT
 +
: Object was successfully updated.
 +
 +
<!-- Edit below this comment -->
 +
 +
 +
<!-- Pod2Wiki= -->
 +
<!-- Pod2Wiki=head_PUT_contents -->
 +
===PUT_contents===
 +
 +
<source lang="perl">$rc = $crud->PUT_contents( [ $owner ] )
 +
 +
</source>
 +
Equivalent to <code>DELETE /id/.../contents</code> then <code>POST /id/.../contents</code>.
 +
 +
See [[API:EPrints/Apache/CRUD#DELETE|DELETE]] and [[API:EPrints/Apache/CRUD#POST|POST]].
  
 
<!-- Edit below this comment -->
 
<!-- Edit below this comment -->

Revision as of 17:04, 15 March 2013

EPrints 3 Reference: Directory Structure - Metadata Fields - Repository Configuration - XML Config Files - XML Export Format - EPrints data structure - Core API - Data Objects


API: Core API

Latest Source Code (3.4, 3.3) | Revision Log | Before editing this page please read Pod2Wiki


Warning This feature requires EPrints version 3.3.0 or later

NAME

EPrints::Apache::CRUD - Create, read, update and delete via HTTP


SYNOPSIS

$crud = EPrints::Apache::CRUD->new(
		repository => $repo,
		request => $r,
		datasetid => "eprint",
		dataobjid => "23",
	);


DESCRIPTION

The CRUD (Create/Read/Update/Delete) module provides the Web API for manipulating content on the server. The API is an AtomPub implementation that exposes Import and Export plugins via simple URLs and HTTP content type negotiation.

You should use the <link> entries in the repository's home page to locate the CRUD endpoint, as they may change in the future:

  <link rel="Sword" href="https://myrepo/sword-app/servicedocument" />
  <link rel="SwordDeposit" href="https://myrepo/id/contents" />


Examples

Create a new eprint based on a single file:

  curl -X POST \
    -i \
    -u user:password \
    -d 'Hello, World!' \
    -H 'Content-Type: text/plain' \
    https://myrepo/id/contents
  
  HTTP/1.1 201 Created
  Content-Type: application/atom+xml;charset=utf-8
  ...

Add a file to an existing eprint:

  curl -X POST \
    -i \
    -u user:password \
    -d 'Hello, World!' \
    -H 'Content-Disposition: attachment; filename=hello.txt' \
    -H 'Content-Type: text/plain' \
    https://myrepo/id/eprint/23/contents
  
  HTTP/1.1 201 Created
  Content-Type: application/atom+xml;charset=utf-8
  ...

Add a PDF file to an existing eprint with eprintid 100 (naming the file myfile.pdf inside EPrints):

  curl -X POST \
    -i \
    -u user:password \
    --data-binary '@filename.pdf' \
    -H 'Content-Disposition: attachment; filename=myfile.pdf' \
    -H 'Content-Type: application/pdf' \
    https://myrepo/id/eprint/100/contents
  
  HTTP/1.1 100 Continue

  HTTP/1.1 201 Created
  ...

Get an eprint's metadata in Atom XML:

  curl -X GET \
    -i \
    -u user:password \
    -H 'Accept: application/atom+xml' \
    https://myrepo/id/eprint/23
  
  HTTP/1.1 200 OK
  Content-Type: application/atom+xml;charset=utf-8
  ...

Get the list of contents (documents) of an eprint in Atom XML:

  curl -X GET \
    -i \
    -u user:password \
    -H 'Accept: application/atom+xml' \
    https://myrepo/id/eprint/23/contents
  
  HTTP/1.1 200 OK
  Content-Type: application/atom+xml;charset=utf-8
  ...

You can find more examples in the tests/84_sword.t unit test.


URI layout

These URIs are relative to your EPrints HTTP/HTTPs root.

  • /id/contents GET,HEAD,OPTIONS,POST
Requires authentication.
GET a list of the eprints owned by the user. POST to create a new EPrint object.
  • /id/[datasetid]/[dataobjid] DELETE,GET,HEAD,OPTIONS,PUT
Requires authentication depending on user's privileges and object visibility.
GET an object's metadata or, for File objects, the file content. PUT to replace the metadata and/or contents (see Updating complex objects using PUT). If the object does not exist will attempt to create it with the given dataobjid (requires 'upsert' privilege).
  • /id/[datasetid]/[dataobjid]/contents DELETE,GET,HEAD,OPTIONS,POST,PUT
Requires authentication depending on user's privileges and object visibility.
GET the logical contents of the object: documents for eprints or files for documents. PUT to replace the existing contents or POST to add to the existing contents.


HTTP Content Negotiation

GET/HEAD requests are processed using Export plugins. POST/PUT requests are processed using Import plugins.

The plugin used depends on the request's Accept (GET/HEAD) or Content-Type (POST/PUT) header and the type of object being acted on. For example, the following request:

  GET /id/eprint/23 HTTP/1.1
  Accept: application/vnd.eprints.data+xml

Will search for an Export plugin that accepts objects of type dataobj/eprint and can produce output in the MIME type application/vnd.eprints.data+xml. This will most likely be the EP3 XML plugin.

In addition to the general plugin negotiation behaviour some special cases are supported to improve compatibility with Atom Pub/Web Browser clients:

  • /id/eprint/...
Requesting EPrint objects as text/html will result in a 303 Redirect to the eprint object's abstract page or, if the eprint is not public, its View page.
  • /id/document/.../contents
Requesting the /contents of a Document object will return the content of the document's main file.
  • /id/file/...
Requesting a File object with no Accept header (or */*) will return the file's content.
  • POST /id/.../contents
When creating new records via POST, content negotiation is performed against the Import plugins.
If no Import plugin supports the Content-Type header the content will be treated as application/octet-stream and stored in a new object. The resulting Atom entry will describe the new object (e.g. the eprint object in which the new document and file objects were created).
Otherwise, the result will depend on the Import plugin's output. Import plugins may produce a single object, multiple objects or an object plus content file(s).
  • Content-Type header
If no Content-Type header is given the MIME type defaults to application/octet-stream for POSTs and PUTs.
  • Content-Disposition header
If the Content-Disposition header is missing or does not contain a filename parameter the filename defaults to main.bin for POSTs and PUTs.


Updating complex objects using PUT

Eprint objects contain zero or more documents, which each contain zero or more files. When you update (PUT) an eprint object the contained documents will only be replaced if the Import plugin defines new documents e.g. the Atom Import plugin will never define new documents so PUTing Atom content will only update the eprint's metadata. PUTing EP3 XML will replace the documents if you include a <documents> XML element.

PUTing to /contents will always replace all contents - PUTing to /eprint/23/contents is equivalent to DELETE /eprint/23/contents then POST /eprint/23/contents.


PUT/DELETE from Javascript

{{#if:3.3.9| * Requires version 3.3.9 or later|}}

Web browsers only allow GET and POST requests. To perform other requests use the 'X-Method' header with POST to specify the actual method you want:

  POST /id/eprint/23 HTTP/1.1
  X-Method: PUT
  ...


Upserting objects with PUT

{{#if:3.3.9| * Requires version 3.3.9 or later|}}

If you have the upsert privilege objects will be created on demand, otherwise attempting to PUT to a non-existant object will result in an error.


METHODS

repository

$repo = $crud->repository()

Returns the current repository.


request

$r = $crud->request()

Returns the current Apache2::RequestUtil.


method

$method = $crud->method()

Returns the HTTP method.


scope

$scope = $crud->scope()

Returns the scope of the action being performed.


dataset

$dataset = $crud->dataset()

Returns the current dataset (if any).


dataobj

$dataobj = $crud->dataobj()

Returns the current dataobj (if any).


field

$field = $crud->field()

Returns the current field (if available);


headers

$headers = $crud->headers()

Get the processed headers.


options

@verbs = $crud->options()

Returns the available HTTP verbs for the current request.


plugin

$plugin = $crud->plugin()

Returns the current plugin (if available).


is_write

$bool = $crud->is_write()

Returns true if the request is not a read-only method.


accept_type

$accept_type = $crud->accept_type()

Returns the EPrints type for the current request.


check_packaging

$rc = $crud->check_packaging()

Check the Packaging header is ok, if given.


resolve_relations

$dataobj = $crud->resolve_relations( $dataobj [, @relations ] )

Resolve the relation path from $dataobj and return the resulting dataobj.

Returns undef if there is no such related object.


parse_input

$list = $crud->parse_input( $plugin, $f [, %params ] )

Parse the content submitted by the user using the given $plugin. $f is called by epdata_to_dataobj to convert epdata to a dataobj.  %params are passed to the plugin's input_fh method.

Returns undef on error.


import_plugins

@plugins = $crud->import_plugins( [ %params ] )

Returns all matching import plugins against %params ordered by descending 'q' score.


export_plugins

@plugins = $crud->export_plugins( [ %params ] )

Returns all matching export plugins against %params ordered by descending 'q' score.


content_negotiate_best_plugin

$plugin = $crud->content_negotiate_best_plugin()

Work out the best plugin to export/update an object based on the client-headers.


DELETE

$rc = $crud->DELETE()

Handle DELETE requests.

  • HTTP_METHOD_NOT_ALLOWED
Can't perform DELETE on /id/contents.
  • HTTP_NOT_FOUND
No such object.
  • HTTP_CONFLICT
Lock conflict with another user.
  • HTTP_NO_CONTENT
Successfully removed the object.


GET

$rc = $crud->GET( [ $owner ] )

Handle GET requests.

  • HTTP_NO_CONTENT
No sub-objects in /id/.../contents.
  • HTTP_NOT_ACCEPTABLE
More than one sub-object in /id/.../contents.
  • HTTP_UNSUPPORTED_MEDIA_TYPE
No Export plugin matches the Accept header/object type.
  • HTTP_SEE_OTHER
Redirect to a non-CRUD EPrints page.
  • HTTP_NOT_FOUND
Object not found.
  • HTTP_OK
Object outputted successfully.


POST

$rc = $crud->POST( [ $owner ] )

Handle POST requests.

  • HTTP_METHOD_NOT_ALLOWED
Can only POST to /id/.../contents.
  • HTTP_BAD_REQUEST
No plugin for the SWORD Packaging header.
  • HTTP_CREATED
Object(s) successfully created.


PUT

$rc = $crud->PUT( [ $owner ] )

Handle PUT requests.

  • HTTP_UNSUPPORTED_MEDIA_TYPE
No Import plugin matched the Content-Type header/object type.
  • HTTP_RANGE_NOT_SATISFIABLE
Range header is invalid or unsupported for the object type.
  • HTTP_FORBIDDEN
User does not have permission to create/update the object.
  • HTTP_CREATED
Object was successfully created.
  • HTTP_NO_CONTENT
Object was successfully updated.


PUT_contents

$rc = $crud->PUT_contents( [ $owner ] )

Equivalent to DELETE /id/.../contents then POST /id/.../contents.

See DELETE and POST.


SEE ALSO

http://en.wikipedia.org/wiki/Create,_read,_update_and_delete

http://en.wikipedia.org/wiki/Content_negotiation


COPYRIGHT

Copyright 2000-2011 University of Southampton.

This file is part of EPrints http://www.eprints.org/.

EPrints is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

EPrints is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with EPrints. If not, see http://www.gnu.org/licenses/.