zoukankan      html  css  js  c++  java
  • 解决Volley中的JsonObjectRequest jsonRequest参数无法被服务端读取的问题

    服务端:SpringBoot
    追溯到父类方法,发现Volley只是将 jsonRequest.toString().getBytes()作为request body发送到服务端,导致服务端无法识别
    import com.android.volley.AuthFailureError;
    import com.android.volley.Response;
    import com.android.volley.VolleyLog;
    import com.android.volley.toolbox.JsonObjectRequest;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.io.UnsupportedEncodingException;
    import java.util.Iterator;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    /**
     * 解决Volley中的JsonObjectRequest jsonRequest参数无法被服务端读取的问题
     * <br>
     *     服务端:SpringBoot
     *     追溯到父类方法,发现Volley只是将 jsonRequest.toString().getBytes()作为request body发送到服务端,导致服务端无法识别
     *
     */
    public class MyJsonObjectRequest extends JsonObjectRequest {
    
        private JSONObject mRequestBody;
    
        public MyJsonObjectRequest(int method, String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener) {
            super(method, url, jsonRequest, listener, new MyRequestErrorListener(url));
    
            this.mRequestBody = jsonRequest;
        }
    
        public MyJsonObjectRequest(String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener) {
            super(url, jsonRequest, listener, new MyRequestErrorListener(url));
    
            this.mRequestBody = jsonRequest;
        }
    
        public MyJsonObjectRequest(int method, String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
            super(method, url, jsonRequest, listener, errorListener);
            this.mRequestBody = jsonRequest;
        }
    
        public MyJsonObjectRequest(String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
            super(url, jsonRequest, listener, errorListener);
            this.mRequestBody = jsonRequest;
        }
    
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> headers = new LinkedHashMap<>();
            //让服务器识别request参数在request body中
            headers.put("Content-Type", "application/x-www-form-urlencoded");
            return headers;
        }
    
        @Override
        public byte[] getBody() {
            StringBuilder requestBodySb = new StringBuilder();
         if(mRequestBody == null){
            return null;
         }
    //遍历JSONObject中的k-v Iterator<String> keys = this.mRequestBody.keys(); try { boolean hasNext = keys.hasNext(); while (hasNext) { String key = keys.next(); String value = mRequestBody.get(key).toString(); requestBodySb.append(key).append("=").append(value); hasNext = keys.hasNext(); if (hasNext) { requestBodySb.append("&"); } } } catch (JSONException e) { e.printStackTrace(); } // to bytes try { String bytes = requestBodySb.toString(); return bytes.getBytes(PROTOCOL_CHARSET); } catch (UnsupportedEncodingException e) { VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", mRequestBody, PROTOCOL_CHARSET); } return null; } }

    测试代码

            JSONObject params = new JSONObject();
            try {
                params.put("username", "admin");
                params.put("password", "123456");
            } catch (JSONException e) {
                e.printStackTrace();
            }
    
    
            RequestQueue requestQueue = Volley.newRequestQueue(this.getApplicationContext());
            requestQueue.add(new MyJsonObjectRequest(
                    MyJsonObjectRequest.Method.POST,
                    "http://192.168.1.103:8080/test",
                    params,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            Log.d(TAG, "onResponse: " + response);
                        }
                    }
            ));
    
            requestQueue.start();
  • 相关阅读:
    Zabbix——1
    Hive 基础知识——01
    Vim快捷命令
    Shell——2
    Shell——6
    Shell——4
    Shell——3
    Shell——1
    Hive 安装和配置以及基本语法——02
    Shell——5
  • 原文地址:https://www.cnblogs.com/parasis/p/6961848.html
Copyright © 2011-2022 走看看