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