美文网首页Android开发
volley的Post请求几种方式

volley的Post请求几种方式

作者: 你的益达233 | 来源:发表于2021-07-06 18:26 被阅读0次

这几天帮网友解决volley请求的问题,才发现volley真的很难用。如果新项目就不要用volley网络框架了。旧项目能换则换吧

第一种:Params方式

这个是最简单的,就是Map。

PostJsonRequest

public class PostJsonRequest extends JsonObjectRequest implements INetToken {
private boolean needToken = true;


public static final int TYPE_API_QUGUANZHANG = 1;

public static final int TYPE_API_HUIJIEQIANBAO = 2;

private int type = TYPE_API_QUGUANZHANG;

private String productId = "1";

/**
 * 构造函数,初始化请求对象
 */
public PostJsonRequest(String url, JSONObject params, Listener<JSONObject> listener,
                       ErrorListener errorListener) {
    super(Method.POST, url, params, listener, errorListener);
    setRetryPolicy(new DefaultRetryPolicy(InterfaceConfig.SOCKET_TIMEOUT, InterfaceConfig.MAX_RETRIES, InterfaceConfig.BACK_OFF));
}

public PostJsonRequest(String url, JSONObject params, Listener<JSONObject> listener,
                       ErrorListener errorListener, int type, String productId) {
    super(Method.POST, url, params, listener, errorListener);
    setRetryPolicy(new DefaultRetryPolicy(InterfaceConfig.SOCKET_TIMEOUT, InterfaceConfig.MAX_RETRIES, InterfaceConfig.BACK_OFF));
    this.type = type;
    this.productId = productId;
}

/**
 * 重写参数编码方法
 */
@Override
protected String getParamsEncoding() {
    return InterfaceConfig.ENCODEING;
}

/**
 * 重写请求头获取方法
 */
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    Map<String, String> headers = new HashMap<String, String>();
    
    headers.put("version", String.valueOf(BuildConfig.VERSION_CODE));
   
    headers.put("User-Agent", Constants.USER_AGENT());

    return headers;
}

@Override
public void setNeedToken(boolean needToken) {
    this.needToken = needToken;
}

@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
    Response<JSONObject> superResponse = super.parseNetworkResponse(response);
    String authToken = response.headers.get("x-auth-token");
    if (CommonUtils.isNullOrEmpty(authToken)) {
        authToken = response.headers.get("newAccessToken");
    }
    if (!CommonUtils.isNullOrEmpty(authToken)) {
        HttpUtil.saveSession(authToken);
        CommonUtils.LOG_D(getClass(), "authToken = " + HttpUtil.sessionId);
    }

    return superResponse;
}


}

调用地方:

    public Request<JSONObject> doPostByJson(String url, JSONObject jsonObject,
RequestListener requestListener, boolean
isOpenProgressbar) {
Request<JSONObject> request = null;
try {
boolean needCache = jsonObject.optBoolean("needCache", false);
boolean readCache = jsonObject.optBoolean("readCache", false);

        jsonObject.remove("needCache");
        jsonObject.remove("readCache");
        String md5 = createKey(jsonObject, url);

        boolean netState = checkNetState();
        // 网络检查
        if (netState) {//有网络
            checkLocalCache(md5, requestListener, readCache);
        } else {
            checkLocalCache(md5, requestListener, needCache);
            TooltipUtils.showToastL(app, app.getString(R.string.net_error_check));
            return null;
        }

        if (isOpenProgressbar) {
            requestListener.onReqStart();
        }

        CommonUtils.LOG_D(getClass(), "url = %s,  params = %s", url, jsonObject.toString());
        PostJsonRequest postJsonRequest = new PostJsonRequest(url, jsonObject,
                new IMJsonListener(requestListener, context).setCacheKey(needCache ? md5 :
                        null),
                new IMErrorListenr(requestListener));

        ensureToken(jsonObject, postJsonRequest);

        queue.cancelAll(new SameRequestFilter(md5));
        request = queue.add(postJsonRequest);

        // 为请求添加context标记
        request.setTag(context);
    } catch (Exception e) {
        e.printStackTrace();

        requestListener.onError("创建连接错误");
        requestListener.onReqFinish();
    }
    return request;
}

这里就是key和value

 private JSONObject initCommonParams(Map<String, Object> params) {
    params.put("appVerison", BuildConfig.VERSION_NAME);
    params.put("channel", App.channel);
    JSONObject jsonObject = new JSONObject(params);
    return  jsonObject;
}  

