You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@isis.apache.org by Kambiz Darabi <da...@m-creations.com> on 2016/02/03 21:11:59 UTC

Collection argument for service

Hi,

I'm wrestling with a service which is going to be called by a
hand-written javascript client (written by others). The client wants to
send something like this:

{
    "urls": [ { "id": "test-1", "url": "http://example.com/abc" }, { "id": "test-2", "url": "http://example.com/def" } ]
}

and get back 

{
    "urls": [ { "id": "test-1", "url": "http://example.com/ybpnyubftnnfwqs" }, { "id": "test-2", "url": "http://example.com/63dgjrevlhnsufqw" } ]
}


The second part was simple. I created

@ViewModel
public class IdentifiedUrl {
    protected String id;
    protected String url;
...

and

@ViewModel
public class UrlList {
    protected Set<IdentifiedUrl> urls;
...

Then, in my domain service, I can create an action:

public UrlList encodeUrls(@Parameter @ParameterLayout(named = "urls") String urls)
    HashSet<IdentifiedUrl> responseUrls= new HashSet<IdentifiedUrl>();
    responseUrls.add(new IdentifiedUrl("test-1", "http://example.com/102398432313410948710798713028941209374"));
    responseUrls.add(new IdentifiedUrl("test-2", "http://example.com/123452309028954723049875023152310239843"));
    return new UrlList(responseUrls);
}

and when called with the header Accept: application/json;profile="urn:org.apache.isis/v1", 
returns

{
  "urls" : [ {
    "$$href" : "http://localhost:12080/restful/objects/com.example.mas.dom.services.IdentifiedUrl/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8vPg==",
    "$$title" : "Untitled Identified Url",
    "$$instanceId" : "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8vPg==",
    "id" : "test-2",
    "url" : "http://example.com/123452309028954723049875023152310239843"
  }, {
    "$$href" : "http://localhost:12080/restful/objects/com.example.mas.dom.services.IdentifiedUrl/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8vPg==",
    "$$title" : "Untitled Identified Url",
    "$$instanceId" : "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8vPg==",
    "id" : "test-1",
    "url" : "http://example.com/102398432313410948710798713028941209374"
  } ]
}


But regarding the action argument, I don't get anywhere. Can someone
please propose which direction to take? It would be helpful if the JSON
which needs to be posted could be in a 'simple' representation.

Thanks a lot


Kambiz

Re: Collection argument for service

Posted by Dan Haywood <da...@haywood-associates.co.uk>.
Hi Kambiz,

sorry not to reply sooner.

The framework doesn't currently provide any mechanism to plug-in
alternative mechanisms for parsing inbound arguments; the REST API supports
only the format defined in the Restful Objects spec [1]

However, there's nothing to prevent you from defining your own additional
REST resources, by defining and registering [2] your own subclass of
RestfulObjectsApplication.

HTH
Dan


[1] http://restfulobjects.org
[2]
https://github.com/isisaddons/isis-app-todoapp/blob/master/webapp/src/main/webapp/WEB-INF/web.xml#L271



On 3 February 2016 at 20:11, Kambiz Darabi <da...@m-creations.com> wrote:

> Hi,
>
> I'm wrestling with a service which is going to be called by a
> hand-written javascript client (written by others). The client wants to
> send something like this:
>
> {
>     "urls": [ { "id": "test-1", "url": "http://example.com/abc" }, {
> "id": "test-2", "url": "http://example.com/def" } ]
> }
>
> and get back
>
> {
>     "urls": [ { "id": "test-1", "url": "http://example.com/ybpnyubftnnfwqs"
> }, { "id": "test-2", "url": "http://example.com/63dgjrevlhnsufqw" } ]
> }
>
>
> The second part was simple. I created
>
> @ViewModel
> public class IdentifiedUrl {
>     protected String id;
>     protected String url;
> ...
>
> and
>
> @ViewModel
> public class UrlList {
>     protected Set<IdentifiedUrl> urls;
> ...
>
> Then, in my domain service, I can create an action:
>
> public UrlList encodeUrls(@Parameter @ParameterLayout(named = "urls")
> String urls)
>     HashSet<IdentifiedUrl> responseUrls= new HashSet<IdentifiedUrl>();
>     responseUrls.add(new IdentifiedUrl("test-1", "
> http://example.com/102398432313410948710798713028941209374"));
>     responseUrls.add(new IdentifiedUrl("test-2", "
> http://example.com/123452309028954723049875023152310239843"));
>     return new UrlList(responseUrls);
> }
>
> and when called with the header Accept:
> application/json;profile="urn:org.apache.isis/v1",
> returns
>
> {
>   "urls" : [ {
>     "$$href" : "
> http://localhost:12080/restful/objects/com.example.mas.dom.services.IdentifiedUrl/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8vPg==
> ",
>     "$$title" : "Untitled Identified Url",
>     "$$instanceId" :
> "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8vPg==",
>     "id" : "test-2",
>     "url" : "http://example.com/123452309028954723049875023152310239843"
>   }, {
>     "$$href" : "
> http://localhost:12080/restful/objects/com.example.mas.dom.services.IdentifiedUrl/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8vPg==
> ",
>     "$$title" : "Untitled Identified Url",
>     "$$instanceId" :
> "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8vPg==",
>     "id" : "test-1",
>     "url" : "http://example.com/102398432313410948710798713028941209374"
>   } ]
> }
>
>
> But regarding the action argument, I don't get anywhere. Can someone
> please propose which direction to take? It would be helpful if the JSON
> which needs to be posted could be in a 'simple' representation.
>
> Thanks a lot
>
>
> Kambiz
>