[
https://issues.apache.org/jira/browse/OFBIZ-4274?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16486900#comment-16486900
]
Mathieu Lirzin commented on OFBIZ-4274:
---------------------------------------
I agree with Scott that it is better to make OFBiz _RESTFul from the ground
up_. In particular since it is already built around an HTTP API which are
defined by the various implementation of the {{EventHandler}} interface.
Given Roy Fielding's definition of resources, I think that “resources”
shouldn't be conflated with “entities”. AIUI the notion of “resource” would be
better tied to “request-map” objects because a resource is basically something
that has an URI as descibed by
[RFC-3986|https://tools.ietf.org/html/rfc3986?ref=binfind.com/web#section-1]:
{quote}This specification does not limit the scope of what might be a resource;
rather, the term "resource" is used in a general sense for whatever might be
identified by a URI. Familiar examples include an electronic document, an
image, a source of information with a consistent purpose (e.g., "today's
weather report for Los Angeles"), a service (e.g., an HTTP-to-SMS gateway), and
a collection of other resources. A resource is not necessarily accessible via
the Internet; e.g., human beings, corporations, and bound books in a library
can also be resources. Likewise, abstract concepts can be resources, such as
the operators and operands of a mathematical equation, the types of a
relationship (e.g., "parent" or "employee"), or numeric values (e.g., zero,
one, and infinity).
{quote}
Having said that, I think the POC for manipulating entities is really
interesting since the CRUD manipulations are common enough to likely generate a
lot of boiler-plate. What I would advocate however is to follow an iterative
approach by first introducing resources identified by nouns, allow the various
HTTP methods to be handled separately ({{GET/POST}} are currently mapped to the
same handler), and then define some hypermedia controls. Basically this
approach is following [Richardson maturity
model|https://www.martinfowler.com/articles/richardsonMaturityModel.html].
when we will have enough examples to start seeing patterns, we can start to
seriously think about what kind of abstractions and DSL we want when
manipulating entities more conveniently. IMHO trying to define an generic REST
model upfront is likely to make us fall into clumsy abstractions, since it is
unlikely that we could get the big picture at this stage.
Here is a concrete proposal for the first iteration:
{code:xml}
<request-map uri="examples" method="get">
<security https="true" auth="true"/>
<event type="java" path="ExamplesHandlers" invoke="getExamples"/>
<response name="success" type="view" value="..."/>
<response name="error" type="view" value="..."/>
</request-map>
<request-map uri="examples/{id}" method="get">
<security https="true" auth="true"/>
<event type="java" path="ExamplesHandlers" invoke="getExample"/>
<response name="success" type="view" value="..."/>
<response name="error" type="view" value="..."/>
</request-map>
<request-map uri="examples" method="post">
<security https="true" auth="true"/>
<event type="java" path="ExamplesHandlers" invoke="postExamples"/>
<response name="success" type="view" value="..."/>
<response name="error" type="view" value="..."/>
</request-map>
{code}
The choice for this *temporary* syntax is motivated by the fact that the only
required change in the XML grammar is an optional method attribute which
defaults to "all" to match the current behavior. To handle the {{/foo/{bar}}}
paths, the {{requestHandler::doRequest}} will resolve it by adding an extra
{{bar}} parameter associated with the matching value in the request object that
can then be retrieved in the event Handler. I have already started to implement
this. This work is accessible from [Néréide
labs|https://labs.nereide.fr/10031/Communautaire/compare/trunk...rest]
Additionally It would be interesting to be able to define a subset of requests
that the {{request-map}} handles either with a sub-element:
{code:xml}
<authorized-method><GET/><POST/></authorized-method>
{code}
or with a list of methods in the {{method}} attribute:
{code:xml}
<request-map uri="examples" method="get,post">...</request-map>
{code}
> Implement a REST Servlet
> ------------------------
>
> Key: OFBIZ-4274
> URL: https://issues.apache.org/jira/browse/OFBIZ-4274
> Project: OFBiz
> Issue Type: New Feature
> Components: framework
> Affects Versions: Trunk
> Reporter: Adrian Crum
> Priority: Major
> Labels: REST
> Attachments: RestExampleSchema.xsd, RestXmlRepresentation.xml,
> rest-conf.xml, swagger-pos-openapi.png
>
>
> Implement a REST servlet that will map REST requests to OFBiz services.
> Details are in the comments.
> [here is the discussion which took place on the dev
> ML|http://markmail.org/message/ai6q2fbksowaayn4]
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)