Pruebas con Nuxeo REST desde python

Una alternativa a CMIS para que aplicaciones de terceros consuman recursos documentales en Nuxeo, e independientemente de la tecnología utilizada para su desarrollo, es REST (Representational State Transfer). La capa REST de Nuxeo proporciona una serie de RESTlets que nos permiten consumir recursos via url/http. Un ejemplo de esto, tal y como ya se comentó aquí son los restlets de búsquedas en Nuxeo via querymodel. Pero hay algunos otros, que proporciona Nuxeo DM para operaciones básicas CRUD. Uno de ellos es el browse reslet o restlet de navegación. Con la sintaxis de la siguiente URL obtenemos los objetos en el de Nuxeo por debajo de un folder-id:

http://<host>:<port>/nuxeo/restAPI/<repository>/<id>/browse

donde <repository>, es el repositorio de Nuxeo que estamos inspeccionando y el <id> el id del documento-objeto documental.

El resultado es un XML como este:

<document title="8dab0cb7-e370-4879-8d77-af9af89844a5" type="Root" id="8dab0cb7-e370-4879-8d77-af9af89844a5" url="/default/">
  <document title="Default domain" type="Domain" id="b78636a6-bcd9-446c-aa38-efe0ae36cdb6" name="default-domain" url="/default/b78636a6-bcd9-446c-aa38-efe0ae36cdb6"/>
  <document title="Test domain" type="Domain" id="5c09f35c-fae2-4bdf-9cb9-533d75ac9bd9" name="test-domain" url="/default/5c09f35c-fae2-4bdf-9cb9-533d75ac9bd9"/>
  <document title="My domain" type="Domain" id="71d35bdf-d3d3-46f4-a886-7fdda0cf02b0" name="my-domain" url="/default/71d35bdf-d3d3-46f4-a886-7fdda0cf02b0"/>
</document>


El atributo id nos permite navegar por los diferentes espacios de trabajo de tipo Folder o derivados (Domains, Workspaces...). De este modo, para navegar por el repositorio de Nuxeo desde python via url necesito autenticarme e invocar el restlet anterior y parsear el xml. En unas pocas líneas con python utilizando urllib2 y minidom:
 

import urllib
import urllib2

def urlopen_auth_method(theurl, username, password, postdata=''):
    # Auth
    passman  = urllib2.HTTPPasswordMgrWithDefaultRealm()
    passman.add_password(None, theurl, username, password)
    authhandler = urllib2.HTTPBasicAuthHandler(passman)
    opener = urllib2.build_opener(authhandler)
    urllib2.install_opener(opener)
    # Post
    if (postdata):
      f = urllib2.urlopen(theurl, postdata)
    else:
      f = urllib2.urlopen(theurl)
    return f


# Connection data
username = 'Administrator'
password = 'Administrator'

# Browse repository (default repository)
url1     = 'http://baco.zylk.net:8080/nuxeo/restAPI/default/*/browse'

# Auth connection and
f   = urlopen_auth_method(url1, username, password)

# Parse response
xml = f.read()
xmldoc = minidom.parseString(xml.decode("latin-1"))

for node in xmldoc.getElementsByTagName('document'):
    print node.getAttribute('title')

Por otra parte, se puede crear contenido de Nuxeo via reslet:

http://baco.zylk.net:8080/nuxeo/restAPI/default/2d7f81c7-cd05-451d-968b-17ef3dc8792f/createDocument?docType=File&dublincore:title=test&dublincore:description=testing
 

<document>
  <repository>default</repository>
  <docRef>9c7a8c34-229d-4957-82d4-0daa84c642b9</docRef>
  <docTitle>test</docTitle>
  <docPath>/default-domain/workspaces/test</docPath>
</document>


y actualizarlo,

http://baco.zylk.net:8080/nuxeo/restAPI/default/2d7f81c7-cd05-451d-968b-17ef3dc8792f/updateDocumentRestlet?dublincore:description=nice

o borrarlo:

http://baco.zylk.net:8080/nuxeo/restAPI/default/2d7f81c7-cd05-451d-968b-17ef3dc8792f/deleteDocumentRestlet

También podemos añadir un documento con el restlet de upload:

http://baco.zylk.net:8080/nuxeo/restAPI/default/9c7a8c34-229d-4957-82d4-0daa84c642b9/test.txt/upload

Y también podemos hacer búsquedas, además del mencionado querymodel, tenemos las búsquedas por opensearch:

http://baco.zylk.net:8080/nuxeo/restAPI/opensearch?q=nuxeo

Además de los comentados, también estan los restlets de exportación y bloqueo de un documento, así como del denominado Restlet Pack, relativos a los vocabularios, sindicación, workflows, o el mismo query model de búsquedas. Os dejo un par de enlaces:
 

Enlaces:

00

More Blog Entries

0 Comments