2 zx0506 zx0506 于 2014.07.24 14:50 提问

android Volley Post请求参数丢失

自定义的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;

/**

  • 自定义网络请求(基于Volley)
  • @author zx
  • @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

8个回答

ft523039764
ft523039764   2015.01.07 16:13
已采纳

有些版本的volley只支持StringRequest,然后参数以getParams形式传入,提交方式为GET,楼主试一下吧,应该可以

hu007peng
hu007peng 请问下是否Volley就不能用POST了呢
大约 3 年之前 回复
wangjiajiawjj
wangjiajiawjj   2015.10.22 11:36

1 重写如下方法

@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的那个即可

xingye813
xingye813 感谢 解决了我的问题
大约 2 年之前 回复
hu007peng
hu007peng   2014.12.27 09:59

我也遇到同样的问题 解决不了 不是语法错误,也不是没有加http://前缀, 请问LZ找到原因了吗

tinggu
tinggu   2015.01.23 18:55

我也遇到同样的问题 解决不了,请问楼主有答案了吗?

snowhui0618
snowhui0618   2015.02.26 16:31

如果这里要传输大量的参数恐怕就要出问题了吧!

snowhui0618
snowhui0618   2015.02.26 16:31

如果这里要传输大量的参数恐怕就要出问题了吧!

houyimin2010
houyimin2010   2015.04.01 13:31

StringRequest方式post


houyimin2010
houyimin2010 StringRequest可以传递post参数
接近 3 年之前 回复
u013064077
u013064077   2016.03.16 18:28

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();
        }
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!