自定义的Request
package cn.flymeal.androidApp.http;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;
import com.google.gson.Gson;
/**
@param
*/
public class GsonRequest extends Request {
private static final String PROTOCOL_CHARSET = "utf-8";
private static final String PROTOCOL_CONTENT_TYPE = String.format(
"application/json; charset=%s", PROTOCOL_CHARSET);
private Gson mGson;
private final Listener mListener;
private Map mParams=new HashMap(); ;
private Class mClass;
private Map headers = new HashMap();
public GsonRequest(int method, String url, Class cls,
Map params, Map headers,
Listener listener, ErrorListener errorListener) {
super(method, url, errorListener);
mGson = new Gson();
mClass = cls;
mListener = listener;
mParams = params;
this.headers = headers;
}
/**
将返回的数据处理
*/
@Override
protected Response parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
T parseJson = mGson.fromJson(jsonString, mClass);
return Response.success(parseJson,
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}
@Override
public Map getHeaders() throws AuthFailureError {
return headers != null ? headers : super.getHeaders();
}
public void setHeaders(Map headers) {
this.headers = headers;
}
@Override
public String getBodyContentType() {
return PROTOCOL_CONTENT_TYPE;
}
@Override
protected Map getParams() throws AuthFailureError {
return mParams;
}
}
这是分装好的一个发送请求的方法
/**
* 基于Gson的网络Volley请求(新接口返回数据格式Volley请求)
*
* @param method
* @param url
* @param params
* @param requestListener
*/
public void executeGsonRequest(int method, String url,
Map params, Map headers,
final RequestListener requestListener) {
requestListener.onStart();
request = new GsonRequest<ResponseData>(method, url, ResponseData.class,
params, headers, new Listener<ResponseData>() {
@Override
public void onResponse(ResponseData response) {
if (response.getStatus().equals("success")) {
requestListener.onSuccess(response.getData());
Log.i("volley", response.toString());
} else {
requestListener.onMessage(response.getMsg());
}
closeDialog();
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
if (error instanceof NetworkError) {
} else if (error instanceof ServerError) {
} else if (error instanceof AuthFailureError) {
} else if (error instanceof ParseError) {
} else if (error instanceof NoConnectionError) {
} else if (error instanceof TimeoutError) {
}
requestListener.onError(error);
closeDialog();
}
});
requestQueue.add(request);
}
public void checkNum(Context context,String str,RequestListener requestListener){
UrlParamJoin urlJoin=new UrlParamJoin("mvc/order/api/mobile/submitOrder.do");
Map<String, String> headers=new HashMap<String, String>();
headers.put(GlobalConstant.API_VERSION, "v3");
Map<String, String> param=new HashMap<String, String>();
param.put("orderStr", str);
FlymealHttpClient httpClient=new FlymealHttpClient(context);
httpClient.executeGsonRequest(Method.POST, urlJoin.getUrl(), param, headers, requestListener);
}
这是一个业务方法 求大神指导为什么POST请求参数没有传过去 ?在线等!!!1
有些版本的volley只支持StringRequest,然后参数以getParams形式传入,提交方式为GET,楼主试一下吧,应该可以
我也遇到同样的问题 解决不了 不是语法错误,也不是没有加http://前缀, 请问LZ找到原因了吗
我也遇到同样的问题 解决不了,请问楼主有答案了吗?
如果这里要传输大量的参数恐怕就要出问题了吧!
如果这里要传输大量的参数恐怕就要出问题了吧!
@Override
public String getBodyContentType() {
//return super.getBodyContentType();//父类是applicaton/json,表示请求参数是json体,但是服务器不支持
return String.format("application/x-www-form-urlencoded; charset=%s", "utf-8");
}
##2 请求参数不要传 json了,需要把它转成key-value格式
{"a":"v1","b":"v2"} 转成 a=v1&b=v2
调用构造方法时,不要调用post参数为json的,而是string的那个即可
stringrequest 和jsonrequest传单参数是有区别的. stringrequest是可以重写getparam来传递参数,但后者重写没有效果,因为volley底层代码导致,你可以重写 public String getBodyContentType() {
return "application/x-www-form-urlencoded; charset=" + this.getParamsEncoding();
}
public byte[] getBody() {
Map params = getParams();
return params != null && params.size() > 0 ? encodeParameters(params, this.getParamsEncoding()) : null;
}
@Override
protected Map<String, String> getParams() {
return requestBean.getParmMap();
}