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.