put not working on android Volley org.json.JSONException: 在字符 0 处输入结束

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

我向邮递员发送了请求,但 volley 不起作用。我总是出错!当响应为空时,我搜索了 Whosebug volley returns 错误,但我添加了 CustomJsonObjectRequest 问题仍然存在。

错误信息

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);
    }
}

截击请求

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();
                }

这是解决方案,只需创建此方法并传递您的值即可。

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);
}

ID 和 Checked 都必须有 String type.And 在 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);
}

经过数小时的搜索,我终于能够解决问题。这有两个原因,首先是 api 返回 null/empty 所以 CustomJsonObjectRequest 修复了它,然后另一个问题是我忘记添加身份验证 headers。我知道这是一个愚蠢的错误!

        @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;
            }
        };