You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@juneau.apache.org by Gary Gregory <ga...@gmail.com> on 2018/02/09 02:11:28 UTC

How to get a class to return standard JSON as the default

Hi All:

I want to return _standard_ JSON (see json.org) when no Accept header is
sent to my @RestResource class. I cannot seem to get that to work no matter
what. I get Juneau's non-standard single quote JSON.

Standard JSON uses double quotes, not single quotes.

If I specify 'application/json' in the Accept, then I do get standard JSON.

I cannot get this to work no matter what I try in my class's
@RestResource's serializer attribute.

I also want to support the normal set of serializers so users can specify
any Accept header value Juneau supports.

Thank you,
Gary

Re: How to get a class to return standard JSON as the default

Posted by James Bognar <ja...@apache.org>.
Apologies for the delay, but I'm still working on testcases for the Config
API changes.  The changes are significant.

Hope to be done with it by this weekend.

On Tue, Feb 20, 2018 at 9:39 PM, James Bognar <ja...@apache.org>
wrote:

> I'm getting close.  I need to write more testcases for the Config API
> changes.
>
> On Tue, Feb 20, 2018 at 4:23 PM, Gary Gregory <ga...@gmail.com>
> wrote:
>
>> On Wed, Feb 14, 2018 at 10:16 AM, Gary Gregory <ga...@gmail.com>
>> wrote:
>>
>>>
>>>
>>> On Wed, Feb 14, 2018 at 7:21 AM, James Bognar <ja...@apache.org>
>>> wrote:
>>>
>>>> Ack....sorry....I never got your reply at 12:33 PM.  I'm not sure what
>>>> happened to your message.  I don't see it in Pony Mail either.
>>>>
>>>> Anyway...
>>>> I'm getting close to a 7.1.0 release.  I'm currently working on
>>>> refactoring the Config API and I have a long weekend coming up.  Hopefully
>>>> next week for 7.1.0?
>>>>
>>>
>> Hi James,
>>
>> Are we on track for this week and a 7.1.0? :-)
>>
>> Thank you!
>> Gary
>>
>>
>>>
>>> Great!
>>>
>>> Thank you,
>>> Gary
>>>
>>>
>>>>
>>>> On Tue, Feb 13, 2018 at 5:31 PM, Gary Gregory <ga...@gmail.com>
>>>> wrote:
>>>>
>>>>> On Sat, Feb 10, 2018 at 12:33 PM, Gary Gregory <garydgregory@gmail.com
>>>>> > wrote:
>>>>>
>>>>>>
>>>>>>
>>>>>> On Sat, Feb 10, 2018 at 12:22 PM, Gary Gregory <
>>>>>> garydgregory@gmail.com> wrote:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Sat, Feb 10, 2018 at 12:03 PM, James Bognar <
>>>>>>> jamesbognar@apache.org> wrote:
>>>>>>>
>>>>>>>> I uploaded a change to 7.1.0-SNAPSHOT that should make this work
>>>>>>>> better.
>>>>>>>>
>>>>>>>> The problem was that given "Accept: */*", the media type
>>>>>>>> "application/json+simple" was considered a slightly better match than
>>>>>>>> "application/json" (i.e. two subtype parts match instead of just one).  So
>>>>>>>> that why the ordering didn't matter.  I've adjusted the algorithm to remove
>>>>>>>> that 'feature'.  :-)
>>>>>>>>
>>>>>>>> You should be able to place JsonSerializer.class at the top of the
>>>>>>>> serializers now and have it match against "*/*".
>>>>>>>>
>>>>>>>> One caveat is I believe if you place JsonSerializer.class at the
>>>>>>>> top of the list, you'll always see JSON rendered on Internet Explorer
>>>>>>>> (unless they've fixed their Accept header in later releases...I no longer
>>>>>>>> have a Windows machine to test against).
>>>>>>>>
>>>>>>>
>>>>>>> Thank you James, I'll give it a whirl and post back here.
>>>>>>>
>>>>>>
>>>>>> OK, with 7.1.0-SNAPSHOT and:
>>>>>>
>>>>>>         serializers={
>>>>>>                 JsonSerializer.class,
>>>>>>                 HtmlDocSerializer.class,
>>>>>>                 HtmlStrippedDocSerializer.class,
>>>>>>                 HtmlSchemaDocSerializer.class,
>>>>>>                 JsonSerializer.Simple.class,
>>>>>>                 JsonSchemaSerializer.class,
>>>>>>                 XmlDocSerializer.class,
>>>>>>                 XmlSchemaDocSerializer.class,
>>>>>>                 UonSerializer.class,
>>>>>>                 UrlEncodingSerializer.class,
>>>>>>                 MsgPackSerializer.class,
>>>>>>                 SoapXmlSerializer.class,
>>>>>>                 PlainTextSerializer.class
>>>>>>         },
>>>>>>
>>>>>> in my @RestResource and Postman sending Accept: */*, I do get the
>>>>>> proper standard JSON response! Nice!
>>>>>>
>>>>>> You know my next question of course ;-) When will 7.1.0 be released
>>>>>> or would this be appropriate to slide in a 7.0.2 release?
>>>>>>
>>>>>
>>>>> Ping?
>>>>>
>>>>> Gary
>>>>>
>>>>>
>>>>>>
>>>>>> Thank you for all your help James!
>>>>>> Gary
>>>>>>
>>>>>>
>>>>>>> Gary
>>>>>>>
>>>>>>>>
>>>>>>>> On Fri, Feb 9, 2018 at 2:21 PM, James Bognar <jamesbognar@gmail.com
>>>>>>>> > wrote:
>>>>>>>>
>>>>>>>>> Yea, unfortunately it's not that simple.  I'm still investigating
>>>>>>>>> though.
>>>>>>>>>
>>>>>>>>> On Fri, Feb 9, 2018 at 2:15 PM, Gary Gregory <
>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>> On Fri, Feb 9, 2018 at 11:06 AM, James Bognar <
>>>>>>>>>> jamesbognar@apache.org> wrote:
>>>>>>>>>>
>>>>>>>>>>> I'll have to look further on how to support that.  It's kind of
>>>>>>>>>>> a can-of-worms.
>>>>>>>>>>>
>>>>>>>>>>> We can't simply go by order of the serializers because
>>>>>>>>>>> HtmlDocSerializer is listed first because some versions of IE do not
>>>>>>>>>>> specify "text/html" in their Accept header.
>>>>>>>>>>>
>>>>>>>>>>> This is the Accept header for Internet Explorer:
>>>>>>>>>>> image/jpeg, application/x-ms-application, image/gif,
>>>>>>>>>>> application/xaml+xml, image/pjpeg, application/x-ms-xbap,
>>>>>>>>>>> application/x-shockwave-flash, application/msword, */*
>>>>>>>>>>>
>>>>>>>>>>> And the heuristics for matching are complex.  For example, the
>>>>>>>>>>> Accept header could contain id properties (e.g.
>>>>>>>>>>> "application/activity+json",
>>>>>>>>>>>
>>>>>>>>>>> https://www.w3.org/TR/activitypub/#retrieving-objects).
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Examples:
>>>>>>>>>>>
>>>>>>>>>>>    - "Accept: application/json" should match "application/json"
>>>>>>>>>>>    before "application/json+simple".
>>>>>>>>>>>    - "Accept: application/json+simple" should match
>>>>>>>>>>>    "application/json+simple" before "application/json".
>>>>>>>>>>>    - "Accept application/json+activity" should match "application/json"
>>>>>>>>>>>    before "application/json+simple".
>>>>>>>>>>>    - "Accept: */json" should match  "application/json" before
>>>>>>>>>>>    "application/json+simple".
>>>>>>>>>>>    - "Accept: application/*" should match ???
>>>>>>>>>>>
>>>>>>>>>>> Well, this is a nasty pickle.
>>>>>>>>>>
>>>>>>>>>> If I add my own "serializers" and put JSON first:
>>>>>>>>>>
>>>>>>>>>>                         serializers={
>>>>>>>>>>                                 JsonSerializer.class,
>>>>>>>>>>                                 JsonSerializer.Simple.class,
>>>>>>>>>>                                 JsonSchemaSerializer.class,
>>>>>>>>>>                                 HtmlDocSerializer.class,
>>>>>>>>>>                                 HtmlStrippedDocSerializer.class,
>>>>>>>>>>                                 HtmlSchemaDocSerializer.class,
>>>>>>>>>>                                 XmlDocSerializer.class,
>>>>>>>>>>                                 XmlSchemaDocSerializer.class,
>>>>>>>>>>                                 UonSerializer.class,
>>>>>>>>>>                                 UrlEncodingSerializer.class,
>>>>>>>>>>                                 MsgPackSerializer.class,
>>>>>>>>>>                                 SoapXmlSerializer.class,
>>>>>>>>>>                                 PlainTextSerializer.class
>>>>>>>>>>                         },
>>>>>>>>>>
>>>>>>>>>> And and let Postman use Accept */*,I still get JSON with single
>>>>>>>>>> quotes. Is there no way to get JSON with double quotes?
>>>>>>>>>>
>>>>>>>>>> Gary
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> On Fri, Feb 9, 2018 at 12:43 PM, Gary Gregory <
>>>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Fri, Feb 9, 2018 at 9:40 AM, James Bognar <
>>>>>>>>>>>> jamesbognar@apache.org> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> Just tried Postman....it too specifies "Accept: */*" as a
>>>>>>>>>>>>> default value.  If you specify Accept as a single space, it appears to work.
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Hi James,
>>>>>>>>>>>>
>>>>>>>>>>>> I think I am getting closer. How do I get "*/*" to map to
>>>>>>>>>>>> "application/json" in @RestResource as opposed the the HTML
>>>>>>>>>>>> table I get now?
>>>>>>>>>>>>
>>>>>>>>>>>> Gary
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>> If you add ?debug=true to your URL, the request will get
>>>>>>>>>>>>> logged to the console so that you can see the actual incoming request:
>>>>>>>>>>>>>
>>>>>>>>>>>>>  [2018.02.09 11:39:22 WARNING]
>>>>>>>>>>>>>
>>>>>>>>>>>>> === HTTP Request (incoming) ==============================
>>>>>>>>>>>>> ======================
>>>>>>>>>>>>>
>>>>>>>>>>>>> HTTP GET /?debug=true
>>>>>>>>>>>>>
>>>>>>>>>>>>> ---Headers---
>>>>>>>>>>>>>
>>>>>>>>>>>>> Cookie: JSESSIONID=node01siuixuu8fdsh1hm4a6dqe3lyg2.node0
>>>>>>>>>>>>>
>>>>>>>>>>>>> Cache-Control: no-cache
>>>>>>>>>>>>>
>>>>>>>>>>>>> Accept: */*
>>>>>>>>>>>>>
>>>>>>>>>>>>> Connection: keep-alive
>>>>>>>>>>>>>
>>>>>>>>>>>>> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)
>>>>>>>>>>>>> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36
>>>>>>>>>>>>>
>>>>>>>>>>>>> Host: localhost:10000
>>>>>>>>>>>>>
>>>>>>>>>>>>> Postman-Token: 2b9124b3-1393-0e96-b052-edac7be1e8dd
>>>>>>>>>>>>>
>>>>>>>>>>>>> Accept-Encoding: gzip, deflate, br
>>>>>>>>>>>>>
>>>>>>>>>>>>> Accept-Language: en-US,en;q=0.9
>>>>>>>>>>>>>
>>>>>>>>>>>>> ---Default Servlet Headers---
>>>>>>>>>>>>>
>>>>>>>>>>>>> accept: application/json
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> === END ==============================
>>>>>>>>>>>>> ==========================================
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Fri, Feb 9, 2018 at 11:25 AM, Gary Gregory <
>>>>>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Fri, Feb 9, 2018 at 7:51 AM, James Bognar <
>>>>>>>>>>>>>> jamesbognar@gmail.com> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Hi Gary,
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Try using a default request header:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> @RestResource(
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> defaultRequestHeaders= {
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> "Accept: application/json"
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> },
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> )
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> I'll take a closer look at how "no" Accept header is
>>>>>>>>>>>>>>> handled.  I think it depends on what tool you're using.  Poster for example
>>>>>>>>>>>>>>> sends "Accept: */*" if you don't specify a value, and that might return a
>>>>>>>>>>>>>>> somewhat-random result.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> That does not work for me sadly. Here a snipet of my service
>>>>>>>>>>>>>> that extends ResourceGroup. I am using Postman 5.5.2. I am
>>>>>>>>>>>>>> getting back an HTML table for my service.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> @RestResource(
>>>>>>>>>>>>>> // @formatter:off
>>>>>>>>>>>>>> path="/",
>>>>>>>>>>>>>> title="Access & Connectivity Agent Microservice",
>>>>>>>>>>>>>> description="Administration",
>>>>>>>>>>>>>>         defaultRequestHeaders= {
>>>>>>>>>>>>>>                 "Accept: application/json"
>>>>>>>>>>>>>> },
>>>>>>>>>>>>>> htmldoc=@HtmlDoc(
>>>>>>>>>>>>>>                 head={
>>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>>> sizes='57x57' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>>> s/apple-icon-57x57.png}'/>",
>>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>>> sizes='60x60' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>>> s/apple-icon-60x60.png}'/>",
>>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>>> sizes='72x72' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>>> s/apple-icon-72x72.png}'/>",
>>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>>> sizes='76x76' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>>> s/apple-icon-76x76.png}'/>",
>>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>>> sizes='114x114' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>>> s/apple-icon-114x114.png}'/>",
>>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>>> sizes='120x120' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>>> s/apple-icon-120x120.png}'/>",
>>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>>> sizes='144x144' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>>> s/apple-icon-144x144.png}'/>",
>>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>>> sizes='152x152' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>>> s/apple-icon-152x152.png}'/>",
>>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>>> sizes='180x180' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>>> s/apple-icon-180x180.png}'/>",
>>>>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>>>>> sizes='192x192'  href='$U{servlet:/htdocs/image
>>>>>>>>>>>>>> s/android-icon-192x192.png}'/>",
>>>>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>>>>> sizes='32x32' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>>> s/favicon-32x32.png}'/>",
>>>>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>>>>> sizes='96x96' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>>> s/favicon-96x96.png}'/>",
>>>>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>>>>> sizes='16x16' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>>> s/favicon-16x16.png}'/>",
>>>>>>>>>>>>>>                         "<link rel='manifest'
>>>>>>>>>>>>>> href='$U{servlet:/htdocs/images/manifest.json}'/>",
>>>>>>>>>>>>>>                         "<meta name='msapplication-TileColor'
>>>>>>>>>>>>>> content='#ffffff'/>",
>>>>>>>>>>>>>>                         "<meta name='msapplication-TileImage'
>>>>>>>>>>>>>> content='$U{servlet:/htdocs/images/ms-icon-144x144.png}'/>",
>>>>>>>>>>>>>>                         "<meta name='theme-color'
>>>>>>>>>>>>>> content='#ffffff'/>"
>>>>>>>>>>>>>>                 },
>>>>>>>>>>>>>>                 header={
>>>>>>>>>>>>>>                 "<h1>$R{servletTitle}</h1>",
>>>>>>>>>>>>>>                 "<h2>$R{methodSummary,$R{servl
>>>>>>>>>>>>>> etDescription}}</h2>",
>>>>>>>>>>>>>>                 "<a href='https://www.rocketsoftware.com'><img
>>>>>>>>>>>>>> src='$U{servlet:/htdocs/images/ram.png}'
>>>>>>>>>>>>>> style='position:absolute;top:5;right:5;background-color:tran
>>>>>>>>>>>>>> sparent;height:30px'/></a>"
>>>>>>>>>>>>>>         },
>>>>>>>>>>>>>> widgets={
>>>>>>>>>>>>>> ContentTypeMenuItem.class,
>>>>>>>>>>>>>> StyleMenuItem.class,
>>>>>>>>>>>>>> },
>>>>>>>>>>>>>> navlinks={
>>>>>>>>>>>>>> "options: servlet:/?method=OPTIONS",
>>>>>>>>>>>>>>         "$W{ContentTypeMenuItem}"
>>>>>>>>>>>>>> }
>>>>>>>>>>>>>> ),
>>>>>>>>>>>>>> children={
>>>>>>>>>>>>>> ConfigResource.class,
>>>>>>>>>>>>>> LogsResource.class
>>>>>>>>>>>>>> }
>>>>>>>>>>>>>> // @formatter:on
>>>>>>>>>>>>>> )
>>>>>>>>>>>>>> public class AdminRootResources extends ResourceGroup {
>>>>>>>>>>>>>> ...
>>>>>>>>>>>>>>     @RestMethod(name = GET, path = PATH_STATUS, summary =
>>>>>>>>>>>>>> "Status", description = "Gets status for the running system.")
>>>>>>>>>>>>>>     public Map<String, Object> getStatus() {
>>>>>>>>>>>>>> ...
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thank you,
>>>>>>>>>>>>>> Gary
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <
>>>>>>>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Hi All:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> I want to return _standard_ JSON (see json.org) when no
>>>>>>>>>>>>>>>> Accept header is sent to my @RestResource class. I cannot seem to get that
>>>>>>>>>>>>>>>> to work no matter what. I get Juneau's non-standard single quote JSON.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Standard JSON uses double quotes, not single quotes.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> If I specify 'application/json' in the Accept, then I do
>>>>>>>>>>>>>>>> get standard JSON.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> I cannot get this to work no matter what I try in my
>>>>>>>>>>>>>>>> class's @RestResource's serializer attribute.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> I also want to support the normal set of serializers so
>>>>>>>>>>>>>>>> users can specify any Accept header value Juneau supports.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thank you,
>>>>>>>>>>>>>>>> Gary
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Re: How to get a class to return standard JSON as the default

Posted by James Bognar <ja...@apache.org>.
I'm getting close.  I need to write more testcases for the Config API
changes.

On Tue, Feb 20, 2018 at 4:23 PM, Gary Gregory <ga...@gmail.com>
wrote:

> On Wed, Feb 14, 2018 at 10:16 AM, Gary Gregory <ga...@gmail.com>
> wrote:
>
>>
>>
>> On Wed, Feb 14, 2018 at 7:21 AM, James Bognar <ja...@apache.org>
>> wrote:
>>
>>> Ack....sorry....I never got your reply at 12:33 PM.  I'm not sure what
>>> happened to your message.  I don't see it in Pony Mail either.
>>>
>>> Anyway...
>>> I'm getting close to a 7.1.0 release.  I'm currently working on
>>> refactoring the Config API and I have a long weekend coming up.  Hopefully
>>> next week for 7.1.0?
>>>
>>
> Hi James,
>
> Are we on track for this week and a 7.1.0? :-)
>
> Thank you!
> Gary
>
>
>>
>> Great!
>>
>> Thank you,
>> Gary
>>
>>
>>>
>>> On Tue, Feb 13, 2018 at 5:31 PM, Gary Gregory <ga...@gmail.com>
>>> wrote:
>>>
>>>> On Sat, Feb 10, 2018 at 12:33 PM, Gary Gregory <ga...@gmail.com>
>>>> wrote:
>>>>
>>>>>
>>>>>
>>>>> On Sat, Feb 10, 2018 at 12:22 PM, Gary Gregory <garydgregory@gmail.com
>>>>> > wrote:
>>>>>
>>>>>>
>>>>>>
>>>>>> On Sat, Feb 10, 2018 at 12:03 PM, James Bognar <
>>>>>> jamesbognar@apache.org> wrote:
>>>>>>
>>>>>>> I uploaded a change to 7.1.0-SNAPSHOT that should make this work
>>>>>>> better.
>>>>>>>
>>>>>>> The problem was that given "Accept: */*", the media type
>>>>>>> "application/json+simple" was considered a slightly better match than
>>>>>>> "application/json" (i.e. two subtype parts match instead of just one).  So
>>>>>>> that why the ordering didn't matter.  I've adjusted the algorithm to remove
>>>>>>> that 'feature'.  :-)
>>>>>>>
>>>>>>> You should be able to place JsonSerializer.class at the top of the
>>>>>>> serializers now and have it match against "*/*".
>>>>>>>
>>>>>>> One caveat is I believe if you place JsonSerializer.class at the top
>>>>>>> of the list, you'll always see JSON rendered on Internet Explorer (unless
>>>>>>> they've fixed their Accept header in later releases...I no longer have a
>>>>>>> Windows machine to test against).
>>>>>>>
>>>>>>
>>>>>> Thank you James, I'll give it a whirl and post back here.
>>>>>>
>>>>>
>>>>> OK, with 7.1.0-SNAPSHOT and:
>>>>>
>>>>>         serializers={
>>>>>                 JsonSerializer.class,
>>>>>                 HtmlDocSerializer.class,
>>>>>                 HtmlStrippedDocSerializer.class,
>>>>>                 HtmlSchemaDocSerializer.class,
>>>>>                 JsonSerializer.Simple.class,
>>>>>                 JsonSchemaSerializer.class,
>>>>>                 XmlDocSerializer.class,
>>>>>                 XmlSchemaDocSerializer.class,
>>>>>                 UonSerializer.class,
>>>>>                 UrlEncodingSerializer.class,
>>>>>                 MsgPackSerializer.class,
>>>>>                 SoapXmlSerializer.class,
>>>>>                 PlainTextSerializer.class
>>>>>         },
>>>>>
>>>>> in my @RestResource and Postman sending Accept: */*, I do get the
>>>>> proper standard JSON response! Nice!
>>>>>
>>>>> You know my next question of course ;-) When will 7.1.0 be released or
>>>>> would this be appropriate to slide in a 7.0.2 release?
>>>>>
>>>>
>>>> Ping?
>>>>
>>>> Gary
>>>>
>>>>
>>>>>
>>>>> Thank you for all your help James!
>>>>> Gary
>>>>>
>>>>>
>>>>>> Gary
>>>>>>
>>>>>>>
>>>>>>> On Fri, Feb 9, 2018 at 2:21 PM, James Bognar <ja...@gmail.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Yea, unfortunately it's not that simple.  I'm still investigating
>>>>>>>> though.
>>>>>>>>
>>>>>>>> On Fri, Feb 9, 2018 at 2:15 PM, Gary Gregory <
>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>
>>>>>>>>> On Fri, Feb 9, 2018 at 11:06 AM, James Bognar <
>>>>>>>>> jamesbognar@apache.org> wrote:
>>>>>>>>>
>>>>>>>>>> I'll have to look further on how to support that.  It's kind of a
>>>>>>>>>> can-of-worms.
>>>>>>>>>>
>>>>>>>>>> We can't simply go by order of the serializers because
>>>>>>>>>> HtmlDocSerializer is listed first because some versions of IE do not
>>>>>>>>>> specify "text/html" in their Accept header.
>>>>>>>>>>
>>>>>>>>>> This is the Accept header for Internet Explorer:
>>>>>>>>>> image/jpeg, application/x-ms-application, image/gif,
>>>>>>>>>> application/xaml+xml, image/pjpeg, application/x-ms-xbap,
>>>>>>>>>> application/x-shockwave-flash, application/msword, */*
>>>>>>>>>>
>>>>>>>>>> And the heuristics for matching are complex.  For example, the
>>>>>>>>>> Accept header could contain id properties (e.g.
>>>>>>>>>> "application/activity+json",
>>>>>>>>>>
>>>>>>>>>> https://www.w3.org/TR/activitypub/#retrieving-objects).
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Examples:
>>>>>>>>>>
>>>>>>>>>>    - "Accept: application/json" should match "application/json"
>>>>>>>>>>    before "application/json+simple".
>>>>>>>>>>    - "Accept: application/json+simple" should match
>>>>>>>>>>    "application/json+simple" before "application/json".
>>>>>>>>>>    - "Accept application/json+activity" should match "application/json"
>>>>>>>>>>    before "application/json+simple".
>>>>>>>>>>    - "Accept: */json" should match  "application/json" before
>>>>>>>>>>    "application/json+simple".
>>>>>>>>>>    - "Accept: application/*" should match ???
>>>>>>>>>>
>>>>>>>>>> Well, this is a nasty pickle.
>>>>>>>>>
>>>>>>>>> If I add my own "serializers" and put JSON first:
>>>>>>>>>
>>>>>>>>>                         serializers={
>>>>>>>>>                                 JsonSerializer.class,
>>>>>>>>>                                 JsonSerializer.Simple.class,
>>>>>>>>>                                 JsonSchemaSerializer.class,
>>>>>>>>>                                 HtmlDocSerializer.class,
>>>>>>>>>                                 HtmlStrippedDocSerializer.class,
>>>>>>>>>                                 HtmlSchemaDocSerializer.class,
>>>>>>>>>                                 XmlDocSerializer.class,
>>>>>>>>>                                 XmlSchemaDocSerializer.class,
>>>>>>>>>                                 UonSerializer.class,
>>>>>>>>>                                 UrlEncodingSerializer.class,
>>>>>>>>>                                 MsgPackSerializer.class,
>>>>>>>>>                                 SoapXmlSerializer.class,
>>>>>>>>>                                 PlainTextSerializer.class
>>>>>>>>>                         },
>>>>>>>>>
>>>>>>>>> And and let Postman use Accept */*,I still get JSON with single
>>>>>>>>> quotes. Is there no way to get JSON with double quotes?
>>>>>>>>>
>>>>>>>>> Gary
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> On Fri, Feb 9, 2018 at 12:43 PM, Gary Gregory <
>>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Fri, Feb 9, 2018 at 9:40 AM, James Bognar <
>>>>>>>>>>> jamesbognar@apache.org> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Just tried Postman....it too specifies "Accept: */*" as a
>>>>>>>>>>>> default value.  If you specify Accept as a single space, it appears to work.
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Hi James,
>>>>>>>>>>>
>>>>>>>>>>> I think I am getting closer. How do I get "*/*" to map to
>>>>>>>>>>> "application/json" in @RestResource as opposed the the HTML
>>>>>>>>>>> table I get now?
>>>>>>>>>>>
>>>>>>>>>>> Gary
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>> If you add ?debug=true to your URL, the request will get logged
>>>>>>>>>>>> to the console so that you can see the actual incoming request:
>>>>>>>>>>>>
>>>>>>>>>>>>  [2018.02.09 11:39:22 WARNING]
>>>>>>>>>>>>
>>>>>>>>>>>> === HTTP Request (incoming) ==============================
>>>>>>>>>>>> ======================
>>>>>>>>>>>>
>>>>>>>>>>>> HTTP GET /?debug=true
>>>>>>>>>>>>
>>>>>>>>>>>> ---Headers---
>>>>>>>>>>>>
>>>>>>>>>>>> Cookie: JSESSIONID=node01siuixuu8fdsh1hm4a6dqe3lyg2.node0
>>>>>>>>>>>>
>>>>>>>>>>>> Cache-Control: no-cache
>>>>>>>>>>>>
>>>>>>>>>>>> Accept: */*
>>>>>>>>>>>>
>>>>>>>>>>>> Connection: keep-alive
>>>>>>>>>>>>
>>>>>>>>>>>> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)
>>>>>>>>>>>> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36
>>>>>>>>>>>>
>>>>>>>>>>>> Host: localhost:10000
>>>>>>>>>>>>
>>>>>>>>>>>> Postman-Token: 2b9124b3-1393-0e96-b052-edac7be1e8dd
>>>>>>>>>>>>
>>>>>>>>>>>> Accept-Encoding: gzip, deflate, br
>>>>>>>>>>>>
>>>>>>>>>>>> Accept-Language: en-US,en;q=0.9
>>>>>>>>>>>>
>>>>>>>>>>>> ---Default Servlet Headers---
>>>>>>>>>>>>
>>>>>>>>>>>> accept: application/json
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> === END ==============================
>>>>>>>>>>>> ==========================================
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Fri, Feb 9, 2018 at 11:25 AM, Gary Gregory <
>>>>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> On Fri, Feb 9, 2018 at 7:51 AM, James Bognar <
>>>>>>>>>>>>> jamesbognar@gmail.com> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hi Gary,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Try using a default request header:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> @RestResource(
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> defaultRequestHeaders= {
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> "Accept: application/json"
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> },
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> )
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I'll take a closer look at how "no" Accept header is
>>>>>>>>>>>>>> handled.  I think it depends on what tool you're using.  Poster for example
>>>>>>>>>>>>>> sends "Accept: */*" if you don't specify a value, and that might return a
>>>>>>>>>>>>>> somewhat-random result.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> That does not work for me sadly. Here a snipet of my service
>>>>>>>>>>>>> that extends ResourceGroup. I am using Postman 5.5.2. I am
>>>>>>>>>>>>> getting back an HTML table for my service.
>>>>>>>>>>>>>
>>>>>>>>>>>>> @RestResource(
>>>>>>>>>>>>> // @formatter:off
>>>>>>>>>>>>> path="/",
>>>>>>>>>>>>> title="Access & Connectivity Agent Microservice",
>>>>>>>>>>>>> description="Administration",
>>>>>>>>>>>>>         defaultRequestHeaders= {
>>>>>>>>>>>>>                 "Accept: application/json"
>>>>>>>>>>>>> },
>>>>>>>>>>>>> htmldoc=@HtmlDoc(
>>>>>>>>>>>>>                 head={
>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>> sizes='57x57' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>> s/apple-icon-57x57.png}'/>",
>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>> sizes='60x60' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>> s/apple-icon-60x60.png}'/>",
>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>> sizes='72x72' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>> s/apple-icon-72x72.png}'/>",
>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>> sizes='76x76' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>> s/apple-icon-76x76.png}'/>",
>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>> sizes='114x114' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>> s/apple-icon-114x114.png}'/>",
>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>> sizes='120x120' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>> s/apple-icon-120x120.png}'/>",
>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>> sizes='144x144' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>> s/apple-icon-144x144.png}'/>",
>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>> sizes='152x152' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>> s/apple-icon-152x152.png}'/>",
>>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>>> sizes='180x180' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>> s/apple-icon-180x180.png}'/>",
>>>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>>>> sizes='192x192'  href='$U{servlet:/htdocs/image
>>>>>>>>>>>>> s/android-icon-192x192.png}'/>",
>>>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>>>> sizes='32x32' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>> s/favicon-32x32.png}'/>",
>>>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>>>> sizes='96x96' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>> s/favicon-96x96.png}'/>",
>>>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>>>> sizes='16x16' href='$U{servlet:/htdocs/image
>>>>>>>>>>>>> s/favicon-16x16.png}'/>",
>>>>>>>>>>>>>                         "<link rel='manifest'
>>>>>>>>>>>>> href='$U{servlet:/htdocs/images/manifest.json}'/>",
>>>>>>>>>>>>>                         "<meta name='msapplication-TileColor'
>>>>>>>>>>>>> content='#ffffff'/>",
>>>>>>>>>>>>>                         "<meta name='msapplication-TileImage'
>>>>>>>>>>>>> content='$U{servlet:/htdocs/images/ms-icon-144x144.png}'/>",
>>>>>>>>>>>>>                         "<meta name='theme-color'
>>>>>>>>>>>>> content='#ffffff'/>"
>>>>>>>>>>>>>                 },
>>>>>>>>>>>>>                 header={
>>>>>>>>>>>>>                 "<h1>$R{servletTitle}</h1>",
>>>>>>>>>>>>>                 "<h2>$R{methodSummary,$R{servl
>>>>>>>>>>>>> etDescription}}</h2>",
>>>>>>>>>>>>>                 "<a href='https://www.rocketsoftware.com'><img
>>>>>>>>>>>>> src='$U{servlet:/htdocs/images/ram.png}'
>>>>>>>>>>>>> style='position:absolute;top:5;right:5;background-color:tran
>>>>>>>>>>>>> sparent;height:30px'/></a>"
>>>>>>>>>>>>>         },
>>>>>>>>>>>>> widgets={
>>>>>>>>>>>>> ContentTypeMenuItem.class,
>>>>>>>>>>>>> StyleMenuItem.class,
>>>>>>>>>>>>> },
>>>>>>>>>>>>> navlinks={
>>>>>>>>>>>>> "options: servlet:/?method=OPTIONS",
>>>>>>>>>>>>>         "$W{ContentTypeMenuItem}"
>>>>>>>>>>>>> }
>>>>>>>>>>>>> ),
>>>>>>>>>>>>> children={
>>>>>>>>>>>>> ConfigResource.class,
>>>>>>>>>>>>> LogsResource.class
>>>>>>>>>>>>> }
>>>>>>>>>>>>> // @formatter:on
>>>>>>>>>>>>> )
>>>>>>>>>>>>> public class AdminRootResources extends ResourceGroup {
>>>>>>>>>>>>> ...
>>>>>>>>>>>>>     @RestMethod(name = GET, path = PATH_STATUS, summary =
>>>>>>>>>>>>> "Status", description = "Gets status for the running system.")
>>>>>>>>>>>>>     public Map<String, Object> getStatus() {
>>>>>>>>>>>>> ...
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thank you,
>>>>>>>>>>>>> Gary
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <
>>>>>>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Hi All:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> I want to return _standard_ JSON (see json.org) when no
>>>>>>>>>>>>>>> Accept header is sent to my @RestResource class. I cannot seem to get that
>>>>>>>>>>>>>>> to work no matter what. I get Juneau's non-standard single quote JSON.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Standard JSON uses double quotes, not single quotes.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> If I specify 'application/json' in the Accept, then I do get
>>>>>>>>>>>>>>> standard JSON.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> I cannot get this to work no matter what I try in my class's
>>>>>>>>>>>>>>> @RestResource's serializer attribute.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> I also want to support the normal set of serializers so
>>>>>>>>>>>>>>> users can specify any Accept header value Juneau supports.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Thank you,
>>>>>>>>>>>>>>> Gary
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Re: How to get a class to return standard JSON as the default

Posted by Gary Gregory <ga...@gmail.com>.
On Wed, Feb 14, 2018 at 10:16 AM, Gary Gregory <ga...@gmail.com>
wrote:

>
>
> On Wed, Feb 14, 2018 at 7:21 AM, James Bognar <ja...@apache.org>
> wrote:
>
>> Ack....sorry....I never got your reply at 12:33 PM.  I'm not sure what
>> happened to your message.  I don't see it in Pony Mail either.
>>
>> Anyway...
>> I'm getting close to a 7.1.0 release.  I'm currently working on
>> refactoring the Config API and I have a long weekend coming up.  Hopefully
>> next week for 7.1.0?
>>
>
Hi James,

Are we on track for this week and a 7.1.0? :-)

Thank you!
Gary


>
> Great!
>
> Thank you,
> Gary
>
>
>>
>> On Tue, Feb 13, 2018 at 5:31 PM, Gary Gregory <ga...@gmail.com>
>> wrote:
>>
>>> On Sat, Feb 10, 2018 at 12:33 PM, Gary Gregory <ga...@gmail.com>
>>> wrote:
>>>
>>>>
>>>>
>>>> On Sat, Feb 10, 2018 at 12:22 PM, Gary Gregory <ga...@gmail.com>
>>>> wrote:
>>>>
>>>>>
>>>>>
>>>>> On Sat, Feb 10, 2018 at 12:03 PM, James Bognar <jamesbognar@apache.org
>>>>> > wrote:
>>>>>
>>>>>> I uploaded a change to 7.1.0-SNAPSHOT that should make this work
>>>>>> better.
>>>>>>
>>>>>> The problem was that given "Accept: */*", the media type
>>>>>> "application/json+simple" was considered a slightly better match than
>>>>>> "application/json" (i.e. two subtype parts match instead of just one).  So
>>>>>> that why the ordering didn't matter.  I've adjusted the algorithm to remove
>>>>>> that 'feature'.  :-)
>>>>>>
>>>>>> You should be able to place JsonSerializer.class at the top of the
>>>>>> serializers now and have it match against "*/*".
>>>>>>
>>>>>> One caveat is I believe if you place JsonSerializer.class at the top
>>>>>> of the list, you'll always see JSON rendered on Internet Explorer (unless
>>>>>> they've fixed their Accept header in later releases...I no longer have a
>>>>>> Windows machine to test against).
>>>>>>
>>>>>
>>>>> Thank you James, I'll give it a whirl and post back here.
>>>>>
>>>>
>>>> OK, with 7.1.0-SNAPSHOT and:
>>>>
>>>>         serializers={
>>>>                 JsonSerializer.class,
>>>>                 HtmlDocSerializer.class,
>>>>                 HtmlStrippedDocSerializer.class,
>>>>                 HtmlSchemaDocSerializer.class,
>>>>                 JsonSerializer.Simple.class,
>>>>                 JsonSchemaSerializer.class,
>>>>                 XmlDocSerializer.class,
>>>>                 XmlSchemaDocSerializer.class,
>>>>                 UonSerializer.class,
>>>>                 UrlEncodingSerializer.class,
>>>>                 MsgPackSerializer.class,
>>>>                 SoapXmlSerializer.class,
>>>>                 PlainTextSerializer.class
>>>>         },
>>>>
>>>> in my @RestResource and Postman sending Accept: */*, I do get the
>>>> proper standard JSON response! Nice!
>>>>
>>>> You know my next question of course ;-) When will 7.1.0 be released or
>>>> would this be appropriate to slide in a 7.0.2 release?
>>>>
>>>
>>> Ping?
>>>
>>> Gary
>>>
>>>
>>>>
>>>> Thank you for all your help James!
>>>> Gary
>>>>
>>>>
>>>>> Gary
>>>>>
>>>>>>
>>>>>> On Fri, Feb 9, 2018 at 2:21 PM, James Bognar <ja...@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Yea, unfortunately it's not that simple.  I'm still investigating
>>>>>>> though.
>>>>>>>
>>>>>>> On Fri, Feb 9, 2018 at 2:15 PM, Gary Gregory <garydgregory@gmail.com
>>>>>>> > wrote:
>>>>>>>
>>>>>>>> On Fri, Feb 9, 2018 at 11:06 AM, James Bognar <
>>>>>>>> jamesbognar@apache.org> wrote:
>>>>>>>>
>>>>>>>>> I'll have to look further on how to support that.  It's kind of a
>>>>>>>>> can-of-worms.
>>>>>>>>>
>>>>>>>>> We can't simply go by order of the serializers because
>>>>>>>>> HtmlDocSerializer is listed first because some versions of IE do not
>>>>>>>>> specify "text/html" in their Accept header.
>>>>>>>>>
>>>>>>>>> This is the Accept header for Internet Explorer:
>>>>>>>>> image/jpeg, application/x-ms-application, image/gif,
>>>>>>>>> application/xaml+xml, image/pjpeg, application/x-ms-xbap,
>>>>>>>>> application/x-shockwave-flash, application/msword, */*
>>>>>>>>>
>>>>>>>>> And the heuristics for matching are complex.  For example, the
>>>>>>>>> Accept header could contain id properties (e.g.
>>>>>>>>> "application/activity+json",
>>>>>>>>>
>>>>>>>>> https://www.w3.org/TR/activitypub/#retrieving-objects).
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Examples:
>>>>>>>>>
>>>>>>>>>    - "Accept: application/json" should match "application/json"
>>>>>>>>>    before "application/json+simple".
>>>>>>>>>    - "Accept: application/json+simple" should match
>>>>>>>>>    "application/json+simple" before "application/json".
>>>>>>>>>    - "Accept application/json+activity" should match "application/json"
>>>>>>>>>    before "application/json+simple".
>>>>>>>>>    - "Accept: */json" should match  "application/json" before
>>>>>>>>>    "application/json+simple".
>>>>>>>>>    - "Accept: application/*" should match ???
>>>>>>>>>
>>>>>>>>> Well, this is a nasty pickle.
>>>>>>>>
>>>>>>>> If I add my own "serializers" and put JSON first:
>>>>>>>>
>>>>>>>>                         serializers={
>>>>>>>>                                 JsonSerializer.class,
>>>>>>>>                                 JsonSerializer.Simple.class,
>>>>>>>>                                 JsonSchemaSerializer.class,
>>>>>>>>                                 HtmlDocSerializer.class,
>>>>>>>>                                 HtmlStrippedDocSerializer.class,
>>>>>>>>                                 HtmlSchemaDocSerializer.class,
>>>>>>>>                                 XmlDocSerializer.class,
>>>>>>>>                                 XmlSchemaDocSerializer.class,
>>>>>>>>                                 UonSerializer.class,
>>>>>>>>                                 UrlEncodingSerializer.class,
>>>>>>>>                                 MsgPackSerializer.class,
>>>>>>>>                                 SoapXmlSerializer.class,
>>>>>>>>                                 PlainTextSerializer.class
>>>>>>>>                         },
>>>>>>>>
>>>>>>>> And and let Postman use Accept */*,I still get JSON with single
>>>>>>>> quotes. Is there no way to get JSON with double quotes?
>>>>>>>>
>>>>>>>> Gary
>>>>>>>>
>>>>>>>>
>>>>>>>>> On Fri, Feb 9, 2018 at 12:43 PM, Gary Gregory <
>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Fri, Feb 9, 2018 at 9:40 AM, James Bognar <
>>>>>>>>>> jamesbognar@apache.org> wrote:
>>>>>>>>>>
>>>>>>>>>>> Just tried Postman....it too specifies "Accept: */*" as a
>>>>>>>>>>> default value.  If you specify Accept as a single space, it appears to work.
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Hi James,
>>>>>>>>>>
>>>>>>>>>> I think I am getting closer. How do I get "*/*" to map to
>>>>>>>>>> "application/json" in @RestResource as opposed the the HTML
>>>>>>>>>> table I get now?
>>>>>>>>>>
>>>>>>>>>> Gary
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> If you add ?debug=true to your URL, the request will get logged
>>>>>>>>>>> to the console so that you can see the actual incoming request:
>>>>>>>>>>>
>>>>>>>>>>>  [2018.02.09 11:39:22 WARNING]
>>>>>>>>>>>
>>>>>>>>>>> === HTTP Request (incoming) ==============================
>>>>>>>>>>> ======================
>>>>>>>>>>>
>>>>>>>>>>> HTTP GET /?debug=true
>>>>>>>>>>>
>>>>>>>>>>> ---Headers---
>>>>>>>>>>>
>>>>>>>>>>> Cookie: JSESSIONID=node01siuixuu8fdsh1hm4a6dqe3lyg2.node0
>>>>>>>>>>>
>>>>>>>>>>> Cache-Control: no-cache
>>>>>>>>>>>
>>>>>>>>>>> Accept: */*
>>>>>>>>>>>
>>>>>>>>>>> Connection: keep-alive
>>>>>>>>>>>
>>>>>>>>>>> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)
>>>>>>>>>>> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36
>>>>>>>>>>>
>>>>>>>>>>> Host: localhost:10000
>>>>>>>>>>>
>>>>>>>>>>> Postman-Token: 2b9124b3-1393-0e96-b052-edac7be1e8dd
>>>>>>>>>>>
>>>>>>>>>>> Accept-Encoding: gzip, deflate, br
>>>>>>>>>>>
>>>>>>>>>>> Accept-Language: en-US,en;q=0.9
>>>>>>>>>>>
>>>>>>>>>>> ---Default Servlet Headers---
>>>>>>>>>>>
>>>>>>>>>>> accept: application/json
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> === END ==============================
>>>>>>>>>>> ==========================================
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Fri, Feb 9, 2018 at 11:25 AM, Gary Gregory <
>>>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> On Fri, Feb 9, 2018 at 7:51 AM, James Bognar <
>>>>>>>>>>>> jamesbognar@gmail.com> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> Hi Gary,
>>>>>>>>>>>>>
>>>>>>>>>>>>> Try using a default request header:
>>>>>>>>>>>>>
>>>>>>>>>>>>> @RestResource(
>>>>>>>>>>>>>
>>>>>>>>>>>>> defaultRequestHeaders= {
>>>>>>>>>>>>>
>>>>>>>>>>>>> "Accept: application/json"
>>>>>>>>>>>>>
>>>>>>>>>>>>> },
>>>>>>>>>>>>>
>>>>>>>>>>>>> )
>>>>>>>>>>>>>
>>>>>>>>>>>>> I'll take a closer look at how "no" Accept header is handled.
>>>>>>>>>>>>> I think it depends on what tool you're using.  Poster for example sends
>>>>>>>>>>>>> "Accept: */*" if you don't specify a value, and that might return a
>>>>>>>>>>>>> somewhat-random result.
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> That does not work for me sadly. Here a snipet of my service
>>>>>>>>>>>> that extends ResourceGroup. I am using Postman 5.5.2. I am
>>>>>>>>>>>> getting back an HTML table for my service.
>>>>>>>>>>>>
>>>>>>>>>>>> @RestResource(
>>>>>>>>>>>> // @formatter:off
>>>>>>>>>>>> path="/",
>>>>>>>>>>>> title="Access & Connectivity Agent Microservice",
>>>>>>>>>>>> description="Administration",
>>>>>>>>>>>>         defaultRequestHeaders= {
>>>>>>>>>>>>                 "Accept: application/json"
>>>>>>>>>>>> },
>>>>>>>>>>>> htmldoc=@HtmlDoc(
>>>>>>>>>>>>                 head={
>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>> sizes='57x57' href='$U{servlet:/htdocs/image
>>>>>>>>>>>> s/apple-icon-57x57.png}'/>",
>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>> sizes='60x60' href='$U{servlet:/htdocs/image
>>>>>>>>>>>> s/apple-icon-60x60.png}'/>",
>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>> sizes='72x72' href='$U{servlet:/htdocs/image
>>>>>>>>>>>> s/apple-icon-72x72.png}'/>",
>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>> sizes='76x76' href='$U{servlet:/htdocs/image
>>>>>>>>>>>> s/apple-icon-76x76.png}'/>",
>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>> sizes='114x114' href='$U{servlet:/htdocs/image
>>>>>>>>>>>> s/apple-icon-114x114.png}'/>",
>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>> sizes='120x120' href='$U{servlet:/htdocs/image
>>>>>>>>>>>> s/apple-icon-120x120.png}'/>",
>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>> sizes='144x144' href='$U{servlet:/htdocs/image
>>>>>>>>>>>> s/apple-icon-144x144.png}'/>",
>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>> sizes='152x152' href='$U{servlet:/htdocs/image
>>>>>>>>>>>> s/apple-icon-152x152.png}'/>",
>>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>>> sizes='180x180' href='$U{servlet:/htdocs/image
>>>>>>>>>>>> s/apple-icon-180x180.png}'/>",
>>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>>> sizes='192x192'  href='$U{servlet:/htdocs/image
>>>>>>>>>>>> s/android-icon-192x192.png}'/>",
>>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>>> sizes='32x32' href='$U{servlet:/htdocs/image
>>>>>>>>>>>> s/favicon-32x32.png}'/>",
>>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>>> sizes='96x96' href='$U{servlet:/htdocs/image
>>>>>>>>>>>> s/favicon-96x96.png}'/>",
>>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>>> sizes='16x16' href='$U{servlet:/htdocs/image
>>>>>>>>>>>> s/favicon-16x16.png}'/>",
>>>>>>>>>>>>                         "<link rel='manifest'
>>>>>>>>>>>> href='$U{servlet:/htdocs/images/manifest.json}'/>",
>>>>>>>>>>>>                         "<meta name='msapplication-TileColor'
>>>>>>>>>>>> content='#ffffff'/>",
>>>>>>>>>>>>                         "<meta name='msapplication-TileImage'
>>>>>>>>>>>> content='$U{servlet:/htdocs/images/ms-icon-144x144.png}'/>",
>>>>>>>>>>>>                         "<meta name='theme-color'
>>>>>>>>>>>> content='#ffffff'/>"
>>>>>>>>>>>>                 },
>>>>>>>>>>>>                 header={
>>>>>>>>>>>>                 "<h1>$R{servletTitle}</h1>",
>>>>>>>>>>>>                 "<h2>$R{methodSummary,$R{servl
>>>>>>>>>>>> etDescription}}</h2>",
>>>>>>>>>>>>                 "<a href='https://www.rocketsoftware.com'><img
>>>>>>>>>>>> src='$U{servlet:/htdocs/images/ram.png}'
>>>>>>>>>>>> style='position:absolute;top:5;right:5;background-color:tran
>>>>>>>>>>>> sparent;height:30px'/></a>"
>>>>>>>>>>>>         },
>>>>>>>>>>>> widgets={
>>>>>>>>>>>> ContentTypeMenuItem.class,
>>>>>>>>>>>> StyleMenuItem.class,
>>>>>>>>>>>> },
>>>>>>>>>>>> navlinks={
>>>>>>>>>>>> "options: servlet:/?method=OPTIONS",
>>>>>>>>>>>>         "$W{ContentTypeMenuItem}"
>>>>>>>>>>>> }
>>>>>>>>>>>> ),
>>>>>>>>>>>> children={
>>>>>>>>>>>> ConfigResource.class,
>>>>>>>>>>>> LogsResource.class
>>>>>>>>>>>> }
>>>>>>>>>>>> // @formatter:on
>>>>>>>>>>>> )
>>>>>>>>>>>> public class AdminRootResources extends ResourceGroup {
>>>>>>>>>>>> ...
>>>>>>>>>>>>     @RestMethod(name = GET, path = PATH_STATUS, summary =
>>>>>>>>>>>> "Status", description = "Gets status for the running system.")
>>>>>>>>>>>>     public Map<String, Object> getStatus() {
>>>>>>>>>>>> ...
>>>>>>>>>>>>
>>>>>>>>>>>> Thank you,
>>>>>>>>>>>> Gary
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <
>>>>>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hi All:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I want to return _standard_ JSON (see json.org) when no
>>>>>>>>>>>>>> Accept header is sent to my @RestResource class. I cannot seem to get that
>>>>>>>>>>>>>> to work no matter what. I get Juneau's non-standard single quote JSON.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Standard JSON uses double quotes, not single quotes.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> If I specify 'application/json' in the Accept, then I do get
>>>>>>>>>>>>>> standard JSON.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I cannot get this to work no matter what I try in my class's
>>>>>>>>>>>>>> @RestResource's serializer attribute.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I also want to support the normal set of serializers so users
>>>>>>>>>>>>>> can specify any Accept header value Juneau supports.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thank you,
>>>>>>>>>>>>>> Gary
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Re: How to get a class to return standard JSON as the default

Posted by Gary Gregory <ga...@gmail.com>.
On Wed, Feb 14, 2018 at 7:21 AM, James Bognar <ja...@apache.org>
wrote:

> Ack....sorry....I never got your reply at 12:33 PM.  I'm not sure what
> happened to your message.  I don't see it in Pony Mail either.
>
> Anyway...
> I'm getting close to a 7.1.0 release.  I'm currently working on
> refactoring the Config API and I have a long weekend coming up.  Hopefully
> next week for 7.1.0?
>

Great!

Thank you,
Gary


>
> On Tue, Feb 13, 2018 at 5:31 PM, Gary Gregory <ga...@gmail.com>
> wrote:
>
>> On Sat, Feb 10, 2018 at 12:33 PM, Gary Gregory <ga...@gmail.com>
>> wrote:
>>
>>>
>>>
>>> On Sat, Feb 10, 2018 at 12:22 PM, Gary Gregory <ga...@gmail.com>
>>> wrote:
>>>
>>>>
>>>>
>>>> On Sat, Feb 10, 2018 at 12:03 PM, James Bognar <ja...@apache.org>
>>>> wrote:
>>>>
>>>>> I uploaded a change to 7.1.0-SNAPSHOT that should make this work
>>>>> better.
>>>>>
>>>>> The problem was that given "Accept: */*", the media type
>>>>> "application/json+simple" was considered a slightly better match than
>>>>> "application/json" (i.e. two subtype parts match instead of just one).  So
>>>>> that why the ordering didn't matter.  I've adjusted the algorithm to remove
>>>>> that 'feature'.  :-)
>>>>>
>>>>> You should be able to place JsonSerializer.class at the top of the
>>>>> serializers now and have it match against "*/*".
>>>>>
>>>>> One caveat is I believe if you place JsonSerializer.class at the top
>>>>> of the list, you'll always see JSON rendered on Internet Explorer (unless
>>>>> they've fixed their Accept header in later releases...I no longer have a
>>>>> Windows machine to test against).
>>>>>
>>>>
>>>> Thank you James, I'll give it a whirl and post back here.
>>>>
>>>
>>> OK, with 7.1.0-SNAPSHOT and:
>>>
>>>         serializers={
>>>                 JsonSerializer.class,
>>>                 HtmlDocSerializer.class,
>>>                 HtmlStrippedDocSerializer.class,
>>>                 HtmlSchemaDocSerializer.class,
>>>                 JsonSerializer.Simple.class,
>>>                 JsonSchemaSerializer.class,
>>>                 XmlDocSerializer.class,
>>>                 XmlSchemaDocSerializer.class,
>>>                 UonSerializer.class,
>>>                 UrlEncodingSerializer.class,
>>>                 MsgPackSerializer.class,
>>>                 SoapXmlSerializer.class,
>>>                 PlainTextSerializer.class
>>>         },
>>>
>>> in my @RestResource and Postman sending Accept: */*, I do get the proper
>>> standard JSON response! Nice!
>>>
>>> You know my next question of course ;-) When will 7.1.0 be released or
>>> would this be appropriate to slide in a 7.0.2 release?
>>>
>>
>> Ping?
>>
>> Gary
>>
>>
>>>
>>> Thank you for all your help James!
>>> Gary
>>>
>>>
>>>> Gary
>>>>
>>>>>
>>>>> On Fri, Feb 9, 2018 at 2:21 PM, James Bognar <ja...@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Yea, unfortunately it's not that simple.  I'm still investigating
>>>>>> though.
>>>>>>
>>>>>> On Fri, Feb 9, 2018 at 2:15 PM, Gary Gregory <ga...@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> On Fri, Feb 9, 2018 at 11:06 AM, James Bognar <
>>>>>>> jamesbognar@apache.org> wrote:
>>>>>>>
>>>>>>>> I'll have to look further on how to support that.  It's kind of a
>>>>>>>> can-of-worms.
>>>>>>>>
>>>>>>>> We can't simply go by order of the serializers because
>>>>>>>> HtmlDocSerializer is listed first because some versions of IE do not
>>>>>>>> specify "text/html" in their Accept header.
>>>>>>>>
>>>>>>>> This is the Accept header for Internet Explorer:
>>>>>>>> image/jpeg, application/x-ms-application, image/gif,
>>>>>>>> application/xaml+xml, image/pjpeg, application/x-ms-xbap,
>>>>>>>> application/x-shockwave-flash, application/msword, */*
>>>>>>>>
>>>>>>>> And the heuristics for matching are complex.  For example, the
>>>>>>>> Accept header could contain id properties (e.g.
>>>>>>>> "application/activity+json",
>>>>>>>>
>>>>>>>> https://www.w3.org/TR/activitypub/#retrieving-objects).
>>>>>>>>
>>>>>>>>
>>>>>>>> Examples:
>>>>>>>>
>>>>>>>>    - "Accept: application/json" should match "application/json"
>>>>>>>>    before "application/json+simple".
>>>>>>>>    - "Accept: application/json+simple" should match
>>>>>>>>    "application/json+simple" before "application/json".
>>>>>>>>    - "Accept application/json+activity" should match "application/json"
>>>>>>>>    before "application/json+simple".
>>>>>>>>    - "Accept: */json" should match  "application/json" before
>>>>>>>>    "application/json+simple".
>>>>>>>>    - "Accept: application/*" should match ???
>>>>>>>>
>>>>>>>> Well, this is a nasty pickle.
>>>>>>>
>>>>>>> If I add my own "serializers" and put JSON first:
>>>>>>>
>>>>>>>                         serializers={
>>>>>>>                                 JsonSerializer.class,
>>>>>>>                                 JsonSerializer.Simple.class,
>>>>>>>                                 JsonSchemaSerializer.class,
>>>>>>>                                 HtmlDocSerializer.class,
>>>>>>>                                 HtmlStrippedDocSerializer.class,
>>>>>>>                                 HtmlSchemaDocSerializer.class,
>>>>>>>                                 XmlDocSerializer.class,
>>>>>>>                                 XmlSchemaDocSerializer.class,
>>>>>>>                                 UonSerializer.class,
>>>>>>>                                 UrlEncodingSerializer.class,
>>>>>>>                                 MsgPackSerializer.class,
>>>>>>>                                 SoapXmlSerializer.class,
>>>>>>>                                 PlainTextSerializer.class
>>>>>>>                         },
>>>>>>>
>>>>>>> And and let Postman use Accept */*,I still get JSON with single
>>>>>>> quotes. Is there no way to get JSON with double quotes?
>>>>>>>
>>>>>>> Gary
>>>>>>>
>>>>>>>
>>>>>>>> On Fri, Feb 9, 2018 at 12:43 PM, Gary Gregory <
>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Fri, Feb 9, 2018 at 9:40 AM, James Bognar <
>>>>>>>>> jamesbognar@apache.org> wrote:
>>>>>>>>>
>>>>>>>>>> Just tried Postman....it too specifies "Accept: */*" as a default
>>>>>>>>>> value.  If you specify Accept as a single space, it appears to work.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Hi James,
>>>>>>>>>
>>>>>>>>> I think I am getting closer. How do I get "*/*" to map to
>>>>>>>>> "application/json" in @RestResource as opposed the the HTML table
>>>>>>>>> I get now?
>>>>>>>>>
>>>>>>>>> Gary
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> If you add ?debug=true to your URL, the request will get logged
>>>>>>>>>> to the console so that you can see the actual incoming request:
>>>>>>>>>>
>>>>>>>>>>  [2018.02.09 11:39:22 WARNING]
>>>>>>>>>>
>>>>>>>>>> === HTTP Request (incoming) ==============================
>>>>>>>>>> ======================
>>>>>>>>>>
>>>>>>>>>> HTTP GET /?debug=true
>>>>>>>>>>
>>>>>>>>>> ---Headers---
>>>>>>>>>>
>>>>>>>>>> Cookie: JSESSIONID=node01siuixuu8fdsh1hm4a6dqe3lyg2.node0
>>>>>>>>>>
>>>>>>>>>> Cache-Control: no-cache
>>>>>>>>>>
>>>>>>>>>> Accept: */*
>>>>>>>>>>
>>>>>>>>>> Connection: keep-alive
>>>>>>>>>>
>>>>>>>>>> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)
>>>>>>>>>> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36
>>>>>>>>>>
>>>>>>>>>> Host: localhost:10000
>>>>>>>>>>
>>>>>>>>>> Postman-Token: 2b9124b3-1393-0e96-b052-edac7be1e8dd
>>>>>>>>>>
>>>>>>>>>> Accept-Encoding: gzip, deflate, br
>>>>>>>>>>
>>>>>>>>>> Accept-Language: en-US,en;q=0.9
>>>>>>>>>>
>>>>>>>>>> ---Default Servlet Headers---
>>>>>>>>>>
>>>>>>>>>> accept: application/json
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> === END ==============================
>>>>>>>>>> ==========================================
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Fri, Feb 9, 2018 at 11:25 AM, Gary Gregory <
>>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>>> On Fri, Feb 9, 2018 at 7:51 AM, James Bognar <
>>>>>>>>>>> jamesbognar@gmail.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Hi Gary,
>>>>>>>>>>>>
>>>>>>>>>>>> Try using a default request header:
>>>>>>>>>>>>
>>>>>>>>>>>> @RestResource(
>>>>>>>>>>>>
>>>>>>>>>>>> defaultRequestHeaders= {
>>>>>>>>>>>>
>>>>>>>>>>>> "Accept: application/json"
>>>>>>>>>>>>
>>>>>>>>>>>> },
>>>>>>>>>>>>
>>>>>>>>>>>> )
>>>>>>>>>>>>
>>>>>>>>>>>> I'll take a closer look at how "no" Accept header is handled.
>>>>>>>>>>>> I think it depends on what tool you're using.  Poster for example sends
>>>>>>>>>>>> "Accept: */*" if you don't specify a value, and that might return a
>>>>>>>>>>>> somewhat-random result.
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> That does not work for me sadly. Here a snipet of my service
>>>>>>>>>>> that extends ResourceGroup. I am using Postman 5.5.2. I am
>>>>>>>>>>> getting back an HTML table for my service.
>>>>>>>>>>>
>>>>>>>>>>> @RestResource(
>>>>>>>>>>> // @formatter:off
>>>>>>>>>>> path="/",
>>>>>>>>>>> title="Access & Connectivity Agent Microservice",
>>>>>>>>>>> description="Administration",
>>>>>>>>>>>         defaultRequestHeaders= {
>>>>>>>>>>>                 "Accept: application/json"
>>>>>>>>>>> },
>>>>>>>>>>> htmldoc=@HtmlDoc(
>>>>>>>>>>>                 head={
>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>> sizes='57x57' href='$U{servlet:/htdocs/image
>>>>>>>>>>> s/apple-icon-57x57.png}'/>",
>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>> sizes='60x60' href='$U{servlet:/htdocs/image
>>>>>>>>>>> s/apple-icon-60x60.png}'/>",
>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>> sizes='72x72' href='$U{servlet:/htdocs/image
>>>>>>>>>>> s/apple-icon-72x72.png}'/>",
>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>> sizes='76x76' href='$U{servlet:/htdocs/image
>>>>>>>>>>> s/apple-icon-76x76.png}'/>",
>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>> sizes='114x114' href='$U{servlet:/htdocs/image
>>>>>>>>>>> s/apple-icon-114x114.png}'/>",
>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>> sizes='120x120' href='$U{servlet:/htdocs/image
>>>>>>>>>>> s/apple-icon-120x120.png}'/>",
>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>> sizes='144x144' href='$U{servlet:/htdocs/image
>>>>>>>>>>> s/apple-icon-144x144.png}'/>",
>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>> sizes='152x152' href='$U{servlet:/htdocs/image
>>>>>>>>>>> s/apple-icon-152x152.png}'/>",
>>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>>> sizes='180x180' href='$U{servlet:/htdocs/image
>>>>>>>>>>> s/apple-icon-180x180.png}'/>",
>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>> sizes='192x192'  href='$U{servlet:/htdocs/image
>>>>>>>>>>> s/android-icon-192x192.png}'/>",
>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>> sizes='32x32' href='$U{servlet:/htdocs/image
>>>>>>>>>>> s/favicon-32x32.png}'/>",
>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>> sizes='96x96' href='$U{servlet:/htdocs/image
>>>>>>>>>>> s/favicon-96x96.png}'/>",
>>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>>> sizes='16x16' href='$U{servlet:/htdocs/image
>>>>>>>>>>> s/favicon-16x16.png}'/>",
>>>>>>>>>>>                         "<link rel='manifest'
>>>>>>>>>>> href='$U{servlet:/htdocs/images/manifest.json}'/>",
>>>>>>>>>>>                         "<meta name='msapplication-TileColor'
>>>>>>>>>>> content='#ffffff'/>",
>>>>>>>>>>>                         "<meta name='msapplication-TileImage'
>>>>>>>>>>> content='$U{servlet:/htdocs/images/ms-icon-144x144.png}'/>",
>>>>>>>>>>>                         "<meta name='theme-color'
>>>>>>>>>>> content='#ffffff'/>"
>>>>>>>>>>>                 },
>>>>>>>>>>>                 header={
>>>>>>>>>>>                 "<h1>$R{servletTitle}</h1>",
>>>>>>>>>>>                 "<h2>$R{methodSummary,$R{servl
>>>>>>>>>>> etDescription}}</h2>",
>>>>>>>>>>>                 "<a href='https://www.rocketsoftware.com'><img
>>>>>>>>>>> src='$U{servlet:/htdocs/images/ram.png}'
>>>>>>>>>>> style='position:absolute;top:5;right:5;background-color:tran
>>>>>>>>>>> sparent;height:30px'/></a>"
>>>>>>>>>>>         },
>>>>>>>>>>> widgets={
>>>>>>>>>>> ContentTypeMenuItem.class,
>>>>>>>>>>> StyleMenuItem.class,
>>>>>>>>>>> },
>>>>>>>>>>> navlinks={
>>>>>>>>>>> "options: servlet:/?method=OPTIONS",
>>>>>>>>>>>         "$W{ContentTypeMenuItem}"
>>>>>>>>>>> }
>>>>>>>>>>> ),
>>>>>>>>>>> children={
>>>>>>>>>>> ConfigResource.class,
>>>>>>>>>>> LogsResource.class
>>>>>>>>>>> }
>>>>>>>>>>> // @formatter:on
>>>>>>>>>>> )
>>>>>>>>>>> public class AdminRootResources extends ResourceGroup {
>>>>>>>>>>> ...
>>>>>>>>>>>     @RestMethod(name = GET, path = PATH_STATUS, summary =
>>>>>>>>>>> "Status", description = "Gets status for the running system.")
>>>>>>>>>>>     public Map<String, Object> getStatus() {
>>>>>>>>>>> ...
>>>>>>>>>>>
>>>>>>>>>>> Thank you,
>>>>>>>>>>> Gary
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <
>>>>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> Hi All:
>>>>>>>>>>>>>
>>>>>>>>>>>>> I want to return _standard_ JSON (see json.org) when no
>>>>>>>>>>>>> Accept header is sent to my @RestResource class. I cannot seem to get that
>>>>>>>>>>>>> to work no matter what. I get Juneau's non-standard single quote JSON.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Standard JSON uses double quotes, not single quotes.
>>>>>>>>>>>>>
>>>>>>>>>>>>> If I specify 'application/json' in the Accept, then I do get
>>>>>>>>>>>>> standard JSON.
>>>>>>>>>>>>>
>>>>>>>>>>>>> I cannot get this to work no matter what I try in my class's
>>>>>>>>>>>>> @RestResource's serializer attribute.
>>>>>>>>>>>>>
>>>>>>>>>>>>> I also want to support the normal set of serializers so users
>>>>>>>>>>>>> can specify any Accept header value Juneau supports.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thank you,
>>>>>>>>>>>>> Gary
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Re: How to get a class to return standard JSON as the default

Posted by James Bognar <ja...@apache.org>.
Ack....sorry....I never got your reply at 12:33 PM.  I'm not sure what
happened to your message.  I don't see it in Pony Mail either.

Anyway...
I'm getting close to a 7.1.0 release.  I'm currently working on refactoring
the Config API and I have a long weekend coming up.  Hopefully next week
for 7.1.0?

On Tue, Feb 13, 2018 at 5:31 PM, Gary Gregory <ga...@gmail.com>
wrote:

> On Sat, Feb 10, 2018 at 12:33 PM, Gary Gregory <ga...@gmail.com>
> wrote:
>
>>
>>
>> On Sat, Feb 10, 2018 at 12:22 PM, Gary Gregory <ga...@gmail.com>
>> wrote:
>>
>>>
>>>
>>> On Sat, Feb 10, 2018 at 12:03 PM, James Bognar <ja...@apache.org>
>>> wrote:
>>>
>>>> I uploaded a change to 7.1.0-SNAPSHOT that should make this work better.
>>>>
>>>> The problem was that given "Accept: */*", the media type
>>>> "application/json+simple" was considered a slightly better match than
>>>> "application/json" (i.e. two subtype parts match instead of just one).  So
>>>> that why the ordering didn't matter.  I've adjusted the algorithm to remove
>>>> that 'feature'.  :-)
>>>>
>>>> You should be able to place JsonSerializer.class at the top of the
>>>> serializers now and have it match against "*/*".
>>>>
>>>> One caveat is I believe if you place JsonSerializer.class at the top of
>>>> the list, you'll always see JSON rendered on Internet Explorer (unless
>>>> they've fixed their Accept header in later releases...I no longer have a
>>>> Windows machine to test against).
>>>>
>>>
>>> Thank you James, I'll give it a whirl and post back here.
>>>
>>
>> OK, with 7.1.0-SNAPSHOT and:
>>
>>         serializers={
>>                 JsonSerializer.class,
>>                 HtmlDocSerializer.class,
>>                 HtmlStrippedDocSerializer.class,
>>                 HtmlSchemaDocSerializer.class,
>>                 JsonSerializer.Simple.class,
>>                 JsonSchemaSerializer.class,
>>                 XmlDocSerializer.class,
>>                 XmlSchemaDocSerializer.class,
>>                 UonSerializer.class,
>>                 UrlEncodingSerializer.class,
>>                 MsgPackSerializer.class,
>>                 SoapXmlSerializer.class,
>>                 PlainTextSerializer.class
>>         },
>>
>> in my @RestResource and Postman sending Accept: */*, I do get the proper
>> standard JSON response! Nice!
>>
>> You know my next question of course ;-) When will 7.1.0 be released or
>> would this be appropriate to slide in a 7.0.2 release?
>>
>
> Ping?
>
> Gary
>
>
>>
>> Thank you for all your help James!
>> Gary
>>
>>
>>> Gary
>>>
>>>>
>>>> On Fri, Feb 9, 2018 at 2:21 PM, James Bognar <ja...@gmail.com>
>>>> wrote:
>>>>
>>>>> Yea, unfortunately it's not that simple.  I'm still investigating
>>>>> though.
>>>>>
>>>>> On Fri, Feb 9, 2018 at 2:15 PM, Gary Gregory <ga...@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> On Fri, Feb 9, 2018 at 11:06 AM, James Bognar <jamesbognar@apache.org
>>>>>> > wrote:
>>>>>>
>>>>>>> I'll have to look further on how to support that.  It's kind of a
>>>>>>> can-of-worms.
>>>>>>>
>>>>>>> We can't simply go by order of the serializers because
>>>>>>> HtmlDocSerializer is listed first because some versions of IE do not
>>>>>>> specify "text/html" in their Accept header.
>>>>>>>
>>>>>>> This is the Accept header for Internet Explorer:
>>>>>>> image/jpeg, application/x-ms-application, image/gif,
>>>>>>> application/xaml+xml, image/pjpeg, application/x-ms-xbap,
>>>>>>> application/x-shockwave-flash, application/msword, */*
>>>>>>>
>>>>>>> And the heuristics for matching are complex.  For example, the
>>>>>>> Accept header could contain id properties (e.g.
>>>>>>> "application/activity+json",
>>>>>>>
>>>>>>> https://www.w3.org/TR/activitypub/#retrieving-objects).
>>>>>>>
>>>>>>>
>>>>>>> Examples:
>>>>>>>
>>>>>>>    - "Accept: application/json" should match "application/json"
>>>>>>>    before "application/json+simple".
>>>>>>>    - "Accept: application/json+simple" should match
>>>>>>>    "application/json+simple" before "application/json".
>>>>>>>    - "Accept application/json+activity" should match "application/json"
>>>>>>>    before "application/json+simple".
>>>>>>>    - "Accept: */json" should match  "application/json" before
>>>>>>>    "application/json+simple".
>>>>>>>    - "Accept: application/*" should match ???
>>>>>>>
>>>>>>> Well, this is a nasty pickle.
>>>>>>
>>>>>> If I add my own "serializers" and put JSON first:
>>>>>>
>>>>>>                         serializers={
>>>>>>                                 JsonSerializer.class,
>>>>>>                                 JsonSerializer.Simple.class,
>>>>>>                                 JsonSchemaSerializer.class,
>>>>>>                                 HtmlDocSerializer.class,
>>>>>>                                 HtmlStrippedDocSerializer.class,
>>>>>>                                 HtmlSchemaDocSerializer.class,
>>>>>>                                 XmlDocSerializer.class,
>>>>>>                                 XmlSchemaDocSerializer.class,
>>>>>>                                 UonSerializer.class,
>>>>>>                                 UrlEncodingSerializer.class,
>>>>>>                                 MsgPackSerializer.class,
>>>>>>                                 SoapXmlSerializer.class,
>>>>>>                                 PlainTextSerializer.class
>>>>>>                         },
>>>>>>
>>>>>> And and let Postman use Accept */*,I still get JSON with single
>>>>>> quotes. Is there no way to get JSON with double quotes?
>>>>>>
>>>>>> Gary
>>>>>>
>>>>>>
>>>>>>> On Fri, Feb 9, 2018 at 12:43 PM, Gary Gregory <
>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Fri, Feb 9, 2018 at 9:40 AM, James Bognar <
>>>>>>>> jamesbognar@apache.org> wrote:
>>>>>>>>
>>>>>>>>> Just tried Postman....it too specifies "Accept: */*" as a default
>>>>>>>>> value.  If you specify Accept as a single space, it appears to work.
>>>>>>>>>
>>>>>>>>
>>>>>>>> Hi James,
>>>>>>>>
>>>>>>>> I think I am getting closer. How do I get "*/*" to map to
>>>>>>>> "application/json" in @RestResource as opposed the the HTML table
>>>>>>>> I get now?
>>>>>>>>
>>>>>>>> Gary
>>>>>>>>
>>>>>>>>
>>>>>>>>> If you add ?debug=true to your URL, the request will get logged to
>>>>>>>>> the console so that you can see the actual incoming request:
>>>>>>>>>
>>>>>>>>>  [2018.02.09 11:39:22 WARNING]
>>>>>>>>>
>>>>>>>>> === HTTP Request (incoming) ==============================
>>>>>>>>> ======================
>>>>>>>>>
>>>>>>>>> HTTP GET /?debug=true
>>>>>>>>>
>>>>>>>>> ---Headers---
>>>>>>>>>
>>>>>>>>> Cookie: JSESSIONID=node01siuixuu8fdsh1hm4a6dqe3lyg2.node0
>>>>>>>>>
>>>>>>>>> Cache-Control: no-cache
>>>>>>>>>
>>>>>>>>> Accept: */*
>>>>>>>>>
>>>>>>>>> Connection: keep-alive
>>>>>>>>>
>>>>>>>>> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)
>>>>>>>>> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36
>>>>>>>>>
>>>>>>>>> Host: localhost:10000
>>>>>>>>>
>>>>>>>>> Postman-Token: 2b9124b3-1393-0e96-b052-edac7be1e8dd
>>>>>>>>>
>>>>>>>>> Accept-Encoding: gzip, deflate, br
>>>>>>>>>
>>>>>>>>> Accept-Language: en-US,en;q=0.9
>>>>>>>>>
>>>>>>>>> ---Default Servlet Headers---
>>>>>>>>>
>>>>>>>>> accept: application/json
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> === END ==============================
>>>>>>>>> ==========================================
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Fri, Feb 9, 2018 at 11:25 AM, Gary Gregory <
>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>> On Fri, Feb 9, 2018 at 7:51 AM, James Bognar <
>>>>>>>>>> jamesbognar@gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>>> Hi Gary,
>>>>>>>>>>>
>>>>>>>>>>> Try using a default request header:
>>>>>>>>>>>
>>>>>>>>>>> @RestResource(
>>>>>>>>>>>
>>>>>>>>>>> defaultRequestHeaders= {
>>>>>>>>>>>
>>>>>>>>>>> "Accept: application/json"
>>>>>>>>>>>
>>>>>>>>>>> },
>>>>>>>>>>>
>>>>>>>>>>> )
>>>>>>>>>>>
>>>>>>>>>>> I'll take a closer look at how "no" Accept header is handled.  I
>>>>>>>>>>> think it depends on what tool you're using.  Poster for example sends
>>>>>>>>>>> "Accept: */*" if you don't specify a value, and that might return a
>>>>>>>>>>> somewhat-random result.
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> That does not work for me sadly. Here a snipet of my service that extends
>>>>>>>>>> ResourceGroup. I am using Postman 5.5.2. I am getting back an HTML table
>>>>>>>>>> for my service.
>>>>>>>>>>
>>>>>>>>>> @RestResource(
>>>>>>>>>> // @formatter:off
>>>>>>>>>> path="/",
>>>>>>>>>> title="Access & Connectivity Agent Microservice",
>>>>>>>>>> description="Administration",
>>>>>>>>>>         defaultRequestHeaders= {
>>>>>>>>>>                 "Accept: application/json"
>>>>>>>>>> },
>>>>>>>>>> htmldoc=@HtmlDoc(
>>>>>>>>>>                 head={
>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>> sizes='57x57' href='$U{servlet:/htdocs/image
>>>>>>>>>> s/apple-icon-57x57.png}'/>",
>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>> sizes='60x60' href='$U{servlet:/htdocs/image
>>>>>>>>>> s/apple-icon-60x60.png}'/>",
>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>> sizes='72x72' href='$U{servlet:/htdocs/image
>>>>>>>>>> s/apple-icon-72x72.png}'/>",
>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>> sizes='76x76' href='$U{servlet:/htdocs/image
>>>>>>>>>> s/apple-icon-76x76.png}'/>",
>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>> sizes='114x114' href='$U{servlet:/htdocs/image
>>>>>>>>>> s/apple-icon-114x114.png}'/>",
>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>> sizes='120x120' href='$U{servlet:/htdocs/image
>>>>>>>>>> s/apple-icon-120x120.png}'/>",
>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>> sizes='144x144' href='$U{servlet:/htdocs/image
>>>>>>>>>> s/apple-icon-144x144.png}'/>",
>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>> sizes='152x152' href='$U{servlet:/htdocs/image
>>>>>>>>>> s/apple-icon-152x152.png}'/>",
>>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>>> sizes='180x180' href='$U{servlet:/htdocs/image
>>>>>>>>>> s/apple-icon-180x180.png}'/>",
>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>> sizes='192x192'  href='$U{servlet:/htdocs/image
>>>>>>>>>> s/android-icon-192x192.png}'/>",
>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>> sizes='32x32' href='$U{servlet:/htdocs/image
>>>>>>>>>> s/favicon-32x32.png}'/>",
>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>> sizes='96x96' href='$U{servlet:/htdocs/image
>>>>>>>>>> s/favicon-96x96.png}'/>",
>>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>>> sizes='16x16' href='$U{servlet:/htdocs/image
>>>>>>>>>> s/favicon-16x16.png}'/>",
>>>>>>>>>>                         "<link rel='manifest'
>>>>>>>>>> href='$U{servlet:/htdocs/images/manifest.json}'/>",
>>>>>>>>>>                         "<meta name='msapplication-TileColor'
>>>>>>>>>> content='#ffffff'/>",
>>>>>>>>>>                         "<meta name='msapplication-TileImage'
>>>>>>>>>> content='$U{servlet:/htdocs/images/ms-icon-144x144.png}'/>",
>>>>>>>>>>                         "<meta name='theme-color'
>>>>>>>>>> content='#ffffff'/>"
>>>>>>>>>>                 },
>>>>>>>>>>                 header={
>>>>>>>>>>                 "<h1>$R{servletTitle}</h1>",
>>>>>>>>>>                 "<h2>$R{methodSummary,$R{servl
>>>>>>>>>> etDescription}}</h2>",
>>>>>>>>>>                 "<a href='https://www.rocketsoftware.com'><img
>>>>>>>>>> src='$U{servlet:/htdocs/images/ram.png}'
>>>>>>>>>> style='position:absolute;top:5;right:5;background-color:tran
>>>>>>>>>> sparent;height:30px'/></a>"
>>>>>>>>>>         },
>>>>>>>>>> widgets={
>>>>>>>>>> ContentTypeMenuItem.class,
>>>>>>>>>> StyleMenuItem.class,
>>>>>>>>>> },
>>>>>>>>>> navlinks={
>>>>>>>>>> "options: servlet:/?method=OPTIONS",
>>>>>>>>>>         "$W{ContentTypeMenuItem}"
>>>>>>>>>> }
>>>>>>>>>> ),
>>>>>>>>>> children={
>>>>>>>>>> ConfigResource.class,
>>>>>>>>>> LogsResource.class
>>>>>>>>>> }
>>>>>>>>>> // @formatter:on
>>>>>>>>>> )
>>>>>>>>>> public class AdminRootResources extends ResourceGroup {
>>>>>>>>>> ...
>>>>>>>>>>     @RestMethod(name = GET, path = PATH_STATUS, summary =
>>>>>>>>>> "Status", description = "Gets status for the running system.")
>>>>>>>>>>     public Map<String, Object> getStatus() {
>>>>>>>>>> ...
>>>>>>>>>>
>>>>>>>>>> Thank you,
>>>>>>>>>> Gary
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <
>>>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Hi All:
>>>>>>>>>>>>
>>>>>>>>>>>> I want to return _standard_ JSON (see json.org) when no Accept
>>>>>>>>>>>> header is sent to my @RestResource class. I cannot seem to get that to work
>>>>>>>>>>>> no matter what. I get Juneau's non-standard single quote JSON.
>>>>>>>>>>>>
>>>>>>>>>>>> Standard JSON uses double quotes, not single quotes.
>>>>>>>>>>>>
>>>>>>>>>>>> If I specify 'application/json' in the Accept, then I do get
>>>>>>>>>>>> standard JSON.
>>>>>>>>>>>>
>>>>>>>>>>>> I cannot get this to work no matter what I try in my class's
>>>>>>>>>>>> @RestResource's serializer attribute.
>>>>>>>>>>>>
>>>>>>>>>>>> I also want to support the normal set of serializers so users
>>>>>>>>>>>> can specify any Accept header value Juneau supports.
>>>>>>>>>>>>
>>>>>>>>>>>> Thank you,
>>>>>>>>>>>> Gary
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Re: How to get a class to return standard JSON as the default

Posted by Gary Gregory <ga...@gmail.com>.
On Sat, Feb 10, 2018 at 12:33 PM, Gary Gregory <ga...@gmail.com>
wrote:

>
>
> On Sat, Feb 10, 2018 at 12:22 PM, Gary Gregory <ga...@gmail.com>
> wrote:
>
>>
>>
>> On Sat, Feb 10, 2018 at 12:03 PM, James Bognar <ja...@apache.org>
>> wrote:
>>
>>> I uploaded a change to 7.1.0-SNAPSHOT that should make this work better.
>>>
>>> The problem was that given "Accept: */*", the media type
>>> "application/json+simple" was considered a slightly better match than
>>> "application/json" (i.e. two subtype parts match instead of just one).  So
>>> that why the ordering didn't matter.  I've adjusted the algorithm to remove
>>> that 'feature'.  :-)
>>>
>>> You should be able to place JsonSerializer.class at the top of the
>>> serializers now and have it match against "*/*".
>>>
>>> One caveat is I believe if you place JsonSerializer.class at the top of
>>> the list, you'll always see JSON rendered on Internet Explorer (unless
>>> they've fixed their Accept header in later releases...I no longer have a
>>> Windows machine to test against).
>>>
>>
>> Thank you James, I'll give it a whirl and post back here.
>>
>
> OK, with 7.1.0-SNAPSHOT and:
>
>         serializers={
>                 JsonSerializer.class,
>                 HtmlDocSerializer.class,
>                 HtmlStrippedDocSerializer.class,
>                 HtmlSchemaDocSerializer.class,
>                 JsonSerializer.Simple.class,
>                 JsonSchemaSerializer.class,
>                 XmlDocSerializer.class,
>                 XmlSchemaDocSerializer.class,
>                 UonSerializer.class,
>                 UrlEncodingSerializer.class,
>                 MsgPackSerializer.class,
>                 SoapXmlSerializer.class,
>                 PlainTextSerializer.class
>         },
>
> in my @RestResource and Postman sending Accept: */*, I do get the proper
> standard JSON response! Nice!
>
> You know my next question of course ;-) When will 7.1.0 be released or
> would this be appropriate to slide in a 7.0.2 release?
>

Ping?

Gary


>
> Thank you for all your help James!
> Gary
>
>
>> Gary
>>
>>>
>>> On Fri, Feb 9, 2018 at 2:21 PM, James Bognar <ja...@gmail.com>
>>> wrote:
>>>
>>>> Yea, unfortunately it's not that simple.  I'm still investigating
>>>> though.
>>>>
>>>> On Fri, Feb 9, 2018 at 2:15 PM, Gary Gregory <ga...@gmail.com>
>>>> wrote:
>>>>
>>>>> On Fri, Feb 9, 2018 at 11:06 AM, James Bognar <ja...@apache.org>
>>>>> wrote:
>>>>>
>>>>>> I'll have to look further on how to support that.  It's kind of a
>>>>>> can-of-worms.
>>>>>>
>>>>>> We can't simply go by order of the serializers because
>>>>>> HtmlDocSerializer is listed first because some versions of IE do not
>>>>>> specify "text/html" in their Accept header.
>>>>>>
>>>>>> This is the Accept header for Internet Explorer:
>>>>>> image/jpeg, application/x-ms-application, image/gif,
>>>>>> application/xaml+xml, image/pjpeg, application/x-ms-xbap,
>>>>>> application/x-shockwave-flash, application/msword, */*
>>>>>>
>>>>>> And the heuristics for matching are complex.  For example, the Accept
>>>>>> header could contain id properties (e.g. "application/activity+json",
>>>>>>
>>>>>> https://www.w3.org/TR/activitypub/#retrieving-objects).
>>>>>>
>>>>>>
>>>>>> Examples:
>>>>>>
>>>>>>    - "Accept: application/json" should match "application/json"
>>>>>>    before "application/json+simple".
>>>>>>    - "Accept: application/json+simple" should match
>>>>>>    "application/json+simple" before "application/json".
>>>>>>    - "Accept application/json+activity" should match "application/json"
>>>>>>    before "application/json+simple".
>>>>>>    - "Accept: */json" should match  "application/json" before
>>>>>>    "application/json+simple".
>>>>>>    - "Accept: application/*" should match ???
>>>>>>
>>>>>> Well, this is a nasty pickle.
>>>>>
>>>>> If I add my own "serializers" and put JSON first:
>>>>>
>>>>>                         serializers={
>>>>>                                 JsonSerializer.class,
>>>>>                                 JsonSerializer.Simple.class,
>>>>>                                 JsonSchemaSerializer.class,
>>>>>                                 HtmlDocSerializer.class,
>>>>>                                 HtmlStrippedDocSerializer.class,
>>>>>                                 HtmlSchemaDocSerializer.class,
>>>>>                                 XmlDocSerializer.class,
>>>>>                                 XmlSchemaDocSerializer.class,
>>>>>                                 UonSerializer.class,
>>>>>                                 UrlEncodingSerializer.class,
>>>>>                                 MsgPackSerializer.class,
>>>>>                                 SoapXmlSerializer.class,
>>>>>                                 PlainTextSerializer.class
>>>>>                         },
>>>>>
>>>>> And and let Postman use Accept */*,I still get JSON with single
>>>>> quotes. Is there no way to get JSON with double quotes?
>>>>>
>>>>> Gary
>>>>>
>>>>>
>>>>>> On Fri, Feb 9, 2018 at 12:43 PM, Gary Gregory <garydgregory@gmail.com
>>>>>> > wrote:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Fri, Feb 9, 2018 at 9:40 AM, James Bognar <jamesbognar@apache.org
>>>>>>> > wrote:
>>>>>>>
>>>>>>>> Just tried Postman....it too specifies "Accept: */*" as a default
>>>>>>>> value.  If you specify Accept as a single space, it appears to work.
>>>>>>>>
>>>>>>>
>>>>>>> Hi James,
>>>>>>>
>>>>>>> I think I am getting closer. How do I get "*/*" to map to
>>>>>>> "application/json" in @RestResource as opposed the the HTML table I
>>>>>>> get now?
>>>>>>>
>>>>>>> Gary
>>>>>>>
>>>>>>>
>>>>>>>> If you add ?debug=true to your URL, the request will get logged to
>>>>>>>> the console so that you can see the actual incoming request:
>>>>>>>>
>>>>>>>>  [2018.02.09 11:39:22 WARNING]
>>>>>>>>
>>>>>>>> === HTTP Request (incoming) ==============================
>>>>>>>> ======================
>>>>>>>>
>>>>>>>> HTTP GET /?debug=true
>>>>>>>>
>>>>>>>> ---Headers---
>>>>>>>>
>>>>>>>> Cookie: JSESSIONID=node01siuixuu8fdsh1hm4a6dqe3lyg2.node0
>>>>>>>>
>>>>>>>> Cache-Control: no-cache
>>>>>>>>
>>>>>>>> Accept: */*
>>>>>>>>
>>>>>>>> Connection: keep-alive
>>>>>>>>
>>>>>>>> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)
>>>>>>>> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36
>>>>>>>>
>>>>>>>> Host: localhost:10000
>>>>>>>>
>>>>>>>> Postman-Token: 2b9124b3-1393-0e96-b052-edac7be1e8dd
>>>>>>>>
>>>>>>>> Accept-Encoding: gzip, deflate, br
>>>>>>>>
>>>>>>>> Accept-Language: en-US,en;q=0.9
>>>>>>>>
>>>>>>>> ---Default Servlet Headers---
>>>>>>>>
>>>>>>>> accept: application/json
>>>>>>>>
>>>>>>>>
>>>>>>>> === END ==============================
>>>>>>>> ==========================================
>>>>>>>>
>>>>>>>>
>>>>>>>> On Fri, Feb 9, 2018 at 11:25 AM, Gary Gregory <
>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>
>>>>>>>>> On Fri, Feb 9, 2018 at 7:51 AM, James Bognar <
>>>>>>>>> jamesbognar@gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>> Hi Gary,
>>>>>>>>>>
>>>>>>>>>> Try using a default request header:
>>>>>>>>>>
>>>>>>>>>> @RestResource(
>>>>>>>>>>
>>>>>>>>>> defaultRequestHeaders= {
>>>>>>>>>>
>>>>>>>>>> "Accept: application/json"
>>>>>>>>>>
>>>>>>>>>> },
>>>>>>>>>>
>>>>>>>>>> )
>>>>>>>>>>
>>>>>>>>>> I'll take a closer look at how "no" Accept header is handled.  I
>>>>>>>>>> think it depends on what tool you're using.  Poster for example sends
>>>>>>>>>> "Accept: */*" if you don't specify a value, and that might return a
>>>>>>>>>> somewhat-random result.
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> That does not work for me sadly. Here a snipet of my service that extends
>>>>>>>>> ResourceGroup. I am using Postman 5.5.2. I am getting back an HTML table
>>>>>>>>> for my service.
>>>>>>>>>
>>>>>>>>> @RestResource(
>>>>>>>>> // @formatter:off
>>>>>>>>> path="/",
>>>>>>>>> title="Access & Connectivity Agent Microservice",
>>>>>>>>> description="Administration",
>>>>>>>>>         defaultRequestHeaders= {
>>>>>>>>>                 "Accept: application/json"
>>>>>>>>> },
>>>>>>>>> htmldoc=@HtmlDoc(
>>>>>>>>>                 head={
>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>> sizes='57x57' href='$U{servlet:/htdocs/image
>>>>>>>>> s/apple-icon-57x57.png}'/>",
>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>> sizes='60x60' href='$U{servlet:/htdocs/image
>>>>>>>>> s/apple-icon-60x60.png}'/>",
>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>> sizes='72x72' href='$U{servlet:/htdocs/image
>>>>>>>>> s/apple-icon-72x72.png}'/>",
>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>> sizes='76x76' href='$U{servlet:/htdocs/image
>>>>>>>>> s/apple-icon-76x76.png}'/>",
>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>> sizes='114x114' href='$U{servlet:/htdocs/image
>>>>>>>>> s/apple-icon-114x114.png}'/>",
>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>> sizes='120x120' href='$U{servlet:/htdocs/image
>>>>>>>>> s/apple-icon-120x120.png}'/>",
>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>> sizes='144x144' href='$U{servlet:/htdocs/image
>>>>>>>>> s/apple-icon-144x144.png}'/>",
>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>> sizes='152x152' href='$U{servlet:/htdocs/image
>>>>>>>>> s/apple-icon-152x152.png}'/>",
>>>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>>>> sizes='180x180' href='$U{servlet:/htdocs/image
>>>>>>>>> s/apple-icon-180x180.png}'/>",
>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>> sizes='192x192'  href='$U{servlet:/htdocs/image
>>>>>>>>> s/android-icon-192x192.png}'/>",
>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>> sizes='32x32' href='$U{servlet:/htdocs/image
>>>>>>>>> s/favicon-32x32.png}'/>",
>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>> sizes='96x96' href='$U{servlet:/htdocs/image
>>>>>>>>> s/favicon-96x96.png}'/>",
>>>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>>>> sizes='16x16' href='$U{servlet:/htdocs/image
>>>>>>>>> s/favicon-16x16.png}'/>",
>>>>>>>>>                         "<link rel='manifest'
>>>>>>>>> href='$U{servlet:/htdocs/images/manifest.json}'/>",
>>>>>>>>>                         "<meta name='msapplication-TileColor'
>>>>>>>>> content='#ffffff'/>",
>>>>>>>>>                         "<meta name='msapplication-TileImage'
>>>>>>>>> content='$U{servlet:/htdocs/images/ms-icon-144x144.png}'/>",
>>>>>>>>>                         "<meta name='theme-color'
>>>>>>>>> content='#ffffff'/>"
>>>>>>>>>                 },
>>>>>>>>>                 header={
>>>>>>>>>                 "<h1>$R{servletTitle}</h1>",
>>>>>>>>>                 "<h2>$R{methodSummary,$R{servl
>>>>>>>>> etDescription}}</h2>",
>>>>>>>>>                 "<a href='https://www.rocketsoftware.com'><img
>>>>>>>>> src='$U{servlet:/htdocs/images/ram.png}'
>>>>>>>>> style='position:absolute;top:5;right:5;background-color:tran
>>>>>>>>> sparent;height:30px'/></a>"
>>>>>>>>>         },
>>>>>>>>> widgets={
>>>>>>>>> ContentTypeMenuItem.class,
>>>>>>>>> StyleMenuItem.class,
>>>>>>>>> },
>>>>>>>>> navlinks={
>>>>>>>>> "options: servlet:/?method=OPTIONS",
>>>>>>>>>         "$W{ContentTypeMenuItem}"
>>>>>>>>> }
>>>>>>>>> ),
>>>>>>>>> children={
>>>>>>>>> ConfigResource.class,
>>>>>>>>> LogsResource.class
>>>>>>>>> }
>>>>>>>>> // @formatter:on
>>>>>>>>> )
>>>>>>>>> public class AdminRootResources extends ResourceGroup {
>>>>>>>>> ...
>>>>>>>>>     @RestMethod(name = GET, path = PATH_STATUS, summary =
>>>>>>>>> "Status", description = "Gets status for the running system.")
>>>>>>>>>     public Map<String, Object> getStatus() {
>>>>>>>>> ...
>>>>>>>>>
>>>>>>>>> Thank you,
>>>>>>>>> Gary
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <
>>>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>>> Hi All:
>>>>>>>>>>>
>>>>>>>>>>> I want to return _standard_ JSON (see json.org) when no Accept
>>>>>>>>>>> header is sent to my @RestResource class. I cannot seem to get that to work
>>>>>>>>>>> no matter what. I get Juneau's non-standard single quote JSON.
>>>>>>>>>>>
>>>>>>>>>>> Standard JSON uses double quotes, not single quotes.
>>>>>>>>>>>
>>>>>>>>>>> If I specify 'application/json' in the Accept, then I do get
>>>>>>>>>>> standard JSON.
>>>>>>>>>>>
>>>>>>>>>>> I cannot get this to work no matter what I try in my class's
>>>>>>>>>>> @RestResource's serializer attribute.
>>>>>>>>>>>
>>>>>>>>>>> I also want to support the normal set of serializers so users
>>>>>>>>>>> can specify any Accept header value Juneau supports.
>>>>>>>>>>>
>>>>>>>>>>> Thank you,
>>>>>>>>>>> Gary
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Re: How to get a class to return standard JSON as the default

Posted by Gary Gregory <ga...@gmail.com>.
On Sat, Feb 10, 2018 at 12:03 PM, James Bognar <ja...@apache.org>
wrote:

> I uploaded a change to 7.1.0-SNAPSHOT that should make this work better.
>
> The problem was that given "Accept: */*", the media type
> "application/json+simple" was considered a slightly better match than
> "application/json" (i.e. two subtype parts match instead of just one).  So
> that why the ordering didn't matter.  I've adjusted the algorithm to remove
> that 'feature'.  :-)
>
> You should be able to place JsonSerializer.class at the top of the
> serializers now and have it match against "*/*".
>
> One caveat is I believe if you place JsonSerializer.class at the top of
> the list, you'll always see JSON rendered on Internet Explorer (unless
> they've fixed their Accept header in later releases...I no longer have a
> Windows machine to test against).
>

