+1 Seconded. The Rest api functions are well thought out, but the stuff sent to the user is generated by appending strings, and error handling is not to easy, if you do not use Java.
On Wed, 2010-08-11 at 02:55 +0200, Scott Prater wrote: > Below are some comments from one of my developer colleagues, who knows > almost nothing about Fedora, but is working on an application to ingest > objects. > > Perhaps the REST API error handling and responses could be improved in > future releases? I could open a ticket for it, if others think it would > be useful, too. > > -- Scott > > ################################################################### > An Outsider's Notes on Working w/ the Fedora REST API > > In general: bravo > > The API is generally intuitive and makes it clear and easy how to > interact with Fedora. I can create objects, datastreams, relationships > as needed. I got up and running with it right away. > > The biggest sign that it is well-designed is that I was able to wire up > a REST client library to it written by someone else (and in another > programming language) and it worked as expected from that library's > understanding of how a REST client should interact w/ a REST API. > > Where it needs improvement is in the area of API response messages, > specifically on errors. From the point-of-view of the REST API > consumer, Java stack traces are unhelpful. They are useful in logs, > where developers and application maintainers can go to see them, but to > Fedora users, it is mostly noise. > > A concise response is more helpful to application developers using the > RESTful API. I need only three things: 1) an HTTP status code (which I > can get from the headers); 2) a local fedora error code, whether it is > your own numeric codes or other strings like "PIDNotFound" or > "LabelTooLong"; and 3) a concise explanation. (1) and (2) allow me to > gracefully handle the errors (and report them to my own logs) in a way > that I can keep executing for the rest of the content I am trying to > ingest. (3) provides me with some context for the error the first time I > encounter it and lets me know what I should write into my error handling > the next time I encounter the code from (2). > > By using the RESTful API, my application treats Fedora as a black box. > Printing the Java stack trace reveals the inner workings of Fedora, > which my application shouldn't see nor care about. > > Here's how my ideal response might look: > > <fedora-response type="action-failed"> > <http-code>415</http-code> > <fedora-error-code>LabelTooLong</fedora-error-code> > <explanation> > Object label must not exceed 255 characters > (foxml:property NAME='info:fedora/fedora-system:def/model#label') > </explanation> > </fedora-response> > > This is what I currently get back, and what I don't even attempt to parse: > > javax.ws.rs.WebApplicationException: > org.fcrepo.server.errors.ObjectValidityException: <?xml version="1.0" > encoding="UTF-8"?> > <RESULT xmlns:foxml="info:fedora/fedora-system:def/foxml#" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> > <foxml:property> > <ASSERT>Object label must not exceed 255 characters > (foxml:property NAME='info:fedora/fedora-system:def/model#label')</ASSERT> > </foxml:property> > </RESULT> > at > org.fcrepo.server.rest.BaseRestResource.handleException(BaseRestResource.java:168) > at > org.fcrepo.server.rest.FedoraObjectResource.createObject(FedoraObjectResource.java:298) > at sun.reflect.GeneratedMethodAccessor72.invoke(Unknown Source) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at > com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:175) > at > com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67) > at > com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:163) > at > com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:71) > at > com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:111) > at > com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:63) > at > com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:689) > at > com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:647) > at > com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:638) > at > com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:309) > at > com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:425) > at > com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:590) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.fcrepo.server.security.servletfilters.FilterRestApiFlash.doFilter(FilterRestApiFlash.java:79) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.fcrepo.server.security.jaas.AuthFilterJAAS.doFilter(AuthFilterJAAS.java:287) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) > at > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) > at > org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525) > at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) > at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) > at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) > at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) > at > org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) > at > org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) > at > org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) > at java.lang.Thread.run(Thread.java:637) > Caused by: org.fcrepo.server.errors.ObjectValidityException: <?xml > version="1.0" encoding="UTF-8"?> > <RESULT xmlns:foxml="info:fedora/fedora-system:def/foxml#" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> > <foxml:property> > <ASSERT>Object label must not exceed 255 characters > (foxml:property NAME='info:fedora/fedora-system:def/model#label')</ASSERT> > </foxml:property> > </RESULT> > at > org.fcrepo.server.validation.DOValidatorSchematron.validate(DOValidatorSchematron.java:132) > at > org.fcrepo.server.validation.DOValidatorSchematron.validate(DOValidatorSchematron.java:87) > at > org.fcrepo.server.validation.DOValidatorImpl.validateByRules(DOValidatorImpl.java:339) > at > org.fcrepo.server.validation.DOValidatorImpl.validate(DOValidatorImpl.java:252) > at > org.fcrepo.server.validation.DOValidatorModule.validate(DOValidatorModule.java:187) > at > org.fcrepo.server.storage.DefaultDOManager.getIngestWriter(DefaultDOManager.java:792) > at > org.fcrepo.server.management.DefaultManagement.ingest(DefaultManagement.java:107) > at sun.reflect.GeneratedMethodAccessor73.invoke(Unknown Source) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at > org.fcrepo.server.messaging.NotificationInvocationHandler.invoke(NotificationInvocationHandler.java:68) > at $Proxy0.ingest(Unknown Source) > at > org.fcrepo.server.management.ManagementModule.ingest(ManagementModule.java:336) > at > org.fcrepo.server.rest.FedoraObjectResource.createObject(FedoraObjectResource.java:293) > ... 35 more > ------------------------------------------------------------------------------ This SF.net email is sponsored by Make an app they can't live without Enter the BlackBerry Developer Challenge http://p.sf.net/sfu/RIM-dev2dev _______________________________________________ Fedora-commons-developers mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/fedora-commons-developers
