首页 > 代码库 > 解决Volley中的JsonObjectRequest jsonRequest参数无法被服务端读取的问题
解决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(); //遍历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();
解决Volley中的JsonObjectRequest jsonRequest参数无法被服务端读取的问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。