public class ApiClient {
/**
* @param context
*
* @param requestQueue RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。
* RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,
* 这是非常浪费资源的, 在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。
*
* @param baseRequest
*
* @param apiClientCB
*
*/
public static void doRequest(final Context context, RequestQueue requestQueue, final BaseRequest baseRequest, final ApiClientCB apiClientCB) {
if (baseRequest.getRequestMethod().equals(AppConfig.GET_METHOD)) {
StringRequest request = new StringRequest(baseRequest.getCompleteUrl(baseRequest),
/** Callback interface for delivering parsed responses. */
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
BaseResponse baseResponse = BaseResponse.parseBase(response);
LogUtil.showBaseResponse(context, baseResponse);
if (apiClientCB != null) {
apiClientCB.responseSuccess(response);
// 0 | 1 | >1
if (baseResponse.getCode().equals("0")) {
apiClientCB.responseCode0(response);
} else if (baseResponse.getCode().equals("1")) {
apiClientCB.responseCode1(response);
} else {
apiClientCB.responseCodeMore1(response);
}
}
}
},
/** Callback interface for delivering error responses. */
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (apiClientCB != null) {
apiClientCB.responseFailed(error.getMessage());
}
}
});
// 执行HTTP get请求
requestQueue.add(request);
}
if (baseRequest.getRequestMethod().equals(AppConfig.POST_METHOD)) {
StringRequest request = new StringRequest(Method.POST, baseRequest.getCompleteUrl(baseRequest),
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
BaseResponse baseResponse = BaseResponse.parseBase(response);
LogUtil.showBaseResponse(context, baseResponse);
if (apiClientCB != null) {
apiClientCB.responseSuccess(response);
// 0 | 1 | >1
if (baseResponse.getCode().equals("0")) {
apiClientCB.responseCode0(response);
} else if (baseResponse.getCode().equals("1")) {
apiClientCB.responseCode1(response);
} else {
apiClientCB.responseCodeMore1(response);
}
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (apiClientCB != null) {
apiClientCB.responseFailed(error.getMessage());
}
}
}) {
/**
* 可是这只是指定了HTTP请求方式是POST,那么我们要提交给服务器的参数又该怎么设置呢?很遗憾,StringRequest中并没有提供设置POST参数的方法,
* 但是当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数,那么解决方法自然也就有了,
* 我们只需要在StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就可以了
*
*/
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return baseRequest.getParameters();
}
};
// 执行HTTP post请求
requestQueue.add(request);
}
}
}
简单的Get和Post封装。
好处:拿到的Response是String类型,数据格式灵活,方便调用端自行处理。
缺点:没有定制性的加入JsonBean的解析。(PS:JsonBean是本猫自己的叫法,意指Json对应的序列化Java简单对象)
BaseResponse猜测是题主自己定义的类。apiClientCB.responseCode0()不太明白用途。
而且本身Volley的默认Request类的content-type是表单类型,题主可以自己加入application/json和multipart/form-data,支持Json上传和文件上传(大文件慎用!!!)
volley本身不适合文件的上传和下载,不过很小的的文件也可以支持。如果觉得不爽可以用别的库实现。
建议看看Github上Volley的扩展库:
https://github.com/DWorkS/VolleyPlus(活跃)
https://github.com/anton46/IceNet(封装可以借鉴,不活跃)