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