简体   繁体   中英

put not working on android Volley org.json.JSONException: End of input at character 0 of

I sent request with postman its working, but volley doesn't work. I always get error! I searched stackoverflow volley returns error when response is empty but i added CustomJsonObjectRequest still the issue remains.

Error message

Volley org.json.JSONException: End of input at character 0 of

CustomJsonObjectRequest

public class CustomJsonObjectRequest extends JsonObjectRequest {

    public CustomJsonObjectRequest(int method, String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
        super(method, url, jsonRequest, listener, errorListener);
    }

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            if (response.data.length == 0) {
                byte[] responseData = "{}".getBytes("UTF8");
                response = new NetworkResponse(response.statusCode, responseData, response.headers, response.notModified);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return super.parseNetworkResponse(response);
    }
}

Volley request

EcoElement ecoElement = ecoElementArrayList.get(position);

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

                params.put("Id", ecoElement.getId().toString());
                params.put("Checked", ecoElement.getChecked().toString());

                JSONObject ObjParams = new JSONObject(params);



                try {
                    CustomJsonObjectRequest getRequest = new CustomJsonObjectRequest(Request.Method.PUT, "https://ourwebsite.sslbeta.de/api/gardenapi/updateecoelements", ObjParams,
                            response -> {
                                Toast.makeText(getContext(), ""+response, Toast.LENGTH_SHORT).show();
                                progressBar.setVisibility(View.GONE);
                            },
                            error -> {
                                Toast.makeText(getContext(), ""+error.toString(), Toast.LENGTH_SHORT).show();
                                progressBar.setVisibility(View.GONE);
                            }
                    );
                    RequestQueueSingleton.getInstance(getContext()).addToRequestQueue(getRequest);
                } catch (Exception e) {
                    Toast.makeText(getContext(), e.toString(), Toast.LENGTH_LONG).show();
                }

在此处输入图片说明

Here is the solution, just create this method and pass your value.

private void CustomJsonObjectRequest() {

    String tag_string_req = "req__details";

    StringRequest strReq = new StringRequest(Request.Method.POST, <API URL>, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            getPerspective().showErrorLogs(TAG, "Response Invest : " + response);

            try {
                
                // Parse your response here
                
                
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
        }
    }) {
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<String, String>();
            params.put("Id", <ID VALUE HERE>);
            params.put("Checked", <TRUE or FALSE>);
            return params;
        }
    };

    strReq.setRetryPolicy(new RetryPolicy() {

        @Override
        public void retry(VolleyError arg0) throws VolleyError {
        }

        @Override
        public int getCurrentTimeout() {
            return 0;
        }

        @Override
        public int getCurrentRetryCount() {
            return 0;
        }
    });
    strReq.setShouldCache(false);
    addToRequestQueue(strReq, tag_string_req);
}

Both ID and Checked must have String type.And create below methods in MainActivity:

 private RequestQueue mRequestQueue;

 public RequestQueue getRequestQueue() {
    if (mRequestQueue == null) {
        mRequestQueue = Volley.newRequestQueue(getApplicationContext());
    }
    return mRequestQueue;
}

public <T> void addToRequestQueue(Request<T> req, String tag) {
    req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
    getRequestQueue().add(req);
}

public <T> void addToRequestQueue(Request<T> req) {
    req.setTag(TAG);
    getRequestQueue().add(req);
}

Finally i was able to fix the issues after hours of searching. There were two reasons to this, first is that api was returning null/empty so CustomJsonObjectRequest fixed that, and then another issue is that i forgot to add authentication headers. that was a silly mistake i know!

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("Content-Type", "application/json");
                headers.put("Authorization", "Bearer "+access_token);
                return headers;
            }
        };

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM