You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@shindig.apache.org by "Henry Saputra (JIRA)" <ji...@apache.org> on 2010/09/30 09:06:34 UTC

[jira] Commented: (SHINDIG-1436) Shindig does not support returning a JSON array when format 'json' is selected on an osapi.http.get request.

    [ https://issues.apache.org/jira/browse/SHINDIG-1436?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12916396#action_12916396 ] 

Henry Saputra commented on SHINDIG-1436:
----------------------------------------

Please review proposed fix at http://codereview.appspot.com/2323043/

> Shindig does not support returning a JSON array when format 'json' is selected on an osapi.http.get request.
> ------------------------------------------------------------------------------------------------------------
>
>                 Key: SHINDIG-1436
>                 URL: https://issues.apache.org/jira/browse/SHINDIG-1436
>             Project: Shindig
>          Issue Type: Bug
>          Components: Java
>    Affects Versions: 2.0.0
>            Reporter: Craig McClanahan
>
> I am trying to use an osapi.http.get request to a JSON service that returns a JSON array with a collection of objects, rather than just a single object.
>     osapi.http.get({
>         href : 'http://www.example.com/customers',  // Returns an array of customer objects, so the first character in the response will be '['
>         format : 'json',
>         authz : 'none'
>     }).execute(function(response) {
>         ...
>     });
> Even though I can contact this service successfully with other clients, trying to access it via osapi.http.get with Shindig results in a status 406 response with message "Response not valid JSON" from the transformBody() method in HttpRequestHandler.java.  In turn, this is because the logic in this method tries to create a single JSON object out of the response text:
>   /** Format a response as JSON, including additional JSON inserted by chained content fetchers. */
>   protected Object transformBody(HttpApiRequest request, HttpResponse results)
>       throws GadgetException {
>     String body = results.getResponseAsString();
>     if ("feed".equalsIgnoreCase(request.format)) {
>       return processFeed(request, body);
>     } else if ("json".equalsIgnoreCase(request.format)) {
>       try {
>         return new JSONObject(body);
>       } catch (JSONException e) {
>         // TODO: include data block with invalid JSON
>         throw new ProtocolException(HttpServletResponse.SC_NOT_ACCEPTABLE, "Response not valid JSON", e);
>       }
>     }
>     
>     return body;
>   }
> The call to the JSONObject constructor will fail because the body text starts with "[" (because it is a JSON array), not "{".
> This behavior is inconsistent with my read of the OpenSocial 1.0 specification[1], which states that the "content" element of the response may contain either a JSON object or a JSON array:
>     If @format is "json", the parsed JSON object or array of the response.
> The proposed solution would be to check for the first non-whitespace character, and return new JSONArray(body) if it is a '[' character, instead of '{'.
> [1] http://opensocial-resources.googlecode.com/svn/spec/1.0/Core-Data.xml#rfc.section.2.9

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.