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, 09 Feb 2018 18:06:13 GMT
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 ???


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/images/apple-icon-57x57.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='60x60'
>>> href='$U{servlet:/htdocs/images/apple-icon-60x60.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='72x72'
>>> href='$U{servlet:/htdocs/images/apple-icon-72x72.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='76x76'
>>> href='$U{servlet:/htdocs/images/apple-icon-76x76.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='114x114'
>>> href='$U{servlet:/htdocs/images/apple-icon-114x114.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='120x120'
>>> href='$U{servlet:/htdocs/images/apple-icon-120x120.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='144x144'
>>> href='$U{servlet:/htdocs/images/apple-icon-144x144.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='152x152'
>>> href='$U{servlet:/htdocs/images/apple-icon-152x152.png}'/>",
>>>                         "<link rel='apple-touch-icon' sizes='180x180'
>>> href='$U{servlet:/htdocs/images/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/images/favicon-32x32.png}'/>",
>>>                         "<link rel='icon' type='image/png' sizes='96x96'
>>> href='$U{servlet:/htdocs/images/favicon-96x96.png}'/>",
>>>                         "<link rel='icon' type='image/png' sizes='16x16'
>>> href='$U{servlet:/htdocs/images/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{servletDescription}}</h2>",
>>>                 "<a href='https://www.rocketsoftware.com'><img
>>> src='$U{servlet:/htdocs/images/ram.png}' style='position:absolute;top:5
>>> ;right:5;background-color:transparent;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