目录

NoHttp的几个默认请求,例如StringRequestBitmapRequest全都是继承RestRequest<T>这个基类的,所以我们自定义请求的时候也要继承RestRequest<T>这个基类,泛型写你想请求的数据。

FastJsonRequest

例如我们用FastJsonJSONObject自定义一个请求。

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的方式来构造。
    // 默认使用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,比如这里还需要一个JavaBeanclass参数,那我们就在构造方法传入。
  • 使用方法
    其它使用方法和上面的NoHttp的原生使用方法一样,要注意的是,因为这里是你自己写的类,所以不能通过NoHttp.create...Request来写了,只能通过new的方式来构造。
    // 默认使用GET请求方法。
    JavaBeanRequest<UserInfo> request = new JavaBeanRequest<>(url, UserInfo.class);
    

// 或者指定请求方法。
JavaBeanRequest request = new JavaBeanRequest<>(url, RequestMethod.POST, GoodsInfo.class);