第二种:请求参数是List<String>的json方式

文字不好表达,来看个postman模拟请求图吧

volley_list1.jpg

你看图不是key value结构,接口需要List<String>的json数据

PostJsonRequest2

public class PostJsonRequest2 extends JsonRequest<JSONObject> implements INetToken {
private boolean needToken = true;


public static final int TYPE_API_QUGUANZHANG = 1;

public static final int TYPE_API_HUIJIEQIANBAO = 2;

private int type = TYPE_API_QUGUANZHANG;

private String productId = "1";

/**
 * 构造函数,初始化请求对象
 */
public PostJsonRequest2(String url, JSONArray params, Listener<JSONObject> listener,
                        ErrorListener errorListener) {
    super(Request.Method.POST, url, params.toString(), listener, errorListener);
    setRetryPolicy(new DefaultRetryPolicy(InterfaceConfig.SOCKET_TIMEOUT, InterfaceConfig.MAX_RETRIES, InterfaceConfig.BACK_OFF));
}



public PostJsonRequest2(String url, JSONArray params, Listener<JSONObject> listener,
                        ErrorListener errorListener, int type, String productId) {
    super(Method.POST, url, params.toString(), listener, errorListener);
    setRetryPolicy(new DefaultRetryPolicy(InterfaceConfig.SOCKET_TIMEOUT, InterfaceConfig.MAX_RETRIES, InterfaceConfig.BACK_OFF));
    this.type = type;
    this.productId = productId;
}

/**
 * 重写参数编码方法
 */
@Override
protected String getParamsEncoding() {
    return InterfaceConfig.ENCODEING;
}

/**
 * 重写请求头获取方法
 */
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    Map<String, String> headers = new HashMap<String, String>();
    headers.put("Charsert", getParamsEncoding());

    headers.put("User-Agent", Constants.USER_AGENT());

    return headers;
}

@Override
public void setNeedToken(boolean needToken) {
    this.needToken = needToken;
}

