1d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru/*
2d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Copyright (C) 2011 The Android Open Source Project
3d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru *
4d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Licensed under the Apache License, Version 2.0 (the "License");
5d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * you may not use this file except in compliance with the License.
6d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * You may obtain a copy of the License at
7d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru *
8d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru *      http://www.apache.org/licenses/LICENSE-2.0
9d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru *
10d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Unless required by applicable law or agreed to in writing, software
11d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * distributed under the License is distributed on an "AS IS" BASIS,
12d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * See the License for the specific language governing permissions and
14d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * limitations under the License.
15d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */
16d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
17d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Querupackage com.android.volley.toolbox;
18d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
19d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.NetworkResponse;
20d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.ParseError;
21d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.Response;
22d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.Response.ErrorListener;
23d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.Response.Listener;
24d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
25d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport org.json.JSONException;
26d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport org.json.JSONObject;
27d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
28d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport java.io.UnsupportedEncodingException;
29d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
30d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru/**
31d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * A request for retrieving a {@link JSONObject} response body at a given URL, allowing for an
32d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * optional {@link JSONObject} to be passed in as part of the request body.
33d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */
34d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Querupublic class JsonObjectRequest extends JsonRequest<JSONObject> {
35d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
36d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    /**
37d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru     * Creates a new request.
38e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     * @param method the HTTP method to use
39d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru     * @param url URL to fetch the JSON from
40d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru     * @param jsonRequest A {@link JSONObject} to post with the request. Null is allowed and
41d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru     *   indicates no parameters will be posted along with request.
42d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru     * @param listener Listener to receive the JSON response
43d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru     * @param errorListener Error listener, or null to ignore errors.
44d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru     */
45e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    public JsonObjectRequest(int method, String url, JSONObject jsonRequest,
46e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru            Listener<JSONObject> listener, ErrorListener errorListener) {
47e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru        super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
48e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru                    errorListener);
49e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    }
50e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru
51e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    /**
52e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     * Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is
53e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     * <code>null</code>, <code>POST</code> otherwise.
54e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     *
55e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     * @see #JsonObjectRequest(int, String, JSONObject, Listener, ErrorListener)
56e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     */
57d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public JsonObjectRequest(String url, JSONObject jsonRequest, Listener<JSONObject> listener,
58d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru            ErrorListener errorListener) {
59e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru        this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest,
60e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru                listener, errorListener);
61d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
62d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
63d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    @Override
64d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
65d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        try {
666bafd7d28fc7947f263feb7134fc8a70084357c3Zdeněk Kořán            String jsonString = new String(response.data,
676bafd7d28fc7947f263feb7134fc8a70084357c3Zdeněk Kořán                    HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
68d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru            return Response.success(new JSONObject(jsonString),
69d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru                    HttpHeaderParser.parseCacheHeaders(response));
70d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        } catch (UnsupportedEncodingException e) {
71d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru            return Response.error(new ParseError(e));
72d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        } catch (JSONException je) {
73d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru            return Response.error(new ParseError(je));
74d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        }
75d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
76d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru}
77