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, 21 Feb 2018 02:39:14 GMT
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 <garydgregory@gmail.com>
wrote:

> 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