# 目录
[TOC]
NoHttp的几个默认请求,例如`StringRequest`、`BitmapRequest`全都是继承`RestRequest<T>`这个基类的,所以我们自定义请求的时候也要继承`RestRequest<T>`这个基类,泛型写你想请求的数据。
# FastJsonRequest
例如我们用`FastJson`的`JSONObject`自定义一个请求。
```java
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()`方法的说明
1. 这里要把byte[] body解析成Sting,一般我们用`String s = new String(body);`解析。
2. 但是服务器发送的数据有编码,所以我们要分析`header`中的`contentType`的编码是`utf-8`还是`gbk`或者其它,为了避免每个`request`都要解析`String`,作者在`StringRequest`写了一个静态方法统一解析,有疑问的人看点击进去看源码。
3. 拿到String之后,利用FastJson把数据解析成`JSONObject`对象。当然这里可以直接解析成JavaBean,请往下看。
* 使用方法
其它使用方法和上面的NoHttp的原生使用方法一样,要注意的是,因为这里是你自己写的类,所以不能通过`NoHttp.create...Request`来写了,只能通过`new`的方式来构造。
```java
// 默认使用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()`方法的说明
1. 和上面自定FastJson一样,先要把数据解析成String。
2. 接着利用FastJson把String解析成我们想要的`JavaBean`,比如这里还需要一个`JavaBean`的`class`参数,那我们就在构造方法传入。
* 使用方法
其它使用方法和上面的NoHttp的原生使用方法一样,要注意的是,因为这里是你自己写的类,所以不能通过`NoHttp.create...Request`来写了,只能通过`new`的方式来构造。
```java
// 默认使用GET请求方法。
JavaBeanRequest<UserInfo> request = new JavaBeanRequest<>(url, UserInfo.class);
// 或者指定请求方法。
JavaBeanRequest<GoodsInfo> request = new JavaBeanRequest<>(url, RequestMethod.POST, GoodsInfo.class);
```