juneau-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From James Bognar <jamesbog...@apache.org>
Subject Re: How to get a class to return standard JSON as the default
Date Wed, 14 Feb 2018 14:21:13 GMT
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 <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