【问题标题】:Volley :Post request is not working : Error Unexpected Response code 404Volley:发布请求不起作用:错误意外响应代码 404
【发布时间】:2018-01-25 13:35:22
【问题描述】:

尝试注册用户但收到错误意外响应代码 404,虽然 URL 正确,但参数也正确,我已经在 POSTMAN 上对其进行了测试,它工作正常,但是当我尝试发出请求时它给出:

E/Volley:[19358] BasicNetwork.performRequest:给定 URL 的意外响应代码 404

这个参数好像没有附在网址上,不过我也做了一个自定义的请求,但是还是不行,请帮忙解决一下。

注意:唯一的标题是“application/x-www-form-urlencoded”;

 private void registerUser()
                {
StringRequest stringRequest = new StringRequest(Request.Method.POST, APIReference.USER_REGISTRATION_URL, new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            try {
                                JSONObject jsonObject = new JSONObject(response);
                                Toast.makeText(mContext,jsonObject.getString("status"),Toast.LENGTH_LONG).show();
                                showSnackbar(jsonObject.getString("status"));

                                JSONObject object = jsonObject.getJSONObject("response");
                                User user = new User(object.getString("user_id"),
                                        object.getString("user_name"),
                                        object.getString("user_email"),
                            object.getString("user_phone_no"));

                Toast.makeText(mContext,String.valueOf(jsonObject.getJSONObject("response")),Toast.LENGTH_LONG).show();

            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d("response error : ", String.valueOf(error));
            showSnackbar(String.valueOf(error));
         }
    })
    {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put("user_name", mUserName);
            params.put("user_email", mUserEmail);
            params.put("user_password", mUserPassword);
            params.put("user_phone_no", mUserMobileNo);
            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,charset=utf-8");
            return params;
        }

        @Override
        public String getBodyContentType() {
            return "application/x-www-form-urlencoded,charset=utf-8";
        }
    };
    VolleySingleton.getInstance(mContext).getRequestQueue().add(stringRequest);
}

【问题讨论】:

  • 在 getHeaders() 中,您也需要输入 api 密钥,并请提供您尝试使用的其余 api,或者检查页面是否有故障排除,这些错误告诉您应该是什么
  • 尝试将内容类型更改为 application/json
  • 你在这个日志“响应错误”上得到空值吗?@harpalSingh
  • @IDroid Api 未使用任何密钥或身份验证标头,除了内容类型=x-www-form-urlencoded
  • @Abhishekkumar 没有错误代码是 404 : 并且消息是 volley.Clienterror

标签: android http-headers android-volley restful-url


【解决方案1】:

有时JSON URL 响应工作正常,但在 Android 中,由于超时,它在 Volley 库上显示错误。所以你必须设定时间。

在您的 Volley 代码中添加此代码:

private static final int MY_SOCKET_TIMEOUT_MS = 60000;

 eventoReq.setRetryPolicy(new DefaultRetryPolicy(
            MY_SOCKET_TIMEOUT_MS,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

完整代码是:

String url = urlhere;
    Log.e("URL", "" + url);

    StringRequest eventoReq = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Log.e("RESPONSE", response.toString());

                    utils.hideDialog();
                    try {
                        JSONArray j = new JSONArray(response);

                         //code here
                                }

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }

                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }


                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("Error: ", "" + error.getMessage());
            utils.hideDialog();
            utils.showtoast("Please try again...");

        }
    });
    eventoReq.setRetryPolicy(new DefaultRetryPolicy(
            MY_SOCKET_TIMEOUT_MS,
            DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    // Añade la peticion a la cola
    AppController.getInstance(this).addToRequestQueue(eventoReq);

【讨论】:

  • 这是一个通用示例,但不能解决操作问题
  • 我遇到了同样的问题,通过添加此代码解决了。 @IDroid,让我们检查一下 harpal
  • @Abhishekkumar 我已经完成了,这不是问题,顺便说一句谢谢
猜你喜欢
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多