Volley POST请求失败:Unexpected Response code 404错误求助
解决Volley POST请求返回404错误的问题
你遇到的这个情况很典型——Postman能正常请求但Volley报404,大概率是请求头格式或者参数处理的细节出了问题。结合你的代码,我帮你梳理几个关键问题和修正方案:
核心问题1:Content-Type格式错误
你在getHeaders()和getBodyContentType()里写的application/x-www-form-urlencoded,charset=utf-8是错误的,HTTP头里的参数分隔应该用分号而非逗号,正确格式是:application/x-www-form-urlencoded; charset=utf-8
这个格式错误会导致服务器无法正确识别请求体的编码方式,直接引发请求解析失败,进而返回404。
核心问题2:冗余的头信息设置
Volley的StringRequest在使用getParams()时,默认会自动处理application/x-www-form-urlencoded类型的请求体,你不需要同时在getHeaders()和getBodyContentType()里重复设置,甚至getHeaders()里的Content-Type可以直接移除,避免和Volley的默认处理逻辑冲突。
修正后的完整代码
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(object), Toast.LENGTH_LONG).show(); } catch (JSONException e) { e.printStackTrace(); showSnackbar("响应解析失败:" + e.getMessage()); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { String errorMsg = "请求失败:"; if (error.networkResponse != null) { errorMsg += "状态码 " + error.networkResponse.statusCode; } else { errorMsg += error.getMessage(); } Log.d("response error : ", errorMsg); showSnackbar(errorMsg); } }) { @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 String getBodyContentType() { // 修正后的Content-Type格式 return "application/x-www-form-urlencoded; charset=utf-8"; } // 移除多余的getHeaders(),避免和Volley默认处理冲突 }; VolleySingleton.getInstance(mContext).getRequestQueue().add(stringRequest); }
额外排查建议
- 再次核对
APIReference.USER_REGISTRATION_URL和Postman中的URL完全一致,包括协议(HTTP/HTTPS)、末尾是否带斜杠等细节; - 开启Volley的调试日志,查看实际发送的请求内容,对比Postman的请求差异:
VolleyLog.DEBUG = true; - 确认
VolleySingleton的请求队列初始化逻辑没有错误,比如是否正确传入Context、是否创建了有效的RequestQueue实例。
内容的提问来源于stack exchange,提问作者harpal Singh
相关产品推荐
相关产品推荐

