You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:10:52