Thank you James, I'll give it a whirl and post back here.

Gary

>
> On Fri, Feb 9, 2018 at 2:21 PM, James Bognar <ja...@gmail.com>
> wrote:
>
>> Yea, unfortunately it's not that simple.  I'm still investigating though.
>>
>> On Fri, Feb 9, 2018 at 2:15 PM, Gary Gregory <ga...@gmail.com>
>> wrote:
>>
>>> On Fri, Feb 9, 2018 at 11:06 AM, James Bognar <ja...@apache.org>
>>> wrote:
>>>
>>>> I'll have to look further on how to support that.  It's kind of a
>>>> can-of-worms.
>>>>
>>>> We can't simply go by order of the serializers because
>>>> HtmlDocSerializer is listed first because some versions of IE do not
>>>> specify "text/html" in their Accept header.
>>>>
>>>> This is the Accept header for Internet Explorer:
>>>> image/jpeg, application/x-ms-application, image/gif,
>>>> application/xaml+xml, image/pjpeg, application/x-ms-xbap,
>>>> application/x-shockwave-flash, application/msword, */*
>>>>
>>>> And the heuristics for matching are complex.  For example, the Accept
>>>> header could contain id properties (e.g. "application/activity+json",
>>>>
>>>> https://www.w3.org/TR/activitypub/#retrieving-objects).
>>>>
>>>>
>>>> Examples:
>>>>
>>>>    - "Accept: application/json" should match "application/json" before
>>>>    "application/json+simple".
>>>>    - "Accept: application/json+simple" should match
>>>>    "application/json+simple" before "application/json".
>>>>    - "Accept application/json+activity" should match "application/json"
>>>>    before "application/json+simple".
>>>>    - "Accept: */json" should match  "application/json" before
>>>>    "application/json+simple".
>>>>    - "Accept: application/*" should match ???
>>>>
>>>> Well, this is a nasty pickle.
>>>
>>> If I add my own "serializers" and put JSON first:
>>>
>>>                         serializers={
>>>                                 JsonSerializer.class,
>>>                                 JsonSerializer.Simple.class,
>>>                                 JsonSchemaSerializer.class,
>>>                                 HtmlDocSerializer.class,
>>>                                 HtmlStrippedDocSerializer.class,
>>>                                 HtmlSchemaDocSerializer.class,
>>>                                 XmlDocSerializer.class,
>>>                                 XmlSchemaDocSerializer.class,
>>>                                 UonSerializer.class,
>>>                                 UrlEncodingSerializer.class,
>>>                                 MsgPackSerializer.class,
>>>                                 SoapXmlSerializer.class,
>>>                                 PlainTextSerializer.class
>>>                         },
>>>
>>> And and let Postman use Accept */*,I still get JSON with single quotes.
>>> Is there no way to get JSON with double quotes?
>>>
>>> Gary
>>>
>>>
>>>> On Fri, Feb 9, 2018 at 12:43 PM, Gary Gregory <ga...@gmail.com>
>>>> wrote:
>>>>
>>>>>
>>>>>
>>>>> On Fri, Feb 9, 2018 at 9:40 AM, James Bognar <ja...@apache.org>
>>>>> wrote:
>>>>>
>>>>>> Just tried Postman....it too specifies "Accept: */*" as a default
>>>>>> value.  If you specify Accept as a single space, it appears to work.
>>>>>>
>>>>>
>>>>> Hi James,
>>>>>
>>>>> I think I am getting closer. How do I get "*/*" to map to
>>>>> "application/json" in @RestResource as opposed the the HTML table I
>>>>> get now?
>>>>>
>>>>> Gary
>>>>>
>>>>>
>>>>>> If you add ?debug=true to your URL, the request will get logged to
>>>>>> the console so that you can see the actual incoming request:
>>>>>>
>>>>>>  [2018.02.09 11:39:22 WARNING]
>>>>>>
>>>>>> === HTTP Request (incoming) ==============================
>>>>>> ======================
>>>>>>
>>>>>> HTTP GET /?debug=true
>>>>>>
>>>>>> ---Headers---
>>>>>>
>>>>>> Cookie: JSESSIONID=node01siuixuu8fdsh1hm4a6dqe3lyg2.node0
>>>>>>
>>>>>> Cache-Control: no-cache
>>>>>>
>>>>>> Accept: */*
>>>>>>
>>>>>> Connection: keep-alive
>>>>>>
>>>>>> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)
>>>>>> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36
>>>>>>
>>>>>> Host: localhost:10000
>>>>>>
>>>>>> Postman-Token: 2b9124b3-1393-0e96-b052-edac7be1e8dd
>>>>>>
>>>>>> Accept-Encoding: gzip, deflate, br
>>>>>>
>>>>>> Accept-Language: en-US,en;q=0.9
>>>>>>
>>>>>> ---Default Servlet Headers---
>>>>>>
>>>>>> accept: application/json
>>>>>>
>>>>>>
>>>>>> === END ============================================================
>>>>>> ============
>>>>>>
>>>>>>
>>>>>> On Fri, Feb 9, 2018 at 11:25 AM, Gary Gregory <garydgregory@gmail.com
>>>>>> > wrote:
>>>>>>
>>>>>>> On Fri, Feb 9, 2018 at 7:51 AM, James Bognar <ja...@gmail.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Hi Gary,
>>>>>>>>
>>>>>>>> Try using a default request header:
>>>>>>>>
>>>>>>>> @RestResource(
>>>>>>>>
>>>>>>>> defaultRequestHeaders= {
>>>>>>>>
>>>>>>>> "Accept: application/json"
>>>>>>>>
>>>>>>>> },
>>>>>>>>
>>>>>>>> )
>>>>>>>>
>>>>>>>> I'll take a closer look at how "no" Accept header is handled.  I
>>>>>>>> think it depends on what tool you're using.  Poster for example sends
>>>>>>>> "Accept: */*" if you don't specify a value, and that might return a
>>>>>>>> somewhat-random result.
>>>>>>>>
>>>>>>>
>>>>>>> That does not work for me sadly. Here a snipet of my service that extends
>>>>>>> ResourceGroup. I am using Postman 5.5.2. I am getting back an HTML table
>>>>>>> for my service.
>>>>>>>
>>>>>>> @RestResource(
>>>>>>> // @formatter:off
>>>>>>> path="/",
>>>>>>> title="Access & Connectivity Agent Microservice",
>>>>>>> description="Administration",
>>>>>>>         defaultRequestHeaders= {
>>>>>>>                 "Accept: application/json"
>>>>>>> },
>>>>>>> htmldoc=@HtmlDoc(
>>>>>>>                 head={
>>>>>>>                         "<link rel='apple-touch-icon' sizes='57x57'
>>>>>>> href='$U{servlet:/htdocs/images/apple-icon-57x57.png}'/>",
>>>>>>>                         "<link rel='apple-touch-icon' sizes='60x60'
>>>>>>> href='$U{servlet:/htdocs/images/apple-icon-60x60.png}'/>",
>>>>>>>                         "<link rel='apple-touch-icon' sizes='72x72'
>>>>>>> href='$U{servlet:/htdocs/images/apple-icon-72x72.png}'/>",
>>>>>>>                         "<link rel='apple-touch-icon' sizes='76x76'
>>>>>>> href='$U{servlet:/htdocs/images/apple-icon-76x76.png}'/>",
>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>> sizes='114x114' href='$U{servlet:/htdocs/image
>>>>>>> s/apple-icon-114x114.png}'/>",
>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>> sizes='120x120' href='$U{servlet:/htdocs/image
>>>>>>> s/apple-icon-120x120.png}'/>",
>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>> sizes='144x144' href='$U{servlet:/htdocs/image
>>>>>>> s/apple-icon-144x144.png}'/>",
>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>> sizes='152x152' href='$U{servlet:/htdocs/image
>>>>>>> s/apple-icon-152x152.png}'/>",
>>>>>>>                         "<link rel='apple-touch-icon'
>>>>>>> sizes='180x180' href='$U{servlet:/htdocs/image
>>>>>>> s/apple-icon-180x180.png}'/>",
>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>> sizes='192x192'  href='$U{servlet:/htdocs/image
>>>>>>> s/android-icon-192x192.png}'/>",
>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>> sizes='32x32' href='$U{servlet:/htdocs/image
>>>>>>> s/favicon-32x32.png}'/>",
>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>> sizes='96x96' href='$U{servlet:/htdocs/image
>>>>>>> s/favicon-96x96.png}'/>",
>>>>>>>                         "<link rel='icon' type='image/png'
>>>>>>> sizes='16x16' href='$U{servlet:/htdocs/image
>>>>>>> s/favicon-16x16.png}'/>",
>>>>>>>                         "<link rel='manifest'
>>>>>>> href='$U{servlet:/htdocs/images/manifest.json}'/>",
>>>>>>>                         "<meta name='msapplication-TileColor'
>>>>>>> content='#ffffff'/>",
>>>>>>>                         "<meta name='msapplication-TileImage'
>>>>>>> content='$U{servlet:/htdocs/images/ms-icon-144x144.png}'/>",
>>>>>>>                         "<meta name='theme-color'
>>>>>>> content='#ffffff'/>"
>>>>>>>                 },
>>>>>>>                 header={
>>>>>>>                 "<h1>$R{servletTitle}</h1>",
>>>>>>>                 "<h2>$R{methodSummary,$R{servletDescription}}</h2>",
>>>>>>>                 "<a href='https://www.rocketsoftware.com'><img
>>>>>>> src='$U{servlet:/htdocs/images/ram.png}'
>>>>>>> style='position:absolute;top:5;right:5;background-color:tran
>>>>>>> sparent;height:30px'/></a>"
>>>>>>>         },
>>>>>>> widgets={
>>>>>>> ContentTypeMenuItem.class,
>>>>>>> StyleMenuItem.class,
>>>>>>> },
>>>>>>> navlinks={
>>>>>>> "options: servlet:/?method=OPTIONS",
>>>>>>>         "$W{ContentTypeMenuItem}"
>>>>>>> }
>>>>>>> ),
>>>>>>> children={
>>>>>>> ConfigResource.class,
>>>>>>> LogsResource.class
>>>>>>> }
>>>>>>> // @formatter:on
>>>>>>> )
>>>>>>> public class AdminRootResources extends ResourceGroup {
>>>>>>> ...
>>>>>>>     @RestMethod(name = GET, path = PATH_STATUS, summary = "Status",
>>>>>>> description = "Gets status for the running system.")
>>>>>>>     public Map<String, Object> getStatus() {
>>>>>>> ...
>>>>>>>
>>>>>>> Thank you,
>>>>>>> Gary
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>> On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <
>>>>>>>> garydgregory@gmail.com> wrote:
>>>>>>>>
>>>>>>>>> Hi All:
>>>>>>>>>
>>>>>>>>> I want to return _standard_ JSON (see json.org) when no Accept
>>>>>>>>> header is sent to my @RestResource class. I cannot seem to get that to work
>>>>>>>>> no matter what. I get Juneau's non-standard single quote JSON.
>>>>>>>>>
>>>>>>>>> Standard JSON uses double quotes, not single quotes.
>>>>>>>>>
>>>>>>>>> If I specify 'application/json' in the Accept, then I do get
>>>>>>>>> standard JSON.
>>>>>>>>>
>>>>>>>>> I cannot get this to work no matter what I try in my class's
>>>>>>>>> @RestResource's serializer attribute.
>>>>>>>>>
>>>>>>>>> I also want to support the normal set of serializers so users can
>>>>>>>>> specify any Accept header value Juneau supports.
>>>>>>>>>
>>>>>>>>> Thank you,
>>>>>>>>> Gary
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Re: How to get a class to return standard JSON as the default

Posted by James Bognar <ja...@apache.org>.
I uploaded a change to 7.1.0-SNAPSHOT that should make this work better.

The problem was that given "Accept: */*", the media type
"application/json+simple" was considered a slightly better match than
"application/json" (i.e. two subtype parts match instead of just one).  So
that why the ordering didn't matter.  I've adjusted the algorithm to remove
that 'feature'.  :-)

You should be able to place JsonSerializer.class at the top of the
serializers now and have it match against "*/*".

One caveat is I believe if you place JsonSerializer.class at the top of the
list, you'll always see JSON rendered on Internet Explorer (unless they've
fixed their Accept header in later releases...I no longer have a Windows
machine to test against).