@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {

    Response<JSONObject> superResponse;
    try {
        String jsonString = new String(response.data,
                HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
        superResponse = Response.success(new JSONObject(jsonString),
                HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        superResponse = Response.error(new ParseError(e));
    } catch (JSONException je) {
        superResponse = Response.error(new ParseError(je));
    }


    String authToken = response.headers.get("x-auth-token");
    if (CommonUtils.isNullOrEmpty(authToken)) {
        authToken = response.headers.get("newAccessToken");
    }
    if (!CommonUtils.isNullOrEmpty(authToken)) {
        HttpUtil.saveSession(authToken);
        CommonUtils.LOG_D(getClass(), "authToken = " + HttpUtil.sessionId);
    }

    return superResponse;
}



}

看到没,构造方法中用了JSONArray

调用地方:

public Request<JSONObject> doPostByJson(String url, JSONArray jsonObject,
                                        RequestListener requestListener, boolean
                                                isOpenProgressbar) {
    Request<JSONObject> request = null;
    try {

        if (isOpenProgressbar) {
            requestListener.onReqStart();
        }

        PostJsonRequest2 postJsonRequest = new PostJsonRequest2(url, jsonObject,
                new IMJsonListener(requestListener, context).setCacheKey(""),
                new IMErrorListenr(requestListener));

        request = queue.add(postJsonRequest);

        // 为请求添加context标记
        request.setTag(context);
    } catch (Exception e) {
        e.printStackTrace();

        requestListener.onError("创建连接错误");
        requestListener.onReqFinish();
    }
    return request;
}

第三种:请求参数是用Body的key value方式

还是看张postman的请求图

volley_body.png

这种方式更麻烦点,还要改变传输类型

PostJsonRequest3

public class PostJsonRequest3 extends JsonRequest<JSONObject> implements INetToken {
private boolean needToken = true;


public static final int TYPE_API_QUGUANZHANG = 1;

public static final int TYPE_API_HUIJIEQIANBAO = 2;

private int type = TYPE_API_QUGUANZHANG;

private String productId = "1";



/**
 * 构造函数,初始化请求对象
 */
public PostJsonRequest3(String url, String params, Listener<JSONObject> listener,
                        ErrorListener errorListener) {

    super(Request.Method.POST, url, params, listener, errorListener);
    setRetryPolicy(new DefaultRetryPolicy(InterfaceConfig.SOCKET_TIMEOUT, InterfaceConfig.MAX_RETRIES, InterfaceConfig.BACK_OFF));
}



/**
 * 重写参数编码方法
 */
@Override
protected String getParamsEncoding() {
    return InterfaceConfig.ENCODEING;
}

/**
 * 重写请求头获取方法
 */
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    Map<String, String> headers = new HashMap<String, String>();

    headers.put("appVerison", "4.0.9.deb");
    headers.put("User-Agent", Constants.USER_AGENT());
    headers.put("channel", "dev_XYH");
    headers.put("accessToken", "0d5a0f5c-7673-47bf-994c-3ef79980a904");
    headers.put("Content-Type", "application/x-www-form-urlencoded");
    return headers;
}

@Override
public void setNeedToken(boolean needToken) {
    this.needToken = needToken;
}

@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {

    Response<JSONObject> superResponse;
    try {
        String jsonString = new String(response.data,
                HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
        superResponse = Response.success(new JSONObject(jsonString),
                HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        superResponse = Response.error(new ParseError(e));
    } catch (JSONException je) {
        superResponse = Response.error(new ParseError(je));
    }


    String authToken = response.headers.get("x-auth-token");
    if (CommonUtils.isNullOrEmpty(authToken)) {
        authToken = response.headers.get("newAccessToken");
    }
    if (!CommonUtils.isNullOrEmpty(authToken)) {
        HttpUtil.saveSession(authToken);
        CommonUtils.LOG_D(getClass(), "authToken = " + HttpUtil.sessionId);
    }

    return superResponse;
}

@Override
public String getBodyContentType() {
     return "application/x-www-form-urlencoded; charset=" + getParamsEncoding();
}


}

注意:构造方法的变化和getBodyContentType()

调用地方:

public Request<JSONObject> doPostByJson2(String url, Map<String, String> jsonObject,
                                        RequestListener requestListener, boolean
                                                isOpenProgressbar) {
    Request<JSONObject> request = null;
    try {

        if (isOpenProgressbar) {
            requestListener.onReqStart();
        }


        PostJsonRequest3 postJsonRequest = new PostJsonRequest3(url, appendParameter(url,jsonObject),
                new IMJsonListener(requestListener, context).setCacheKey(
                        null),
                new IMErrorListenr(requestListener));
        request = queue.add(postJsonRequest);

        // 为请求添加context标记
        request.setTag(context);
    } catch (Exception e) {
        e.printStackTrace();

        requestListener.onError("创建连接错误");
        requestListener.onReqFinish();
    }
    return request;
}  


public  String appendParameter(String url, Map<String,String> params){
    Uri uri = Uri.parse(url);
    Uri.Builder builder = uri.buildUpon();
    for(Map.Entry<String,String> entry:params.entrySet()){
        builder.appendQueryParameter(entry.getKey(),entry.getValue());
    }
    return builder.build().getQuery();
}  
不要在意有些方法没有,大可删除。重点是看懂不同方式的配置,如果还有问题请评论或者私聊我

相关文章

  • volley的Post请求几种方式

    这几天帮网友解决volley请求的问题,才发现volley真的很难用。如果新项目就不要用volley网络框架了。旧...

  • h5开发技术总结01

    简单请求: 1.请求方式只能是:GET、POST、HEAD 2.HTTP请求头限制这几种字段:Accept、Acc...

  • AFNetworking使用

    get请求方式 post请求方式一 post请求方式二 下载文件

  • Volley简单用法

    volley是当前Android中比较常用的网络请求框架。 volley请求如同我们常用的http请求方式一样同样...

  • Android - 网络请求之Volley

    目录 引入 使用文字信息处理get请求post请求图片下载 封装Volley 一. 引入 GitHub 首页 二....

  • 常见的四种POST提交数据方式

    我们知道HTTP/1.1协议下规定http请求方式包含以下几种:GET,POST,HEAD,PUT,DELETE,...

  • Nodejs(Express) - 02 路由

    路由定义了哪个url由哪个函数响应。url请求包含URI地址和请求方式(Get,Post等)Express有几种路...

  • axios+vue

    1. get请求 2. post请求 post方式1: post方式2: 并发请求: axios实例 实例配置 实...

  • okhttp的基本使用

    Android中volley框架,因为httpclient的问题,不建议使用 基本代码逻辑: 执行post请求的方...

  • AFNetworking

    一、AFN的GET和POST请求 二、AFN的"下载+上传+响应体的几种解析方式+网络状态监听"

网友评论

    本文标题:volley的Post请求几种方式

    本文链接:https://www.haomeiwen.com/subject/dgngultx.html