例如我们用FastJson
的JSONObject
自定义一个请求。
public class FastJsonRequest extends RestRequest<JSONObject> {
public FastJsonRequest(String url) {
this(url, RequestMethod.GET);
}
public FastJsonRequest(String url, RequestMethod requestMethod) {
super(url, requestMethod);
// 设置Accept请求头,告诉服务器,我们需要application/json数据。
setAccept(Headers.HEAD_VALUE_ACCEPT_APPLICATION_JSON);
}
/**
* 解析服务器响应数据为你的泛型T,这里也就是JSONObject。
*
* @param responseHeaders 服务器响应头。
* @param responseBody 服务器响应包体。
* @return 返回你的泛型对象。
*/
@Override
public JSONObject parseResponse(Headers responseHeaders, byte[] responseBody) {
String result = StringRequest.parseResponseString(responseHeaders, responseBody);
return JSON.parseObject(result); // StringRequest就是少了这句话而已。
}
}
- 关于
parseResponse()
方法的说明- 这里要把byte[] body解析成Sting,一般我们用
String s = new String(body);
解析。 - 但是服务器发送的数据有编码,所以我们要分析
header
中的contentType
的编码是utf-8
还是gbk
或者其它,为了避免每个request
都要解析String
,作者在StringRequest
写了一个静态方法统一解析,有疑问的人看点击进去看源码。 - 拿到String之后,利用FastJson把数据解析成
JSONObject
对象。当然这里可以直接解析成JavaBean,请往下看。
- 这里要把byte[] body解析成Sting,一般我们用
- 使用方法
其它使用方法和上面的NoHttp的原生使用方法一样,要注意的是,因为这里是你自己写的类,所以不能通过NoHttp.create...Request
来写了,只能通过new
的方式来构造。// 默认使用GET请求方法。 FastJsonRequst request = new FastJsonRequest(url);
// 或者指定请求方法。
FastJsonRequst request = new FastJsonRequest(url, RequestMethod.POST);
# 请求JavaBean
1. 如果你没有看上面的自定FastJsonRequest,请先看过后再看自定义请求JavaBean会更容易理解。这里还是继承`RestRequest<T>`基类。
2. 这里先假设我们服务器返回的还是`json`类型的数据,如果是XML的话,利用[Simple](http://simple.sourceforge.net/)之类的工具解析。
```java
public class JavaBeanRequest<T> extends RestRequest<T> {
// 要解析的JavaBean的class。
private Class<T> clazz;
public JavaBeanRequest(String url, Class<T> clazz) {
this(url, RequestMethod.GET, clazz);
}
public JavaBeanRequest(String url, RequestMethod requestMethod, Class<T> clazz) {
super(url, requestMethod);
this.clazz = clazz;
}
@Override
public T parseResponse(Headers responseHeaders, byte[] responseBody) throws Throwable {
String response = StringRequest.parseResponseString(responseHeaders, responseBody);
// 这里如果数据格式错误,或者解析失败,会在失败的回调方法中返回 ParseError 异常。
return JSON.parseObject(response, clazz);
}
}
- 关于
parseResponse()
方法的说明- 和上面自定FastJson一样,先要把数据解析成String。
- 接着利用FastJson把String解析成我们想要的
JavaBean
,比如这里还需要一个JavaBean
的class
参数,那我们就在构造方法传入。
- 使用方法
其它使用方法和上面的NoHttp的原生使用方法一样,要注意的是,因为这里是你自己写的类,所以不能通过NoHttp.create...Request
来写了,只能通过new
的方式来构造。// 默认使用GET请求方法。 JavaBeanRequest<UserInfo> request = new JavaBeanRequest<>(url, UserInfo.class);
// 或者指定请求方法。
JavaBeanRequest request = new JavaBeanRequest<>(url, RequestMethod.POST, GoodsInfo.class);