On Fri, Feb 9, 2018 at 2:21 PM, James Bognar <ja...@gmail.com> wrote:

> Yea, unfortunately it's not that simple.  I'm still investigating though.
>
> On Fri, Feb 9, 2018 at 2:15 PM, Gary Gregory <ga...@gmail.com>
> wrote:
>
>> On Fri, Feb 9, 2018 at 11:06 AM, James Bognar <ja...@apache.org>
>> wrote:
>>
>>> I'll have to look further on how to support that.  It's kind of a
>>> can-of-worms.
>>>
>>> We can't simply go by order of the serializers because HtmlDocSerializer
>>> is listed first because some versions of IE do not specify "text/html" in
>>> their Accept header.
>>>
>>> This is the Accept header for Internet Explorer:
>>> image/jpeg, application/x-ms-application, image/gif,
>>> application/xaml+xml, image/pjpeg, application/x-ms-xbap,
>>> application/x-shockwave-flash, application/msword, */*
>>>
>>> And the heuristics for matching are complex.  For example, the Accept
>>> header could contain id properties (e.g. "application/activity+json",
>>>
>>> https://www.w3.org/TR/activitypub/#retrieving-objects).
>>>
>>>
>>> Examples:
>>>
>>>    - "Accept: application/json" should match "application/json" before
>>>    "application/json+simple".
>>>    - "Accept: application/json+simple" should match
>>>    "application/json+simple" before "application/json".
>>>    - "Accept application/json+activity" should match "application/json"
>>>    before "application/json+simple".
>>>    - "Accept: */json" should match  "application/json" before
>>>    "application/json+simple".
>>>    - "Accept: application/*" should match ???
>>>
>>> Well, this is a nasty pickle.
>>
>> If I add my own "serializers" and put JSON first:
>>
>>                         serializers={
>>                                 JsonSerializer.class,
>>                                 JsonSerializer.Simple.class,
>>                                 JsonSchemaSerializer.class,
>>                                 HtmlDocSerializer.class,
>>                                 HtmlStrippedDocSerializer.class,
>>                                 HtmlSchemaDocSerializer.class,
>>                                 XmlDocSerializer.class,
>>                                 XmlSchemaDocSerializer.class,
>>                                 UonSerializer.class,
>>                                 UrlEncodingSerializer.class,
>>                                 MsgPackSerializer.class,
>>                                 SoapXmlSerializer.class,
>>                                 PlainTextSerializer.class
>>                         },
>>
>> And and let Postman use Accept */*,I still get JSON with single quotes.
>> Is there no way to get JSON with double quotes?
>>
>> Gary
>>
>>
>>> On Fri, Feb 9, 2018 at 12:43 PM, Gary Gregory <ga...@gmail.com>
>>> wrote:
>>>
>>>>
>>>>
>>>> On Fri, Feb 9, 2018 at 9:40 AM, James Bognar <ja...@apache.org>
>>>> wrote:
>>>>
>>>>> Just tried Postman....it too specifies "Accept: */*" as a default
>>>>> value.  If you specify Accept as a single space, it appears to work.
>>>>>
>>>>
>>>> Hi James,
>>>>
>>>> I think I am getting closer. How do I get "*/*" to map to
>>>> "application/json" in @RestResource as opposed the the HTML table I
>>>> get now?
>>>>
>>>> Gary
>>>>
>>>>
>>>>> If you add ?debug=true to your URL, the request will get logged to the
>>>>> console so that you can see the actual incoming request:
>>>>>
>>>>>  [2018.02.09 11:39:22 WARNING]
>>>>>
>>>>> === HTTP Request (incoming) ==============================
>>>>> ======================
>>>>>
>>>>> HTTP GET /?debug=true
>>>>>
>>>>> ---Headers---
>>>>>
>>>>> Cookie: JSESSIONID=node01siuixuu8fdsh1hm4a6dqe3lyg2.node0
>>>>>
>>>>> Cache-Control: no-cache
>>>>>
>>>>> Accept: */*
>>>>>
>>>>> Connection: keep-alive
>>>>>
>>>>> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)
>>>>> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36
>>>>>
>>>>> Host: localhost:10000
>>>>>
>>>>> Postman-Token: 2b9124b3-1393-0e96-b052-edac7be1e8dd
>>>>>
>>>>> Accept-Encoding: gzip, deflate, br
>>>>>
>>>>> Accept-Language: en-US,en;q=0.9
>>>>>
>>>>> ---Default Servlet Headers---
>>>>>
>>>>> accept: application/json
>>>>>
>>>>>
>>>>> === END ============================================================
>>>>> ============
>>>>>
>>>>>
>>>>> On Fri, Feb 9, 2018 at 11:25 AM, Gary Gregory <ga...@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> On Fri, Feb 9, 2018 at 7:51 AM, James Bognar <ja...@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Hi Gary,
>>>>>>>
>>>>>>> Try using a default request header:
>>>>>>>
>>>>>>> @RestResource(
>>>>>>>
>>>>>>> defaultRequestHeaders= {
>>>>>>>
>>>>>>> "Accept: application/json"
>>>>>>>
>>>>>>> },
>>>>>>>
>>>>>>> )
>>>>>>>
>>>>>>> I'll take a closer look at how "no" Accept header is handled.  I
>>>>>>> think it depends on what tool you're using.  Poster for example sends
>>>>>>> "Accept: */*" if you don't specify a value, and that might return a
>>>>>>> somewhat-random result.
>>>>>>>
>>>>>>
>>>>>> That does not work for me sadly. Here a snipet of my service that extends
>>>>>> ResourceGroup. I am using Postman 5.5.2. I am getting back an HTML table
>>>>>> for my service.
>>>>>>
>>>>>> @RestResource(
>>>>>> // @formatter:off
>>>>>> path="/",
>>>>>> title="Access & Connectivity Agent Microservice",
>>>>>> description="Administration",
>>>>>>         defaultRequestHeaders= {
>>>>>>                 "Accept: application/json"
>>>>>> },
>>>>>> htmldoc=@HtmlDoc(
>>>>>>                 head={
>>>>>>                         "<link rel='apple-touch-icon' sizes='57x57'
>>>>>> href='$U{servlet:/htdocs/images/apple-icon-57x57.png}'/>",
>>>>>>                         "<link rel='apple-touch-icon' sizes='60x60'
>>>>>> href='$U{servlet:/htdocs/images/apple-icon-60x60.png}'/>",
>>>>>>                         "<link rel='apple-touch-icon' sizes='72x72'
>>>>>> href='$U{servlet:/htdocs/images/apple-icon-72x72.png}'/>",
>>>>>>                         "<link rel='apple-touch-icon' sizes='76x76'
>>>>>> href='$U{servlet:/htdocs/images/apple-icon-76x76.png}'/>",
>>>>>>                         "<link rel='apple-touch-icon' sizes='114x114'
>>>>>> href='$U{servlet:/htdocs/images/apple-icon-114x114.png}'/>",
>>>>>>                         "<link rel='apple-touch-icon' sizes='120x120'
>>>>>> href='$U{servlet:/htdocs/images/apple-icon-120x120.png}'/>",
>>>>>>                         "<link rel='apple-touch-icon' sizes='144x144'
>>>>>> href='$U{servlet:/htdocs/images/apple-icon-144x144.png}'/>",
>>>>>>                         "<link rel='apple-touch-icon' sizes='152x152'
>>>>>> href='$U{servlet:/htdocs/images/apple-icon-152x152.png}'/>",
>>>>>>                         "<link rel='apple-touch-icon' sizes='180x180'
>>>>>> href='$U{servlet:/htdocs/images/apple-icon-180x180.png}'/>",
>>>>>>                         "<link rel='icon' type='image/png'
>>>>>> sizes='192x192'  href='$U{servlet:/htdocs/image
>>>>>> s/android-icon-192x192.png}'/>",
>>>>>>                         "<link rel='icon' type='image/png'
>>>>>> sizes='32x32' href='$U{servlet:/htdocs/images/favicon-32x32.png}'/>",
>>>>>>                         "<link rel='icon' type='image/png'
>>>>>> sizes='96x96' href='$U{servlet:/htdocs/images/favicon-96x96.png}'/>",
>>>>>>                         "<link rel='icon' type='image/png'
>>>>>> sizes='16x16' href='$U{servlet:/htdocs/images/favicon-16x16.png}'/>",
>>>>>>                         "<link rel='manifest'
>>>>>> href='$U{servlet:/htdocs/images/manifest.json}'/>",
>>>>>>                         "<meta name='msapplication-TileColor'
>>>>>> content='#ffffff'/>",
>>>>>>                         "<meta name='msapplication-TileImage'
>>>>>> content='$U{servlet:/htdocs/images/ms-icon-144x144.png}'/>",
>>>>>>                         "<meta name='theme-color' content='#ffffff'/>"
>>>>>>                 },
>>>>>>                 header={
>>>>>>                 "<h1>$R{servletTitle}</h1>",
>>>>>>                 "<h2>$R{methodSummary,$R{servletDescription}}</h2>",
>>>>>>                 "<a href='https://www.rocketsoftware.com'><img
>>>>>> src='$U{servlet:/htdocs/images/ram.png}'
>>>>>> style='position:absolute;top:5;right:5;background-color:tran
>>>>>> sparent;height:30px'/></a>"
>>>>>>         },
>>>>>> widgets={
>>>>>> ContentTypeMenuItem.class,
>>>>>> StyleMenuItem.class,
>>>>>> },
>>>>>> navlinks={
>>>>>> "options: servlet:/?method=OPTIONS",
>>>>>>         "$W{ContentTypeMenuItem}"
>>>>>> }
>>>>>> ),
>>>>>> children={
>>>>>> ConfigResource.class,
>>>>>> LogsResource.class
>>>>>> }
>>>>>> // @formatter:on
>>>>>> )
>>>>>> public class AdminRootResources extends ResourceGroup {
>>>>>> ...
>>>>>>     @RestMethod(name = GET, path = PATH_STATUS, summary = "Status",
>>>>>> description = "Gets status for the running system.")
>>>>>>     public Map<String, Object> getStatus() {
>>>>>> ...
>>>>>>
>>>>>> Thank you,
>>>>>> Gary
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <garydgregory@gmail.com
>>>>>>> > wrote:
>>>>>>>
>>>>>>>> Hi All:
>>>>>>>>
>>>>>>>> I want to return _standard_ JSON (see json.org) when no Accept
>>>>>>>> header is sent to my @RestResource class. I cannot seem to get that to work
>>>>>>>> no matter what. I get Juneau's non-standard single quote JSON.
>>>>>>>>
>>>>>>>> Standard JSON uses double quotes, not single quotes.
>>>>>>>>
>>>>>>>> If I specify 'application/json' in the Accept, then I do get
>>>>>>>> standard JSON.
>>>>>>>>
>>>>>>>> I cannot get this to work no matter what I try in my class's
>>>>>>>> @RestResource's serializer attribute.
>>>>>>>>
>>>>>>>> I also want to support the normal set of serializers so users can
>>>>>>>> specify any Accept header value Juneau supports.
>>>>>>>>
>>>>>>>> Thank you,
>>>>>>>> Gary
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Re: How to get a class to return standard JSON as the default

Posted by James Bognar <ja...@gmail.com>.
Yea, unfortunately it's not that simple.  I'm still investigating though.

On Fri, Feb 9, 2018 at 2:15 PM, Gary Gregory <ga...@gmail.com> wrote:

> On Fri, Feb 9, 2018 at 11:06 AM, James Bognar <ja...@apache.org>
> wrote:
>
>> I'll have to look further on how to support that.  It's kind of a
>> can-of-worms.
>>
>> We can't simply go by order of the serializers because HtmlDocSerializer
>> is listed first because some versions of IE do not specify "text/html" in
>> their Accept header.
>>
>> This is the Accept header for Internet Explorer:
>> image/jpeg, application/x-ms-application, image/gif,
>> application/xaml+xml, image/pjpeg, application/x-ms-xbap,
>> application/x-shockwave-flash, application/msword, */*
>>
>> And the heuristics for matching are complex.  For example, the Accept
>> header could contain id properties (e.g. "application/activity+json",
>>
>> https://www.w3.org/TR/activitypub/#retrieving-objects).
>>
>>
>> Examples:
>>
>>    - "Accept: application/json" should match "application/json" before
>>    "application/json+simple".
>>    - "Accept: application/json+simple" should match
>>    "application/json+simple" before "application/json".
>>    - "Accept application/json+activity" should match "application/json"
>>    before "application/json+simple".
>>    - "Accept: */json" should match  "application/json" before
>>    "application/json+simple".
>>    - "Accept: application/*" should match ???
>>
>> Well, this is a nasty pickle.
>
> If I add my own "serializers" and put JSON first:
>
>                         serializers={
>                                 JsonSerializer.class,
>                                 JsonSerializer.Simple.class,
>                                 JsonSchemaSerializer.class,
>                                 HtmlDocSerializer.class,
>                                 HtmlStrippedDocSerializer.class,
>                                 HtmlSchemaDocSerializer.class,
>                                 XmlDocSerializer.class,
>                                 XmlSchemaDocSerializer.class,
>                                 UonSerializer.class,
>                                 UrlEncodingSerializer.class,
>                                 MsgPackSerializer.class,
>                                 SoapXmlSerializer.class,
>                                 PlainTextSerializer.class
>                         },
>
> And and let Postman use Accept */*,I still get JSON with single quotes.
> Is there no way to get JSON with double quotes?
>
> Gary
>
>
>> On Fri, Feb 9, 2018 at 12:43 PM, Gary Gregory <ga...@gmail.com>
>> wrote:
>>
>>>
>>>
>>> On Fri, Feb 9, 2018 at 9:40 AM, James Bognar <ja...@apache.org>
>>> wrote:
>>>
>>>> Just tried Postman....it too specifies "Accept: */*" as a default
>>>> value.  If you specify Accept as a single space, it appears to work.
>>>>
>>>
>>> Hi James,
>>>
>>> I think I am getting closer. How do I get "*/*" to map to
>>> "application/json" in @RestResource as opposed the the HTML table I get
>>> now?
>>>
>>> Gary
>>>
>>>
>>>> If you add ?debug=true to your URL, the request will get logged to the
>>>> console so that you can see the actual incoming request:
>>>>
>>>>  [2018.02.09 11:39:22 WARNING]
>>>>
>>>> === HTTP Request (incoming) ==============================
>>>> ======================
>>>>
>>>> HTTP GET /?debug=true
>>>>
>>>> ---Headers---
>>>>
>>>> Cookie: JSESSIONID=node01siuixuu8fdsh1hm4a6dqe3lyg2.node0
>>>>
>>>> Cache-Control: no-cache
>>>>
>>>> Accept: */*
>>>>
>>>> Connection: keep-alive
>>>>
>>>> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)
>>>> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36
>>>>
>>>> Host: localhost:10000
>>>>
>>>> Postman-Token: 2b9124b3-1393-0e96-b052-edac7be1e8dd
>>>>
>>>> Accept-Encoding: gzip, deflate, br
>>>>
>>>> Accept-Language: en-US,en;q=0.9
>>>>
>>>> ---Default Servlet Headers---
>>>>
>>>> accept: application/json
>>>>
>>>>
>>>> === END ============================================================
>>>> ============
>>>>
>>>>
>>>> On Fri, Feb 9, 2018 at 11:25 AM, Gary Gregory <ga...@gmail.com>
>>>> wrote:
>>>>
>>>>> On Fri, Feb 9, 2018 at 7:51 AM, James Bognar <ja...@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Hi Gary,
>>>>>>
>>>>>> Try using a default request header:
>>>>>>
>>>>>> @RestResource(
>>>>>>
>>>>>> defaultRequestHeaders= {
>>>>>>
>>>>>> "Accept: application/json"
>>>>>>
>>>>>> },
>>>>>>
>>>>>> )
>>>>>>
>>>>>> I'll take a closer look at how "no" Accept header is handled.  I
>>>>>> think it depends on what tool you're using.  Poster for example sends
>>>>>> "Accept: */*" if you don't specify a value, and that might return a
>>>>>> somewhat-random result.
>>>>>>
>>>>>
>>>>> That does not work for me sadly. Here a snipet of my service that extends
>>>>> ResourceGroup. I am using Postman 5.5.2. I am getting back an HTML table
>>>>> for my service.
>>>>>
>>>>> @RestResource(
>>>>> // @formatter:off
>>>>> path="/",
>>>>> title="Access & Connectivity Agent Microservice",
>>>>> description="Administration",
>>>>>         defaultRequestHeaders= {
>>>>>                 "Accept: application/json"
>>>>> },
>>>>> htmldoc=@HtmlDoc(
>>>>>                 head={
>>>>>                         "<link rel='apple-touch-icon' sizes='57x57'
>>>>> href='$U{servlet:/htdocs/images/apple-icon-57x57.png}'/>",
>>>>>                         "<link rel='apple-touch-icon' sizes='60x60'
>>>>> href='$U{servlet:/htdocs/images/apple-icon-60x60.png}'/>",
>>>>>                         "<link rel='apple-touch-icon' sizes='72x72'
>>>>> href='$U{servlet:/htdocs/images/apple-icon-72x72.png}'/>",
>>>>>                         "<link rel='apple-touch-icon' sizes='76x76'
>>>>> href='$U{servlet:/htdocs/images/apple-icon-76x76.png}'/>",
>>>>>                         "<link rel='apple-touch-icon' sizes='114x114'
>>>>> href='$U{servlet:/htdocs/images/apple-icon-114x114.png}'/>",
>>>>>                         "<link rel='apple-touch-icon' sizes='120x120'
>>>>> href='$U{servlet:/htdocs/images/apple-icon-120x120.png}'/>",
>>>>>                         "<link rel='apple-touch-icon' sizes='144x144'
>>>>> href='$U{servlet:/htdocs/images/apple-icon-144x144.png}'/>",
>>>>>                         "<link rel='apple-touch-icon' sizes='152x152'
>>>>> href='$U{servlet:/htdocs/images/apple-icon-152x152.png}'/>",
>>>>>                         "<link rel='apple-touch-icon' sizes='180x180'
>>>>> href='$U{servlet:/htdocs/images/apple-icon-180x180.png}'/>",
>>>>>                         "<link rel='icon' type='image/png'
>>>>> sizes='192x192'  href='$U{servlet:/htdocs/image
>>>>> s/android-icon-192x192.png}'/>",
>>>>>                         "<link rel='icon' type='image/png'
>>>>> sizes='32x32' href='$U{servlet:/htdocs/images/favicon-32x32.png}'/>",
>>>>>                         "<link rel='icon' type='image/png'
>>>>> sizes='96x96' href='$U{servlet:/htdocs/images/favicon-96x96.png}'/>",
>>>>>                         "<link rel='icon' type='image/png'
>>>>> sizes='16x16' href='$U{servlet:/htdocs/images/favicon-16x16.png}'/>",
>>>>>                         "<link rel='manifest'
>>>>> href='$U{servlet:/htdocs/images/manifest.json}'/>",
>>>>>                         "<meta name='msapplication-TileColor'
>>>>> content='#ffffff'/>",
>>>>>                         "<meta name='msapplication-TileImage'
>>>>> content='$U{servlet:/htdocs/images/ms-icon-144x144.png}'/>",
>>>>>                         "<meta name='theme-color' content='#ffffff'/>"
>>>>>                 },
>>>>>                 header={
>>>>>                 "<h1>$R{servletTitle}</h1>",
>>>>>                 "<h2>$R{methodSummary,$R{servletDescription}}</h2>",
>>>>>                 "<a href='https://www.rocketsoftware.com'><img
>>>>> src='$U{servlet:/htdocs/images/ram.png}'
>>>>> style='position:absolute;top:5;right:5;background-color:tran
>>>>> sparent;height:30px'/></a>"
>>>>>         },
>>>>> widgets={
>>>>> ContentTypeMenuItem.class,
>>>>> StyleMenuItem.class,
>>>>> },
>>>>> navlinks={
>>>>> "options: servlet:/?method=OPTIONS",
>>>>>         "$W{ContentTypeMenuItem}"
>>>>> }
>>>>> ),
>>>>> children={
>>>>> ConfigResource.class,
>>>>> LogsResource.class
>>>>> }
>>>>> // @formatter:on
>>>>> )
>>>>> public class AdminRootResources extends ResourceGroup {
>>>>> ...
>>>>>     @RestMethod(name = GET, path = PATH_STATUS, summary = "Status",
>>>>> description = "Gets status for the running system.")
>>>>>     public Map<String, Object> getStatus() {
>>>>> ...
>>>>>
>>>>> Thank you,
>>>>> Gary
>>>>>
>>>>>
>>>>>>
>>>>>> On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <ga...@gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Hi All:
>>>>>>>
>>>>>>> I want to return _standard_ JSON (see json.org) when no Accept
>>>>>>> header is sent to my @RestResource class. I cannot seem to get that to work
>>>>>>> no matter what. I get Juneau's non-standard single quote JSON.
>>>>>>>
>>>>>>> Standard JSON uses double quotes, not single quotes.
>>>>>>>
>>>>>>> If I specify 'application/json' in the Accept, then I do get
>>>>>>> standard JSON.
>>>>>>>
>>>>>>> I cannot get this to work no matter what I try in my class's
>>>>>>> @RestResource's serializer attribute.
>>>>>>>
>>>>>>> I also want to support the normal set of serializers so users can
>>>>>>> specify any Accept header value Juneau supports.
>>>>>>>
>>>>>>> Thank you,
>>>>>>> Gary
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Re: How to get a class to return standard JSON as the default

Posted by Gary Gregory <ga...@gmail.com>.
On Fri, Feb 9, 2018 at 11:06 AM, James Bognar <ja...@apache.org>
wrote:

> I'll have to look further on how to support that.  It's kind of a
> can-of-worms.
>
> We can't simply go by order of the serializers because HtmlDocSerializer
> is listed first because some versions of IE do not specify "text/html" in
> their Accept header.
>
> This is the Accept header for Internet Explorer:
> image/jpeg, application/x-ms-application, image/gif, application/xaml+xml,
> image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash,
> application/msword, */*
>
> And the heuristics for matching are complex.  For example, the Accept
> header could contain id properties (e.g. "application/activity+json",
>
> https://www.w3.org/TR/activitypub/#retrieving-objects).
>
>
> Examples:
>
>    - "Accept: application/json" should match "application/json" before
>    "application/json+simple".
>    - "Accept: application/json+simple" should match "application/json+simple"
>    before "application/json".
>    - "Accept application/json+activity" should match "application/json"
>    before "application/json+simple".
>    - "Accept: */json" should match  "application/json" before
>    "application/json+simple".
>    - "Accept: application/*" should match ???
>
> Well, this is a nasty pickle.

If I add my own "serializers" and put JSON first:

                        serializers={
                                JsonSerializer.class,
                                JsonSerializer.Simple.class,
                                JsonSchemaSerializer.class,
                                HtmlDocSerializer.class,
                                HtmlStrippedDocSerializer.class,
                                HtmlSchemaDocSerializer.class,
                                XmlDocSerializer.class,
                                XmlSchemaDocSerializer.class,
                                UonSerializer.class,
                                UrlEncodingSerializer.class,
                                MsgPackSerializer.class,
                                SoapXmlSerializer.class,
                                PlainTextSerializer.class
                        },

And and let Postman use Accept */*,I still get JSON with single quotes. Is
there no way to get JSON with double quotes?

Gary


> On Fri, Feb 9, 2018 at 12:43 PM, Gary Gregory <ga...@gmail.com>
> wrote:
>
>>
>>
>> On Fri, Feb 9, 2018 at 9:40 AM, James Bognar <ja...@apache.org>
>> wrote:
>>
>>> Just tried Postman....it too specifies "Accept: */*" as a default
>>> value.  If you specify Accept as a single space, it appears to work.
>>>
>>
>> Hi James,
>>
>> I think I am getting closer. How do I get "*/*" to map to
>> "application/json" in @RestResource as opposed the the HTML table I get
>> now?
>>
>> Gary
>>
>>
>>> If you add ?debug=true to your URL, the request will get logged to the
>>> console so that you can see the actual incoming request:
>>>
>>>  [2018.02.09 11:39:22 WARNING]
>>>
>>> === HTTP Request (incoming) ==============================
>>> ======================
>>>
>>> HTTP GET /?debug=true
>>>
>>> ---Headers---
>>>
>>> Cookie: JSESSIONID=node01siuixuu8fdsh1hm4a6dqe3lyg2.node0
>>>
>>> Cache-Control: no-cache
>>>
>>> Accept: */*
>>>
>>> Connection: keep-alive
>>>
>>> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)
>>> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36
>>>
>>> Host: localhost:10000
>>>
>>> Postman-Token: 2b9124b3-1393-0e96-b052-edac7be1e8dd
>>>
>>> Accept-Encoding: gzip, deflate, br
>>>
>>> Accept-Language: en-US,en;q=0.9
>>>
>>> ---Default Servlet Headers---
>>>
>>> accept: application/json
>>>
>>>
>>> === END ============================================================
>>> ============
>>>
>>>
>>> On Fri, Feb 9, 2018 at 11:25 AM, Gary Gregory <ga...@gmail.com>
>>> wrote:
>>>
>>>> On Fri, Feb 9, 2018 at 7:51 AM, James Bognar <ja...@gmail.com>
>>>> wrote:
>>>>
>>>>> Hi Gary,
>>>>>
>>>>> Try using a default request header:
>>>>>
>>>>> @RestResource(
>>>>>
>>>>> defaultRequestHeaders= {
>>>>>
>>>>> "Accept: application/json"
>>>>>
>>>>> },
>>>>>
>>>>> )
>>>>>
>>>>> I'll take a closer look at how "no" Accept header is handled.  I think
>>>>> it depends on what tool you're using.  Poster for example sends "Accept:
>>>>> */*" if you don't specify a value, and that might return a somewhat-random
>>>>> result.
>>>>>
>>>>
>>>> That does not work for me sadly. Here a snipet of my service that extends
>>>> ResourceGroup. I am using Postman 5.5.2. I am getting back an HTML table
>>>> for my service.
>>>>
>>>> @RestResource(
>>>> // @formatter:off
>>>> path="/",
>>>> title="Access & Connectivity Agent Microservice",
>>>> description="Administration",
>>>>         defaultRequestHeaders= {
>>>>                 "Accept: application/json"
>>>> },
>>>> htmldoc=@HtmlDoc(
>>>>                 head={
>>>>                         "<link rel='apple-touch-icon' sizes='57x57'
>>>> href='$U{servlet:/htdocs/images/apple-icon-57x57.png}'/>",
>>>>                         "<link rel='apple-touch-icon' sizes='60x60'
>>>> href='$U{servlet:/htdocs/images/apple-icon-60x60.png}'/>",
>>>>                         "<link rel='apple-touch-icon' sizes='72x72'
>>>> href='$U{servlet:/htdocs/images/apple-icon-72x72.png}'/>",
>>>>                         "<link rel='apple-touch-icon' sizes='76x76'
>>>> href='$U{servlet:/htdocs/images/apple-icon-76x76.png}'/>",
>>>>                         "<link rel='apple-touch-icon' sizes='114x114'
>>>> href='$U{servlet:/htdocs/images/apple-icon-114x114.png}'/>",
>>>>                         "<link rel='apple-touch-icon' sizes='120x120'
>>>> href='$U{servlet:/htdocs/images/apple-icon-120x120.png}'/>",
>>>>                         "<link rel='apple-touch-icon' sizes='144x144'
>>>> href='$U{servlet:/htdocs/images/apple-icon-144x144.png}'/>",
>>>>                         "<link rel='apple-touch-icon' sizes='152x152'
>>>> href='$U{servlet:/htdocs/images/apple-icon-152x152.png}'/>",
>>>>                         "<link rel='apple-touch-icon' sizes='180x180'
>>>> href='$U{servlet:/htdocs/images/apple-icon-180x180.png}'/>",
>>>>                         "<link rel='icon' type='image/png'
>>>> sizes='192x192'  href='$U{servlet:/htdocs/image
>>>> s/android-icon-192x192.png}'/>",
>>>>                         "<link rel='icon' type='image/png'
>>>> sizes='32x32' href='$U{servlet:/htdocs/images/favicon-32x32.png}'/>",
>>>>                         "<link rel='icon' type='image/png'
>>>> sizes='96x96' href='$U{servlet:/htdocs/images/favicon-96x96.png}'/>",
>>>>                         "<link rel='icon' type='image/png'
>>>> sizes='16x16' href='$U{servlet:/htdocs/images/favicon-16x16.png}'/>",
>>>>                         "<link rel='manifest'
>>>> href='$U{servlet:/htdocs/images/manifest.json}'/>",
>>>>                         "<meta name='msapplication-TileColor'
>>>> content='#ffffff'/>",
>>>>                         "<meta name='msapplication-TileImage'
>>>> content='$U{servlet:/htdocs/images/ms-icon-144x144.png}'/>",
>>>>                         "<meta name='theme-color' content='#ffffff'/>"
>>>>                 },
>>>>                 header={
>>>>                 "<h1>$R{servletTitle}</h1>",
>>>>                 "<h2>$R{methodSummary,$R{servletDescription}}</h2>",
>>>>                 "<a href='https://www.rocketsoftware.com'><img
>>>> src='$U{servlet:/htdocs/images/ram.png}' style='position:absolute;top:5
>>>> ;right:5;background-color:transparent;height:30px'/></a>"
>>>>         },
>>>> widgets={
>>>> ContentTypeMenuItem.class,
>>>> StyleMenuItem.class,
>>>> },
>>>> navlinks={
>>>> "options: servlet:/?method=OPTIONS",
>>>>         "$W{ContentTypeMenuItem}"
>>>> }
>>>> ),
>>>> children={
>>>> ConfigResource.class,
>>>> LogsResource.class
>>>> }
>>>> // @formatter:on
>>>> )
>>>> public class AdminRootResources extends ResourceGroup {
>>>> ...
>>>>     @RestMethod(name = GET, path = PATH_STATUS, summary = "Status",
>>>> description = "Gets status for the running system.")
>>>>     public Map<String, Object> getStatus() {
>>>> ...
>>>>
>>>> Thank you,
>>>> Gary
>>>>
>>>>
>>>>>
>>>>> On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <ga...@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Hi All:
>>>>>>
>>>>>> I want to return _standard_ JSON (see json.org) when no Accept
>>>>>> header is sent to my @RestResource class. I cannot seem to get that to work
>>>>>> no matter what. I get Juneau's non-standard single quote JSON.
>>>>>>
>>>>>> Standard JSON uses double quotes, not single quotes.
>>>>>>
>>>>>> If I specify 'application/json' in the Accept, then I do get standard
>>>>>> JSON.
>>>>>>
>>>>>> I cannot get this to work no matter what I try in my class's
>>>>>> @RestResource's serializer attribute.
>>>>>>
>>>>>> I also want to support the normal set of serializers so users can
>>>>>> specify any Accept header value Juneau supports.
>>>>>>
>>>>>> Thank you,
>>>>>> Gary
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>

Re: How to get a class to return standard JSON as the default

Posted by James Bognar <ja...@apache.org>.
I'll have to look further on how to support that.  It's kind of a
can-of-worms.

We can't simply go by order of the serializers because HtmlDocSerializer is
listed first because some versions of IE do not specify "text/html" in
their Accept header.

This is the Accept header for Internet Explorer:
image/jpeg, application/x-ms-application, image/gif, application/xaml+xml,
image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash,
application/msword, */*

And the heuristics for matching are complex.  For example, the Accept
header could contain id properties (e.g. "application/activity+json",

https://www.w3.org/TR/activitypub/#retrieving-objects).


Examples:

   - "Accept: application/json" should match "application/json" before
   "application/json+simple".
   - "Accept: application/json+simple" should match "application/json+simple"
   before "application/json".
   - "Accept application/json+activity" should match "application/json"
   before "application/json+simple".
   - "Accept: */json" should match  "application/json" before
   "application/json+simple".
   - "Accept: application/*" should match ???


On Fri, Feb 9, 2018 at 12:43 PM, Gary Gregory <ga...@gmail.com>
wrote:

>
>
> On Fri, Feb 9, 2018 at 9:40 AM, James Bognar <ja...@apache.org>
> wrote:
>
>> Just tried Postman....it too specifies "Accept: */*" as a default value.
>> If you specify Accept as a single space, it appears to work.
>>
>
> Hi James,
>
> I think I am getting closer. How do I get "*/*" to map to
> "application/json" in @RestResource as opposed the the HTML table I get
> now?
>
> Gary
>
>
>> If you add ?debug=true to your URL, the request will get logged to the
>> console so that you can see the actual incoming request:
>>
>>  [2018.02.09 11:39:22 WARNING]
>>
>> === HTTP Request (incoming) ==============================
>> ======================
>>
>> HTTP GET /?debug=true
>>
>> ---Headers---
>>
>> Cookie: JSESSIONID=node01siuixuu8fdsh1hm4a6dqe3lyg2.node0
>>
>> Cache-Control: no-cache
>>
>> Accept: */*
>>
>> Connection: keep-alive
>>
>> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)
>> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36
>>
>> Host: localhost:10000
>>
>> Postman-Token: 2b9124b3-1393-0e96-b052-edac7be1e8dd
>>
>> Accept-Encoding: gzip, deflate, br
>>
>> Accept-Language: en-US,en;q=0.9
>>
>> ---Default Servlet Headers---
>>
>> accept: application/json
>>
>>
>> === END ============================================================
>> ============
>>
>>
>> On Fri, Feb 9, 2018 at 11:25 AM, Gary Gregory <ga...@gmail.com>
>> wrote:
>>
>>> On Fri, Feb 9, 2018 at 7:51 AM, James Bognar <ja...@gmail.com>
>>> wrote:
>>>
>>>> Hi Gary,
>>>>
>>>> Try using a default request header:
>>>>
>>>> @RestResource(
>>>>
>>>> defaultRequestHeaders= {
>>>>
>>>> "Accept: application/json"
>>>>
>>>> },
>>>>
>>>> )
>>>>
>>>> I'll take a closer look at how "no" Accept header is handled.  I think
>>>> it depends on what tool you're using.  Poster for example sends "Accept:
>>>> */*" if you don't specify a value, and that might return a somewhat-random
>>>> result.
>>>>
>>>
>>> That does not work for me sadly. Here a snipet of my service that extends
>>> ResourceGroup. I am using Postman 5.5.2. I am getting back an HTML table
>>> for my service.
>>>
>>> @RestResource(
>>> // @formatter:off
>>> path="/",
>>> title="Access & Connectivity Agent Microservice",
>>> description="Administration",
>>>         defaultRequestHeaders= {
>>>                 "Accept: application/json"
>>> },
>>> htmldoc=@HtmlDoc(
>>>                 head={
>>>                         "<link rel='apple-touch-icon' sizes='57x57'
>>> href='$U{servlet:/htdocs/images/apple-icon-57x57.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='60x60'
>>> href='$U{servlet:/htdocs/images/apple-icon-60x60.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='72x72'
>>> href='$U{servlet:/htdocs/images/apple-icon-72x72.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='76x76'
>>> href='$U{servlet:/htdocs/images/apple-icon-76x76.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='114x114'
>>> href='$U{servlet:/htdocs/images/apple-icon-114x114.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='120x120'
>>> href='$U{servlet:/htdocs/images/apple-icon-120x120.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='144x144'
>>> href='$U{servlet:/htdocs/images/apple-icon-144x144.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='152x152'
>>> href='$U{servlet:/htdocs/images/apple-icon-152x152.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='180x180'
>>> href='$U{servlet:/htdocs/images/apple-icon-180x180.png}'/>",
>>>                         "<link rel='icon' type='image/png'
>>> sizes='192x192'  href='$U{servlet:/htdocs/image
>>> s/android-icon-192x192.png}'/>",
>>>                         "<link rel='icon' type='image/png' sizes='32x32'
>>> href='$U{servlet:/htdocs/images/favicon-32x32.png}'/>",
>>>                         "<link rel='icon' type='image/png' sizes='96x96'
>>> href='$U{servlet:/htdocs/images/favicon-96x96.png}'/>",
>>>                         "<link rel='icon' type='image/png' sizes='16x16'
>>> href='$U{servlet:/htdocs/images/favicon-16x16.png}'/>",
>>>                         "<link rel='manifest'
>>> href='$U{servlet:/htdocs/images/manifest.json}'/>",
>>>                         "<meta name='msapplication-TileColor'
>>> content='#ffffff'/>",
>>>                         "<meta name='msapplication-TileImage'
>>> content='$U{servlet:/htdocs/images/ms-icon-144x144.png}'/>",
>>>                         "<meta name='theme-color' content='#ffffff'/>"
>>>                 },
>>>                 header={
>>>                 "<h1>$R{servletTitle}</h1>",
>>>                 "<h2>$R{methodSummary,$R{servletDescription}}</h2>",
>>>                 "<a href='https://www.rocketsoftware.com'><img
>>> src='$U{servlet:/htdocs/images/ram.png}' style='position:absolute;top:5
>>> ;right:5;background-color:transparent;height:30px'/></a>"
>>>         },
>>> widgets={
>>> ContentTypeMenuItem.class,
>>> StyleMenuItem.class,
>>> },
>>> navlinks={
>>> "options: servlet:/?method=OPTIONS",
>>>         "$W{ContentTypeMenuItem}"
>>> }
>>> ),
>>> children={
>>> ConfigResource.class,
>>> LogsResource.class
>>> }
>>> // @formatter:on
>>> )
>>> public class AdminRootResources extends ResourceGroup {
>>> ...
>>>     @RestMethod(name = GET, path = PATH_STATUS, summary = "Status",
>>> description = "Gets status for the running system.")
>>>     public Map<String, Object> getStatus() {
>>> ...
>>>
>>> Thank you,
>>> Gary
>>>
>>>
>>>>
>>>> On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <ga...@gmail.com>
>>>> wrote:
>>>>
>>>>> Hi All:
>>>>>
>>>>> I want to return _standard_ JSON (see json.org) when no Accept header
>>>>> is sent to my @RestResource class. I cannot seem to get that to work no
>>>>> matter what. I get Juneau's non-standard single quote JSON.
>>>>>
>>>>> Standard JSON uses double quotes, not single quotes.
>>>>>
>>>>> If I specify 'application/json' in the Accept, then I do get standard
>>>>> JSON.
>>>>>
>>>>> I cannot get this to work no matter what I try in my class's
>>>>> @RestResource's serializer attribute.
>>>>>
>>>>> I also want to support the normal set of serializers so users can
>>>>> specify any Accept header value Juneau supports.
>>>>>
>>>>> Thank you,
>>>>> Gary
>>>>>
>>>>
>>>>
>>>
>>
>

Re: How to get a class to return standard JSON as the default

Posted by Gary Gregory <ga...@gmail.com>.
On Fri, Feb 9, 2018 at 9:40 AM, James Bognar <ja...@apache.org> wrote:

> Just tried Postman....it too specifies "Accept: */*" as a default value.
> If you specify Accept as a single space, it appears to work.
>

Hi James,

I think I am getting closer. How do I get "*/*" to map to
"application/json" in @RestResource as opposed the the HTML table I get now?

Gary


> If you add ?debug=true to your URL, the request will get logged to the
> console so that you can see the actual incoming request:
>
>  [2018.02.09 11:39:22 WARNING]
>
> === HTTP Request (incoming) ==============================
> ======================
>
> HTTP GET /?debug=true
>
> ---Headers---
>
> Cookie: JSESSIONID=node01siuixuu8fdsh1hm4a6dqe3lyg2.node0
>
> Cache-Control: no-cache
>
> Accept: */*
>
> Connection: keep-alive
>
> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)
> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36
>
> Host: localhost:10000
>
> Postman-Token: 2b9124b3-1393-0e96-b052-edac7be1e8dd
>
> Accept-Encoding: gzip, deflate, br
>
> Accept-Language: en-US,en;q=0.9
>
> ---Default Servlet Headers---
>
> accept: application/json
>
>
> === END ============================================================
> ============
>
>
> On Fri, Feb 9, 2018 at 11:25 AM, Gary Gregory <ga...@gmail.com>
> wrote:
>
>> On Fri, Feb 9, 2018 at 7:51 AM, James Bognar <ja...@gmail.com>
>> wrote:
>>
>>> Hi Gary,
>>>
>>> Try using a default request header:
>>>
>>> @RestResource(
>>>
>>> defaultRequestHeaders= {
>>>
>>> "Accept: application/json"
>>>
>>> },
>>>
>>> )
>>>
>>> I'll take a closer look at how "no" Accept header is handled.  I think
>>> it depends on what tool you're using.  Poster for example sends "Accept:
>>> */*" if you don't specify a value, and that might return a somewhat-random
>>> result.
>>>
>>
>> That does not work for me sadly. Here a snipet of my service that extends
>> ResourceGroup. I am using Postman 5.5.2. I am getting back an HTML table
>> for my service.
>>
>> @RestResource(
>> // @formatter:off
>> path="/",
>> title="Access & Connectivity Agent Microservice",
>> description="Administration",
>>         defaultRequestHeaders= {
>>                 "Accept: application/json"
>> },
>> htmldoc=@HtmlDoc(
>>                 head={
>>                         "<link rel='apple-touch-icon' sizes='57x57'
>> href='$U{servlet:/htdocs/images/apple-icon-57x57.png}'/>",
>>                         "<link rel='apple-touch-icon' sizes='60x60'
>> href='$U{servlet:/htdocs/images/apple-icon-60x60.png}'/>",
>>                         "<link rel='apple-touch-icon' sizes='72x72'
>> href='$U{servlet:/htdocs/images/apple-icon-72x72.png}'/>",
>>                         "<link rel='apple-touch-icon' sizes='76x76'
>> href='$U{servlet:/htdocs/images/apple-icon-76x76.png}'/>",
>>                         "<link rel='apple-touch-icon' sizes='114x114'
>> href='$U{servlet:/htdocs/images/apple-icon-114x114.png}'/>",
>>                         "<link rel='apple-touch-icon' sizes='120x120'
>> href='$U{servlet:/htdocs/images/apple-icon-120x120.png}'/>",
>>                         "<link rel='apple-touch-icon' sizes='144x144'
>> href='$U{servlet:/htdocs/images/apple-icon-144x144.png}'/>",
>>                         "<link rel='apple-touch-icon' sizes='152x152'
>> href='$U{servlet:/htdocs/images/apple-icon-152x152.png}'/>",
>>                         "<link rel='apple-touch-icon' sizes='180x180'
>> href='$U{servlet:/htdocs/images/apple-icon-180x180.png}'/>",
>>                         "<link rel='icon' type='image/png'
>> sizes='192x192'  href='$U{servlet:/htdocs/image
>> s/android-icon-192x192.png}'/>",
>>                         "<link rel='icon' type='image/png' sizes='32x32'
>> href='$U{servlet:/htdocs/images/favicon-32x32.png}'/>",
>>                         "<link rel='icon' type='image/png' sizes='96x96'
>> href='$U{servlet:/htdocs/images/favicon-96x96.png}'/>",
>>                         "<link rel='icon' type='image/png' sizes='16x16'
>> href='$U{servlet:/htdocs/images/favicon-16x16.png}'/>",
>>                         "<link rel='manifest'
>> href='$U{servlet:/htdocs/images/manifest.json}'/>",
>>                         "<meta name='msapplication-TileColor'
>> content='#ffffff'/>",
>>                         "<meta name='msapplication-TileImage'
>> content='$U{servlet:/htdocs/images/ms-icon-144x144.png}'/>",
>>                         "<meta name='theme-color' content='#ffffff'/>"
>>                 },
>>                 header={
>>                 "<h1>$R{servletTitle}</h1>",
>>                 "<h2>$R{methodSummary,$R{servletDescription}}</h2>",
>>                 "<a href='https://www.rocketsoftware.com'><img
>> src='$U{servlet:/htdocs/images/ram.png}' style='position:absolute;top:5
>> ;right:5;background-color:transparent;height:30px'/></a>"
>>         },
>> widgets={
>> ContentTypeMenuItem.class,
>> StyleMenuItem.class,
>> },
>> navlinks={
>> "options: servlet:/?method=OPTIONS",
>>         "$W{ContentTypeMenuItem}"
>> }
>> ),
>> children={
>> ConfigResource.class,
>> LogsResource.class
>> }
>> // @formatter:on
>> )
>> public class AdminRootResources extends ResourceGroup {
>> ...
>>     @RestMethod(name = GET, path = PATH_STATUS, summary = "Status",
>> description = "Gets status for the running system.")
>>     public Map<String, Object> getStatus() {
>> ...
>>
>> Thank you,
>> Gary
>>
>>
>>>
>>> On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <ga...@gmail.com>
>>> wrote:
>>>
>>>> Hi All:
>>>>
>>>> I want to return _standard_ JSON (see json.org) when no Accept header
>>>> is sent to my @RestResource class. I cannot seem to get that to work no
>>>> matter what. I get Juneau's non-standard single quote JSON.
>>>>
>>>> Standard JSON uses double quotes, not single quotes.
>>>>
>>>> If I specify 'application/json' in the Accept, then I do get standard
>>>> JSON.
>>>>
>>>> I cannot get this to work no matter what I try in my class's
>>>> @RestResource's serializer attribute.
>>>>
>>>> I also want to support the normal set of serializers so users can
>>>> specify any Accept header value Juneau supports.
>>>>
>>>> Thank you,
>>>> Gary
>>>>
>>>
>>>
>>
>

Re: How to get a class to return standard JSON as the default

Posted by James Bognar <ja...@apache.org>.
Just tried Postman....it too specifies "Accept: */*" as a default value.
If you specify Accept as a single space, it appears to work.

If you add ?debug=true to your URL, the request will get logged to the
console so that you can see the actual incoming request:

 [2018.02.09 11:39:22 WARNING]

=== HTTP Request (incoming)
====================================================

HTTP GET /?debug=true

---Headers---

Cookie: JSESSIONID=node01siuixuu8fdsh1hm4a6dqe3lyg2.node0

Cache-Control: no-cache

Accept: */*

Connection: keep-alive

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36

Host: localhost:10000

Postman-Token: 2b9124b3-1393-0e96-b052-edac7be1e8dd

Accept-Encoding: gzip, deflate, br

Accept-Language: en-US,en;q=0.9

---Default Servlet Headers---

accept: application/json


=== END
========================================================================


On Fri, Feb 9, 2018 at 11:25 AM, Gary Gregory <ga...@gmail.com>
wrote:

> On Fri, Feb 9, 2018 at 7:51 AM, James Bognar <ja...@gmail.com>
> wrote:
>
>> Hi Gary,
>>
>> Try using a default request header:
>>
>> @RestResource(
>>
>> defaultRequestHeaders= {
>>
>> "Accept: application/json"
>>
>> },
>>
>> )
>>
>> I'll take a closer look at how "no" Accept header is handled.  I think it
>> depends on what tool you're using.  Poster for example sends "Accept: */*"
>> if you don't specify a value, and that might return a somewhat-random
>> result.
>>
>
> That does not work for me sadly. Here a snipet of my service that extends
> ResourceGroup. I am using Postman 5.5.2. I am getting back an HTML table
> for my service.
>
> @RestResource(
> // @formatter:off
> path="/",
> title="Access & Connectivity Agent Microservice",
> description="Administration",
>         defaultRequestHeaders= {
>                 "Accept: application/json"
> },
> htmldoc=@HtmlDoc(
>                 head={
>                         "<link rel='apple-touch-icon' sizes='57x57'
> href='$U{servlet:/htdocs/images/apple-icon-57x57.png}'/>",
>                         "<link rel='apple-touch-icon' sizes='60x60'
> href='$U{servlet:/htdocs/images/apple-icon-60x60.png}'/>",
>                         "<link rel='apple-touch-icon' sizes='72x72'
> href='$U{servlet:/htdocs/images/apple-icon-72x72.png}'/>",
>                         "<link rel='apple-touch-icon' sizes='76x76'
> href='$U{servlet:/htdocs/images/apple-icon-76x76.png}'/>",
>                         "<link rel='apple-touch-icon' sizes='114x114'
> href='$U{servlet:/htdocs/images/apple-icon-114x114.png}'/>",
>                         "<link rel='apple-touch-icon' sizes='120x120'
> href='$U{servlet:/htdocs/images/apple-icon-120x120.png}'/>",
>                         "<link rel='apple-touch-icon' sizes='144x144'
> href='$U{servlet:/htdocs/images/apple-icon-144x144.png}'/>",
>                         "<link rel='apple-touch-icon' sizes='152x152'
> href='$U{servlet:/htdocs/images/apple-icon-152x152.png}'/>",
>                         "<link rel='apple-touch-icon' sizes='180x180'
> href='$U{servlet:/htdocs/images/apple-icon-180x180.png}'/>",
>                         "<link rel='icon' type='image/png'
> sizes='192x192'  href='$U{servlet:/htdocs/images/android-icon-192x192.
> png}'/>",
>                         "<link rel='icon' type='image/png' sizes='32x32'
> href='$U{servlet:/htdocs/images/favicon-32x32.png}'/>",
>                         "<link rel='icon' type='image/png' sizes='96x96'
> href='$U{servlet:/htdocs/images/favicon-96x96.png}'/>",
>                         "<link rel='icon' type='image/png' sizes='16x16'
> href='$U{servlet:/htdocs/images/favicon-16x16.png}'/>",
>                         "<link rel='manifest' href='$U{servlet:/htdocs/
> images/manifest.json}'/>",
>                         "<meta name='msapplication-TileColor'
> content='#ffffff'/>",
>                         "<meta name='msapplication-TileImage'
> content='$U{servlet:/htdocs/images/ms-icon-144x144.png}'/>",
>                         "<meta name='theme-color' content='#ffffff'/>"
>                 },
>                 header={
>                 "<h1>$R{servletTitle}</h1>",
>                 "<h2>$R{methodSummary,$R{servletDescription}}</h2>",
>                 "<a href='https://www.rocketsoftware.com'><img
> src='$U{servlet:/htdocs/images/ram.png}' style='position:absolute;top:
> 5;right:5;background-color:transparent;height:30px'/></a>"
>         },
> widgets={
> ContentTypeMenuItem.class,
> StyleMenuItem.class,
> },
> navlinks={
> "options: servlet:/?method=OPTIONS",
>         "$W{ContentTypeMenuItem}"
> }
> ),
> children={
> ConfigResource.class,
> LogsResource.class
> }
> // @formatter:on
> )
> public class AdminRootResources extends ResourceGroup {
> ...
>     @RestMethod(name = GET, path = PATH_STATUS, summary = "Status",
> description = "Gets status for the running system.")
>     public Map<String, Object> getStatus() {
> ...
>
> Thank you,
> Gary
>
>
>>
>> On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <ga...@gmail.com>
>> wrote:
>>
>>> Hi All:
>>>
>>> I want to return _standard_ JSON (see json.org) when no Accept header
>>> is sent to my @RestResource class. I cannot seem to get that to work no
>>> matter what. I get Juneau's non-standard single quote JSON.
>>>
>>> Standard JSON uses double quotes, not single quotes.
>>>
>>> If I specify 'application/json' in the Accept, then I do get standard
>>> JSON.
>>>
>>> I cannot get this to work no matter what I try in my class's
>>> @RestResource's serializer attribute.
>>>
>>> I also want to support the normal set of serializers so users can
>>> specify any Accept header value Juneau supports.
>>>
>>> Thank you,
>>> Gary
>>>
>>
>>
>

Re: How to get a class to return standard JSON as the default

Posted by Gary Gregory <ga...@gmail.com>.
On Fri, Feb 9, 2018 at 7:51 AM, James Bognar <ja...@gmail.com> wrote:

> Hi Gary,
>
> Try using a default request header:
>
> @RestResource(
>
> defaultRequestHeaders= {
>
> "Accept: application/json"
>
> },
>
> )
>
> I'll take a closer look at how "no" Accept header is handled.  I think it
> depends on what tool you're using.  Poster for example sends "Accept: */*"
> if you don't specify a value, and that might return a somewhat-random
> result.
>

That does not work for me sadly. Here a snipet of my service that extends
ResourceGroup. I am using Postman 5.5.2. I am getting back an HTML table
for my service.

@RestResource(
// @formatter:off
path="/",
title="Access & Connectivity Agent Microservice",
description="Administration",
        defaultRequestHeaders= {
                "Accept: application/json"
},
htmldoc=@HtmlDoc(
                head={
                        "<link rel='apple-touch-icon' sizes='57x57'
href='$U{servlet:/htdocs/images/apple-icon-57x57.png}'/>",
                        "<link rel='apple-touch-icon' sizes='60x60'
href='$U{servlet:/htdocs/images/apple-icon-60x60.png}'/>",
                        "<link rel='apple-touch-icon' sizes='72x72'
href='$U{servlet:/htdocs/images/apple-icon-72x72.png}'/>",
                        "<link rel='apple-touch-icon' sizes='76x76'
href='$U{servlet:/htdocs/images/apple-icon-76x76.png}'/>",
                        "<link rel='apple-touch-icon' sizes='114x114'
href='$U{servlet:/htdocs/images/apple-icon-114x114.png}'/>",
                        "<link rel='apple-touch-icon' sizes='120x120'
href='$U{servlet:/htdocs/images/apple-icon-120x120.png}'/>",
                        "<link rel='apple-touch-icon' sizes='144x144'
href='$U{servlet:/htdocs/images/apple-icon-144x144.png}'/>",
                        "<link rel='apple-touch-icon' sizes='152x152'
href='$U{servlet:/htdocs/images/apple-icon-152x152.png}'/>",
                        "<link rel='apple-touch-icon' sizes='180x180'
href='$U{servlet:/htdocs/images/apple-icon-180x180.png}'/>",
                        "<link rel='icon' type='image/png' sizes='192x192'
href='$U{servlet:/htdocs/images/android-icon-192x192.png}'/>",
                        "<link rel='icon' type='image/png' sizes='32x32'
href='$U{servlet:/htdocs/images/favicon-32x32.png}'/>",
                        "<link rel='icon' type='image/png' sizes='96x96'
href='$U{servlet:/htdocs/images/favicon-96x96.png}'/>",
                        "<link rel='icon' type='image/png' sizes='16x16'
href='$U{servlet:/htdocs/images/favicon-16x16.png}'/>",
                        "<link rel='manifest'
href='$U{servlet:/htdocs/images/manifest.json}'/>",
                        "<meta name='msapplication-TileColor'
content='#ffffff'/>",
                        "<meta name='msapplication-TileImage'
content='$U{servlet:/htdocs/images/ms-icon-144x144.png}'/>",
                        "<meta name='theme-color' content='#ffffff'/>"
                },
                header={
                "<h1>$R{servletTitle}</h1>",
                "<h2>$R{methodSummary,$R{servletDescription}}</h2>",
                "<a href='https://www.rocketsoftware.com'><img
src='$U{servlet:/htdocs/images/ram.png}'
style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/></a>"
        },
widgets={
ContentTypeMenuItem.class,
StyleMenuItem.class,
},
navlinks={
"options: servlet:/?method=OPTIONS",
        "$W{ContentTypeMenuItem}"
}
),
children={
ConfigResource.class,
LogsResource.class
}
// @formatter:on
)
public class AdminRootResources extends ResourceGroup {
...
    @RestMethod(name = GET, path = PATH_STATUS, summary = "Status",
description = "Gets status for the running system.")
    public Map<String, Object> getStatus() {
...

Thank you,
Gary


>
> On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <ga...@gmail.com>
> wrote:
>
>> Hi All:
>>
>> I want to return _standard_ JSON (see json.org) when no Accept header is
>> sent to my @RestResource class. I cannot seem to get that to work no matter
>> what. I get Juneau's non-standard single quote JSON.
>>
>> Standard JSON uses double quotes, not single quotes.
>>
>> If I specify 'application/json' in the Accept, then I do get standard
>> JSON.
>>
>> I cannot get this to work no matter what I try in my class's
>> @RestResource's serializer attribute.
>>
>> I also want to support the normal set of serializers so users can specify
>> any Accept header value Juneau supports.
>>
>> Thank you,
>> Gary
>>
>
>

Re: How to get a class to return standard JSON as the default

Posted by James Bognar <ja...@gmail.com>.
Hi Gary,

Try using a default request header:

@RestResource(

defaultRequestHeaders= {

"Accept: application/json"

},

)

I'll take a closer look at how "no" Accept header is handled.  I think it
depends on what tool you're using.  Poster for example sends "Accept: */*"
if you don't specify a value, and that might return a somewhat-random
result.

On Thu, Feb 8, 2018 at 9:11 PM, Gary Gregory <ga...@gmail.com> wrote:

> Hi All:
>
> I want to return _standard_ JSON (see json.org) when no Accept header is
> sent to my @RestResource class. I cannot seem to get that to work no matter
> what. I get Juneau's non-standard single quote JSON.
>
> Standard JSON uses double quotes, not single quotes.
>
> If I specify 'application/json' in the Accept, then I do get standard JSON.
>
> I cannot get this to work no matter what I try in my class's
> @RestResource's serializer attribute.
>
> I also want to support the normal set of serializers so users can specify
> any Accept header value Juneau supports.
>
> Thank you,
> Gary
>