# 目录 [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); ```