PUT Request for Json with Json array inside

回眸只為那壹抹淺笑 提交于 2021-01-07 02:39:45

问题


I'm trying to update a PUT request which has a JSONArray inside it and I'm constantly getting a 500 error response. Here how the api structure is:

{
    "imei": 514515854152463,
    "franquia": "SAO",
    "sistema": "PEGASUS",
    "lista": 2055313,
    "entregas":[
        {
            "codHawb": "02305767706",
            "dataHoraBaixa": "2020-12-03T15:26:22",
            "foraAlvo": 1000,
             "latitude": 44.4545,
            "longitude": 45.545,
            "nivelBateria": 98,
            "tipoBaixa": "ENTREGA"
        }
    ]
}

I've tried the api in Postman to see if its working and it is. But when I'm trying it in the program using Volley I'm getting that error. I've tried volley and here is the code:

 private void PutJsonRequest() {
        try {
            Map<String, String> postParam = new HashMap<String, String>();
            postParam.put("imei", "514515854152463");
            postParam.put("franquia", preferences.getFranchise());
            postParam.put("sistema", preferences.getSystem());
            postParam.put("lista", preferences.getListID());
            postParam.put("dataHoraBaixa", "2020-12-03T15:26:22");
            postParam.put("foraAlvo", "100");
            postParam.put("latitude", "45.545");
            postParam.put("longitude", " 45.554");
            postParam.put("nivelBateria", "98");
            postParam.put("tipoBaixa", "ENTREGA");
            JsonObjectRequest request = new JsonObjectRequest(Request.Method.PUT, ApiUtils.GET_LIST + preferences.getListID(), new JSONObject(postParam), new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.e(TAG, "PUTonResponse: " + response);

                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e(TAG, "PUTonResponseError: " + error);

                }
            }) {
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    HashMap<String, String> params = new HashMap<String, String>();
                    String auth1 = "Basic "
                            + Base64.encodeToString((preferences.getUserName() + ":" + preferences.getPass()).getBytes(),
                            Base64.NO_WRAP);
                    params.put("Authorization", auth1);
                    params.put("x-ver", "3.0");
                    params.put("x-ras", "rick");
                    params.put("Content-Type", "application/json");
                    return params;
                }

                @Override
                public String getBodyContentType() {
                    return "application/json";
                }
            };
            queue.add(request);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Here is the result in postman:1

Here is the result in postman:2

The problem is there is an array in the api, I've tried the above in the way if there are only JSON object but it is not working, please help me know if anything can be updated or done in different way for sending arrays either in volley or retrofit. Thanks.

//Edit:

I tried sending the params in another way and this was also giving the same 500 error:

 JSONArray jsonArray=new JSONArray();
        JSONObject jsonObj=new JSONObject();

        try {

            jsonObj.put("codHawb", "02305767706");
            jsonObj.put("dataHoraBaixa", "2020-12-03T15:26:22");
            jsonObj.put("foraAlvo", "100");
            jsonObj.put("latitude", "-46.86617505263801");
            jsonObj.put("longitude", " -23.214458905023452");
            jsonObj.put("nivelBateria", "98");
            jsonObj.put("tipoBaixa", "ENTREGA");
            jsonArray.put(jsonObj);

            Map<String, String> postParam = new HashMap<String, String>();
            postParam.put("imei", "514515854152463");
            postParam.put("franquia", preferences.getFranchise());
            postParam.put("sistema", preferences.getSystem());
            postParam.put("lista", preferences.getListID());
            postParam.put("entregas",jsonArray.toString());

回答1:


Finally figured it out, sending the PUT request in the form of api. FYI: If you have multiple json objects inside the array, just use a for loop, here is the working answer:

 private void PutJsonRequest() {
        JSONArray jsonArray=new JSONArray();
        JSONObject jsonObj=new JSONObject();
        JSONObject jsonObj1=new JSONObject();
        try {

            jsonObj.put("codHawb", "02305767706");
            jsonObj.put("dataHoraBaixa", "2020-12-03T15:26:22");
            jsonObj.put("foraAlvo", "100");
            jsonObj.put("latitude", "45.222");
            jsonObj.put("longitude", " 23.23452");
            jsonObj.put("nivelBateria", "98");
            jsonObj.put("tipoBaixa", "ENTREGA");
            jsonArray.put(jsonObj);

            jsonObj1.put("imei", preferences.getIMEI());
            jsonObj1.put("franquia", preferences.getFranchise());
            jsonObj1.put("sistema", preferences.getSystem());
            jsonObj1.put("lista", preferences.getListID());
            jsonObj1.put("entregas", jsonArray);

            Log.e(TAG, "PutJsonRequest: "+jsonObj1 );

            JsonObjectRequest request = new JsonObjectRequest(Request.Method.PUT, ApiUtils.GET_LIST + preferences.getListID(),jsonObj1, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.e(TAG, "PUTonResponse: " + response);

                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e(TAG, "PUTonResponseError: " + error);

                }
            }) {
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    HashMap<String, String> params = new HashMap<String, String>();
                    String auth1 = "Basic "
                            + Base64.encodeToString((preferences.getUserName() + ":" + preferences.getPaso()).getBytes(),
                            Base64.NO_WRAP);
                    params.put("Authorization", auth1);
                    params.put("x-versao-rt", "3.8.10");
                    params.put("x-rastreador", "ricardo");
//                    params.put("Content-Type", "application/json");
                    params.put("Content-Type", "application/json; charset=utf-8");
                    return params;
                }

                @Override
                public String getBodyContentType() {
                    return "application/json; charset=utf-8";
                }
            };
            request.setTag(TAG);
            queue.add(request);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Comment if anyone has a doubt.



来源:https://stackoverflow.com/questions/65126528/put-request-for-json-with-json-array-inside

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!