【问题标题】:How to send JSON Array in form-data in volley如何在 volley 中以表单数据形式发送 JSON 数组
【发布时间】:2017-05-09 10:35:29
【问题描述】:

我无法在表单数据中使用 volley 将 JSON 数组发送到服务器。 我的代码如下:

StringRequest sr = new StringRequest(Request.Method.POST, url,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.e("response_det", response);
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("response_det", "" + error.getMessage() + "," + error.toString());
            }
        }) {
    @Override
    protected Map<String, String> getParams() {
        Map<String, String> params = new HashMap<>();
        params.put("phone", "XXXXXXXXXX");
        params.put("booking_id[0]", "27829929");
        params.put("booking_id[1]", "37798393");
        return params;
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {

        Map<String, String> params = new HashMap<>();

        params.put("Content-Type", "application/x-www-form-urlencoded");

        return params;
    }
};

我附上示例邮递员集合的屏幕截图

所以基本上我发送了两个参数,一个是普通字符串,另一个是 JSONArray。请告诉我我做错了什么。

我正在关注 https://stackoverflow.com/a/27091088/3022836 发布唯一的不同之处在于我有一个额外的 JSON 数组。

【问题讨论】:

  • 您将哪个参数作为 json 数组 booking_id[0] 或 booking_id[1] 发送
  • 这是一个 JSON 数组 booking_id
  • 拒绝投票是可以的,但至少要解释一下原因,因为我已经尝试了很多方法。我不只是在没有任何研究的情况下发布它。
  • 有人将其标记为离题。来吧,这可能是一个低标准的问题,但绝不是题外话。

标签: java android android-volley


【解决方案1】:

使用下面的代码发送jsonArray

subsIdArraylist = pauseListAdapter.getIdList();// for example 
            quantityArray = pauseListAdapter.getQntyArray(); // for example

            JSONArray jsonArray = new JSONArray();

            if (subsIdArraylist.size() > 0) {
                for (int i = 0; i < subsIdArraylist.size(); i++) {
                    try {

                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put(AppConstants.KEY_ID, Integer.parseInt(subsIdArraylist.get(i)));
                        jsonObject.put(AppConstants.KEY_QTY, quantityArray.get(i));
                        jsonArray.put(i, jsonObject);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }
    and then in your getParams method put this jsonarray <br>
@Override
protected Map<String, String> getParams() {
    Map<String, String> params = new HashMap<>();
    params.put("phone", "XXXXXXXXXX");
    params.put("booking_id", jsonArray.toString());

    return params;
}

【讨论】:

  • 现在检查我已将 params.put("booking_id[0]",jsonArray.toString) 更改为 params.put("booking_id",jsonArray.toString())
  • 其实我只是这样做了
  • 没有。只是服务器没有收到任何东西。
【解决方案2】:

喜欢@Sandeep dhiman 的建议,然后将 contentType 覆盖为应用程序 json

public String getBodyContentType()
    {
        return "application/json";
    }

【讨论】:

  • 我也试过你的方法,但是,内容类型是“application/x-www-form-urlencoded”而不是“application/json”。
  • 您的 api contentType 期望是什么?你的服务器语言是什么?
  • 那么默认情况下内容类型应该是 x-www-form-urlencoded 如果您发布一些我们可以帮助的服务器端代码,您不需要覆盖任何内容
  • 我无权访问服务器端代码。但是,它在邮递员中工作。所以这只是我在Android方面做错了。
【解决方案3】:

它适用于 Json 数组

final String mRequestBody = jsonArray.toString();

        StringRequest request = new StringRequest(Request.Method.POST, CreateChatRoomUrl, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                if (!response.equals(null)) {
                    Log.e("Response", response);
                } else {
                    Log.e("Response"," Data Null");
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("error Response", "" + error);
            }
        }) {
            @Override
            public byte[] getBody() throws AuthFailureError {
                try {
                    return mRequestBody == null ? null : mRequestBody.getBytes("utf-8");
                } catch (UnsupportedEncodingException uee) {
                    VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", mRequestBody, "utf-8");
                    uee.printStackTrace();
                    return null;
                }
            }
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                params.put("Content-Type", "application/json; charset=UTF-8"); 
                return params;
            }
        };
        RequestQueue queue = Volley.newRequestQueue(context);
        queue.add(request);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-05
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多