1717import java .io .UnsupportedEncodingException ;
1818import java .lang .reflect .Field ;
1919import java .lang .reflect .Modifier ;
20+ import java .lang .reflect .Type ;
2021import java .net .HttpURLConnection ;
2122import java .net .URL ;
2223import java .net .URLEncoder ;
@@ -211,8 +212,13 @@ public static RuntimeException createException(HttpURLConnection res, int respon
211212 }
212213 }
213214
214- public <TResponse > TResponse send (HttpURLConnection req , Class responseClass ) {
215+ public <TResponse > TResponse send (HttpURLConnection req , Object responseClass ) {
215216 try {
217+ Class resClass = responseClass instanceof Class ? (Class )responseClass : null ;
218+ Type resType = responseClass instanceof Type ? (Type )responseClass : null ;
219+ if (resClass == null && resType == null )
220+ throw new RuntimeException ("responseClass '" + responseClass .getClass ().getSimpleName () + "' must be a Class or Type" );
221+
216222 int responseCode = req .getResponseCode ();
217223 if (responseCode >= 400 ){
218224 RuntimeException ex = createException (req , responseCode );
@@ -226,18 +232,32 @@ public <TResponse> TResponse send(HttpURLConnection req, Class responseClass) {
226232 throw ex ;
227233 }
228234
235+ if (RequestFilter != null ) {
236+ RequestFilter .exec (req );
237+ }
238+
239+ if (GlobalRequestFilter != null ) {
240+ GlobalRequestFilter .exec (req );
241+ }
242+
229243 InputStream is = req .getInputStream ();
230244
231245 if (Log .isDebugEnabled ()) {
232246 String json = Utils .readToEnd (is , UTF8 .name ());
233247 Log .d (json );
234248
235- TResponse response = (TResponse ) getGson ().fromJson (json , responseClass );
249+ TResponse response = resClass != null
250+ ? (TResponse ) getGson ().fromJson (json , resClass )
251+ : (TResponse ) getGson ().fromJson (json , resType );
252+
236253 return response ;
237254 }
238255 else {
239256 BufferedReader reader = new BufferedReader (new InputStreamReader (is ));
240- TResponse response = (TResponse ) getGson ().fromJson (reader , responseClass );
257+ TResponse response = resClass != null
258+ ? (TResponse ) getGson ().fromJson (reader , resClass )
259+ : (TResponse ) getGson ().fromJson (reader , resType );
260+
241261 reader .close ();
242262 return response ;
243263 }
@@ -263,15 +283,15 @@ private String resolveUrl(String relativeOrAbsoluteUrl) {
263283 @ Override
264284 public <TResponse > TResponse get (IReturn <TResponse > request ) {
265285 return send (
266- createRequest (createUrl (request ), HttpMethods .Get ),
267- request .getResponseType ());
286+ createRequest (createUrl (request ), HttpMethods .Get ),
287+ request .getResponseType ());
268288 }
269289
270290 @ Override
271291 public <TResponse > TResponse get (IReturn <TResponse > request , Map <String , String > queryParams ) {
272292 return send (
273- createRequest (createUrl (request , queryParams ), HttpMethods .Get ),
274- request .getResponseType ());
293+ createRequest (createUrl (request , queryParams ), HttpMethods .Get ),
294+ request .getResponseType ());
275295 }
276296
277297 @ Override
@@ -281,6 +301,13 @@ public <TResponse> TResponse get(String path, Class responseType) {
281301 responseType );
282302 }
283303
304+ @ Override
305+ public <TResponse > TResponse get (String path , Type responseType ) {
306+ return send (
307+ createRequest (resolveUrl (path ), HttpMethods .Get ),
308+ responseType );
309+ }
310+
284311 @ Override
285312 public HttpURLConnection get (String path ) {
286313 return createRequest (resolveUrl (path ), HttpMethods .Get );
@@ -300,13 +327,27 @@ public <TResponse> TResponse post(String path, Object request, Class responseTyp
300327 responseType );
301328 }
302329
330+ @ Override
331+ public <TResponse > TResponse post (String path , Object request , Type responseType ) {
332+ return send (
333+ createRequest (resolveUrl (path ), HttpMethods .Post , request ),
334+ responseType );
335+ }
336+
303337 @ Override
304338 public <TResponse > TResponse post (String path , byte [] requestBody , String contentType , Class responseType ) {
305339 return send (
306340 createRequest (resolveUrl (path ), HttpMethods .Post , requestBody , contentType ),
307341 responseType );
308342 }
309343
344+ @ Override
345+ public <TResponse > TResponse post (String path , byte [] requestBody , String contentType , Type responseType ) {
346+ return send (
347+ createRequest (resolveUrl (path ), HttpMethods .Post , requestBody , contentType ),
348+ responseType );
349+ }
350+
310351 @ Override
311352 public HttpURLConnection post (String path , byte [] requestBody , String contentType ) {
312353 return createRequest (resolveUrl (path ), HttpMethods .Post , requestBody , contentType );
@@ -326,13 +367,27 @@ public <TResponse> TResponse put(String path, Object request, Class responseType
326367 responseType );
327368 }
328369
370+ @ Override
371+ public <TResponse > TResponse put (String path , Object request , Type responseType ) {
372+ return send (
373+ createRequest (resolveUrl (path ), HttpMethods .Put , request ),
374+ responseType );
375+ }
376+
329377 @ Override
330378 public <TResponse > TResponse put (String path , byte [] requestBody , String contentType , Class responseType ) {
331379 return send (
332380 createRequest (resolveUrl (path ), HttpMethods .Put , requestBody , contentType ),
333381 responseType );
334382 }
335383
384+ @ Override
385+ public <TResponse > TResponse put (String path , byte [] requestBody , String contentType , Type responseType ) {
386+ return send (
387+ createRequest (resolveUrl (path ), HttpMethods .Put , requestBody , contentType ),
388+ responseType );
389+ }
390+
336391 @ Override
337392 public HttpURLConnection put (String path , byte [] requestBody , String contentType ) {
338393 return createRequest (resolveUrl (path ), HttpMethods .Put , requestBody , contentType );
@@ -359,6 +414,13 @@ public <TResponse> TResponse delete(String path, Class responseType) {
359414 responseType );
360415 }
361416
417+ @ Override
418+ public <TResponse > TResponse delete (String path , Type responseType ) {
419+ return send (
420+ createRequest (resolveUrl (path ), HttpMethods .Delete ),
421+ responseType );
422+ }
423+
362424 @ Override
363425 public HttpURLConnection delete (String path ) {
364426 return createRequest (resolveUrl (path ), HttpMethods .Delete );
0 commit comments