juneau-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gary Gregory <garydgreg...@gmail.com>
Subject Re: How to get a class to return standard JSON as the default
Date Wed, 14 Feb 2018 17:16:08 GMT
On Wed, Feb 14, 2018 at 7:21 AM, James Bognar <jamesbognar@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 <garydgregory@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
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

Mime
View raw message