Android中如何使用Volley库将数组作为请求体发送给Web服务?
如何用Volley发送JSON数组作为请求体
嘿,我明白你现在的需求——之前用Volley发单个JSON对象没问题,现在要发一组用户数据的数组对吧?别担心,咱们稍微改改代码就能搞定。
首先得说清楚:Volley自带的JsonObjectRequest是专门用来处理JSON对象请求体的,而JsonArrayRequest主要是用来接收JSON数组响应的,没法直接用来发送JSON数组作为请求体。所以咱们得自定义一个Request类来处理这个场景。
下面是修改后的完整代码,我给你标清楚了关键改动:
String url = "你的接口地址"; try { // 1. 先构建你要发送的JSON数组 JSONArray jsonArray = new JSONArray(); // 添加第一个对象 JSONObject obj1 = new JSONObject(); obj1.put("name", "a"); obj1.put("family", "f"); jsonArray.put(obj1); // 添加第二个对象 JSONObject obj2 = new JSONObject(); obj2.put("name", "b"); obj2.put("family", "f"); jsonArray.put(obj2); // 添加第三个对象 JSONObject obj3 = new JSONObject(); obj3.put("name", "c"); obj3.put("family", "f"); jsonArray.put(obj3); // 2. 自定义Request类,处理JSON数组请求体 Request<JSONObject> jsonArrayRequest = new Request<JSONObject>(Request.Method.POST, url, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); } }) { @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { // 解析响应成JSONObject(如果你的接口返回JSON数组,就改成JSONArray) String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response)); } catch (Exception e) { return Response.error(new ParseError(e)); } } @Override protected void deliverResponse(JSONObject response) { // 在这里处理成功响应的逻辑 // 比如你原来的onResponse里的代码可以移到这里 } @Override public byte[] getBody() throws AuthFailureError { // 把JSON数组转成字节数组,作为请求体发送 try { return jsonArray.toString().getBytes("utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } } @Override public Map<String, String> getHeaders() throws AuthFailureError { // 保持原来的Header设置,确保Content-Type正确 Map<String, String> params = new HashMap<>(); params.put("Content-Type", "application/json; charset=utf-8"); return params; } }; // 3. 添加请求到Volley队列 Volley.newRequestQueue(Activity_Goods_List.this).add(jsonArrayRequest); } catch (Exception e) { Toast.makeText(getApplicationContext(), e.getMessage().toString(), Toast.LENGTH_LONG).show(); }
关键要点说明:
- 自定义Request:因为Volley没有直接支持发送JSON数组的Request,所以我们继承基础的
Request类,重写getBody()方法来返回JSON数组的字节形式。 - 响应解析:
parseNetworkResponse方法里我默认解析成JSONObject,如果你的接口返回的是JSON数组响应,只需要把这里改成new JSONArray(jsonString),同时把Request的泛型改成JSONArray就行。 - Header设置:一定要保留
Content-Type为application/json,否则服务端可能无法正确解析你的请求体。
如果你的响应确实是JSON数组,那修改后的请求泛型和解析部分应该是这样:
Request<JSONArray> jsonArrayRequest = new Request<JSONArray>(Request.Method.POST, url, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); } }) { @Override protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response)); } catch (Exception e) { return Response.error(new ParseError(e)); } } @Override protected void deliverResponse(JSONArray response) { // 处理JSON数组响应的逻辑 } // 其他方法(getBody、getHeaders)保持不变 };
这样就能完美实现发送JSON数组作为请求体的需求啦!
内容的提问来源于stack exchange,提问作者matin matini
相关产品推荐
相关产品推荐

