post请求-android Volley Post请求参数丢失

问题描述

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

解决方案

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

解决方案二:

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

解决方案三:

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

解决方案四:

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

解决方案五:

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

解决方案六:

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

解决方案七:


解决方案八:

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();
        }
时间: 2024-10-31 13:45:31

post请求-android Volley Post请求参数丢失的相关文章

android 网络请求库volley方法详解_Android

使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包   volley网络请求步骤:       1. 创建请求队列       RequestQueue queue = Volley.newRequestQueue(this);       2.创建请求对象(3种)                            StringRequest request = new StringRequest("

Android HTTP网络请求的异步实现_Android

前言 大家都知道网络操作的响应时间是不定的,所有的网络操作都应该放在一个异步操作中处理,而且为了模块解耦,我们希望网络操作由专门的类来处理.所有网络数据发送,数据接收都有某几个类来实现,外部其它模块只要调用和处理回调函数即可.外部模块和网络模块之间的调用关系可以用如下图表示: 调用端只要创建Request对象,设置参数,发起请求,即可.最后结果通过回调函数返回.右边的异步任务,HttpClient创建,参数解析,错误处理全部交给网络处理模块来完成.由此来看,这个网络模块其实是重复性很高的开发工作

android 网络请求库volley方法详解

使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包 volley网络请求步骤: 1. 创建请求队列       RequestQueue queue = Volley.newRequestQueue(this); 2.创建请求对象(3种) StringRequest request = new StringRequest("请求方法","请求的网络地址","成功的网

怎样请求参数-Android xutils put请求服务器

问题描述 Android xutils put请求服务器 Android xutils put请求服务器时,怎样传递参数 解决方案 传参尽量用post,传参尽量用post 解决方案二: 去参考master下提供的sample 解决方案三: 去参考下官方提供的例子

Android 网络请求框架Volley实例详解

Android 网络请求框架Volley实例详解 首先上效果图 Logcat日志信息on Reponse Volley特别适合数据量不大但是通信频繁的场景,像文件上传下载不适合! 首先第一步 用到的RequetQueue RequestQueue.Java RequestQueue请求队列首先得先说一下,ReuqestQueue是如何对请求进行管理的...RequestQueue是对所有的请求进行保存...然后通过自身的start()方法开启一个CacheDispatcher线程用于缓存调度,开

android http POST请求方式向服务其发送数据不成功 贴出代码求大神帮解决一下

问题描述 android http POST请求方式向服务其发送数据不成功 贴出代码求大神帮解决一下 new Thread(new Runnable() { @Override public void run() { String szSrc = ""abcdefghijkl123456789123"" ; byte[] encoded = ThreeDes.encryptMode(keyBytes szSrc.getBytes()); try { /* Strin

android 发送post请求 PHP那边收到却是get消息

问题描述 android 发送post请求 PHP那边收到却是get消息 请求的代码是这样: List<NameValuePair> list = new ArrayList<NameValuePair>();list.add(new BasicNameValuePair(""username"" name));list.add(new BasicNameValuePair(""password"" p

代码-android 登陆与请求服务器问题

问题描述 android 登陆与请求服务器问题 我第一次登陆,后台返回全部的json数据,但是第二次登陆,后台却只返回之前登陆的那个数据,是怎么回事呢,是后台数据问题,还是我的代码写错了呢,我只是请求服务器而已啊 解决方案 缓存数据吗.跟踪调试看看.不确定可以没次登录后清空变量 解决方案二: Android向服务器发送请求时的中文乱码问题Android学习笔记:Android向服务器发送请求时的中文乱码问题Android学习笔记:Android向服务器发送请求时的中文乱码问题 解决方案三: co

android 发送http请求

Android 发送http请求 (1)发送post请求 Java代码   Map<String,String> person = new HashMap<String,String>();   person.put("os_version", SystemHWUtil.formatArr(version, ","));                   person.put("client_id", IMEI2);