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.Request;
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 Queruimport com.android.volley.VolleyLog;
25d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
26d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport java.io.UnsupportedEncodingException;
27d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
28d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru/**
29d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * A request for retrieving a T type response body at a given URL that also
30d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * optionally sends along a JSON body in the request specified.
31d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru *
32d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * @param <T> JSON type of response expected
33d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */
34d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Querupublic abstract class JsonRequest<T> extends Request<T> {
356bafd7d28fc7947f263feb7134fc8a70084357c3Zdeněk Kořán    /** Default charset for JSON request. */
366bafd7d28fc7947f263feb7134fc8a70084357c3Zdeněk Kořán    protected static final String PROTOCOL_CHARSET = "utf-8";
37d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
38d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    /** Content type for request. */
39d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    private static final String PROTOCOL_CONTENT_TYPE =
40d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        String.format("application/json; charset=%s", PROTOCOL_CHARSET);
41d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
42d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    private final Listener<T> mListener;
43d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    private final String mRequestBody;
44d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
45e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    /**
46e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     * Deprecated constructor for a JsonRequest which defaults to GET unless {@link #getPostBody()}
47e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     * or {@link #getPostParams()} is overridden (which defaults to POST).
48e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     *
49e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     * @deprecated Use {@link #JsonRequest(int, String, String, Listener, ErrorListener)}.
50e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     */
51d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public JsonRequest(String url, String requestBody, Listener<T> listener,
52d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru            ErrorListener errorListener) {
53e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru        this(Method.DEPRECATED_GET_OR_POST, url, requestBody, listener, errorListener);
54e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    }
55e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru
56e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    public JsonRequest(int method, String url, String requestBody, Listener<T> listener,
57e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru            ErrorListener errorListener) {
58e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru        super(method, url, errorListener);
59d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        mListener = listener;
60d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        mRequestBody = requestBody;
61d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
62d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
63d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    @Override
64d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    protected void deliverResponse(T response) {
65d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        mListener.onResponse(response);
66d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
67d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
68d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    @Override
69d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    abstract protected Response<T> parseNetworkResponse(NetworkResponse response);
70d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
71e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    /**
72e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     * @deprecated Use {@link #getBodyContentType()}.
73e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     */
74d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    @Override
75d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public String getPostBodyContentType() {
76e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru        return getBodyContentType();
77d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
78d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
79e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    /**
80e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     * @deprecated Use {@link #getBody()}.
81e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru     */
82d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    @Override
83d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public byte[] getPostBody() {
84e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru        return getBody();
85e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    }
86e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru
87e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    @Override
88e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    public String getBodyContentType() {
89e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru        return PROTOCOL_CONTENT_TYPE;
90e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    }
91e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru
92e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    @Override
93e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru    public byte[] getBody() {
94d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        try {
95d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru            return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);
96d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        } catch (UnsupportedEncodingException uee) {
97d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru            VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
98d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru                    mRequestBody, PROTOCOL_CHARSET);
99d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru            return null;
100d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        }
101d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
102d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru}
103