Skip to content

Commit aa6260e

Browse files
committed
Add overloads for ServiceClient to include Type for generic type info
1 parent 06b8c40 commit aa6260e

File tree

3 files changed

+83
-7
lines changed

3 files changed

+83
-7
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,33 @@
11
package net.servicestack.client;
22

3+
import java.lang.reflect.Type;
34
import java.net.HttpURLConnection;
45
import java.util.Map;
56

67
public interface AsyncServiceClient {
78
public <T> void getAsync(IReturn<T> request, final AsyncResult<T> asyncResult);
89
public <T> void getAsync(IReturn<T> request, final Map<String, String> queryParams, final AsyncResult<T> asyncResult);
910
public <T> void getAsync(String path, final Class responseType, final AsyncResult<T> asyncResult);
11+
public <T> void getAsync(String path, final Type responseType, final AsyncResult<T> asyncResult);
1012
public void getAsync(String path, final AsyncResult<HttpURLConnection> asyncResult);
1113

1214
public <T> void postAsync(IReturn<T> request, final AsyncResult<T> asyncResult);
1315
public <T> void postAsync(String path, final Object request, final Class responseType, final AsyncResult<T> asyncResult);
16+
public <T> void postAsync(String path, final Object request, final Type responseType, final AsyncResult<T> asyncResult);
1417
public <T> void postAsync(String path, final byte[] requestBody, final String contentType, final Class responseType, final AsyncResult<T> asyncResult);
18+
public <T> void postAsync(String path, final byte[] requestBody, final String contentType, final Type responseType, final AsyncResult<T> asyncResult);
1519
public void postAsync(String path, final byte[] requestBody, final String contentType, final AsyncResult<HttpURLConnection> asyncResult);
1620

1721
public <T> void putAsync(IReturn<T> request, final AsyncResult<T> asyncResult);
1822
public <T> void putAsync(String path, final Object request, final Class responseType, final AsyncResult<T> asyncResult);
23+
public <T> void putAsync(String path, final Object request, final Type responseType, final AsyncResult<T> asyncResult);
1924
public <T> void putAsync(String path, final byte[] requestBody, final String contentType, final Class responseType, final AsyncResult<T> asyncResult);
25+
public <T> void putAsync(String path, final byte[] requestBody, final String contentType, final Type responseType, final AsyncResult<T> asyncResult);
2026
public void putAsync(String path, final byte[] requestBody, final String contentType, final AsyncResult<HttpURLConnection> asyncResult);
2127

2228
public <T> void deleteAsync(IReturn<T> request, final AsyncResult<T> asyncResult);
2329
public <T> void deleteAsync(IReturn<T> request, final Map<String, String> queryParams, final AsyncResult<T> asyncResult);
2430
public <T> void deleteAsync(String path, final Class responseType, final AsyncResult<T> asyncResult);
31+
public <T> void deleteAsync(String path, final Type responseType, final AsyncResult<T> asyncResult);
2532
public void deleteAsync(String path, final AsyncResult<HttpURLConnection> asyncResult);
2633
}

src/AndroidClient/client/src/main/java/net/servicestack/client/JsonServiceClient.java

Lines changed: 69 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.io.UnsupportedEncodingException;
1818
import java.lang.reflect.Field;
1919
import java.lang.reflect.Modifier;
20+
import java.lang.reflect.Type;
2021
import java.net.HttpURLConnection;
2122
import java.net.URL;
2223
import 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);

src/AndroidClient/client/src/main/java/net/servicestack/client/ServiceClient.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,34 @@
22

33
package net.servicestack.client;
44

5+
import java.lang.reflect.Type;
56
import java.net.HttpURLConnection;
67
import java.util.Map;
78

89
public interface ServiceClient {
910
public <TResponse> TResponse get(IReturn<TResponse> request);
1011
public <TResponse> TResponse get(IReturn<TResponse> request, Map<String,String> queryParams);
1112
public <TResponse> TResponse get(String path, Class responseType);
13+
public <TResponse> TResponse get(String path, Type responseType);
1214
public HttpURLConnection get(String path);
1315

1416
public <TResponse> TResponse post(IReturn<TResponse> request);
1517
public <TResponse> TResponse post(String path, Object request, Class responseType);
18+
public <TResponse> TResponse post(String path, Object request, Type responseType);
1619
public <TResponse> TResponse post(String path, byte[] requestBody, String contentType, Class responseType);
20+
public <TResponse> TResponse post(String path, byte[] requestBody, String contentType, Type responseType);
1721
public HttpURLConnection post(String path, byte[] requestBody, String contentType);
1822

1923
public <TResponse> TResponse put(IReturn<TResponse> request);
2024
public <TResponse> TResponse put(String path, Object request, Class responseType);
25+
public <TResponse> TResponse put(String path, Object request, Type responseType);
2126
public <TResponse> TResponse put(String path, byte[] requestBody, String contentType, Class responseType);
27+
public <TResponse> TResponse put(String path, byte[] requestBody, String contentType, Type responseType);
2228
public HttpURLConnection put(String path, byte[] requestBody, String contentType);
2329

2430
public <TResponse> TResponse delete(IReturn<TResponse> request);
2531
public <TResponse> TResponse delete(IReturn<TResponse> request, Map<String,String> queryParams);
2632
public <TResponse> TResponse delete(String path, Class responseType);
33+
public <TResponse> TResponse delete(String path, Type responseType);
2734
public HttpURLConnection delete(String path);
2835
}

0 commit comments

Comments
 (0)