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 Tue, 20 Feb 2018 21:23:27 GMT
On Wed, Feb 14, 2018 at 10:16 AM, Gary Gregory <garydgregory@gmail.com>
wrote:

>
>
> 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?
>>
>
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 <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