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 Fri, 23 Feb 2018 02:20:17 GMT
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 <jamesbognar@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 <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