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

使用Volley的JsonObjectRequest发起POST请求时出现ServerError

排查Volley JsonObjectRequest POST请求的ServerError问题

我来帮你一步步排查这个com.android.volley.ServerError问题,先从几个关键方向入手:

一、先获取更详细的错误信息

你的Logcat只显示了ServerError,但没给出具体的HTTP状态码(比如400/404/500)和服务器返回的错误内容,这是排查的核心第一步。修改你的ErrorListener,添加网络响应的详细打印:

Response.ErrorListener errorListener = new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        error.printStackTrace();
        // 打印状态码和响应体
        if (error.networkResponse != null) {
            Log.d("VolleyDebug", "HTTP状态码: " + error.networkResponse.statusCode);
            try {
                String errorBody = new String(error.networkResponse.data, "UTF-8");
                Log.d("VolleyDebug", "服务器返回错误内容: " + errorBody);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        Toast.makeText(getBaseContext(), "请求失败,请稍后重试", Toast.LENGTH_LONG).show();
        pDialog.dismiss();
    }
};

通过这些信息,你能快速判断是客户端参数错误(400)、接口不存在(404)还是服务器内部错误(500)。

二、检查POST请求的参数传递方式

你的代码把所有参数都拼在了URL里,同时给JsonObjectRequest的请求体传了null——这是常见的问题点,分两种场景调整:

  • 如果你的API要求POST请求的参数放在JSON请求体中:你需要把参数封装成JSONObject传入,而不是拼URL:
    // 构建请求体JSON
    JSONObject requestBody = new JSONObject();
    try {
        requestBody.put("mobile", user.Mobile);
        requestBody.put("usercarId", SelectedUserCarId);
        requestBody.put("srvIds", SelectedServiceIds);
        requestBody.put("pkgId", SelectedPackageId);
        requestBody.put("ad", SelectedAddress);
        requestBody.put("lat", SelectedLat);
        requestBody.put("lng", SelectedLong);
        requestBody.put("timeId", SelectedTimeId);
        requestBody.put("date", selectedDate);
        requestBody.put("price", String.valueOf((long)Totalprice));
    } catch (JSONException e) {
        e.printStackTrace();
    }
    
    // 初始化请求时传入requestBody,而非null
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, requestBody, listener, errorListener);
    
  • 如果你的API要求POST参数以**表单形式(application/x-www-form-urlencoded)**传递:建议改用StringRequest,因为JsonObjectRequest默认的Content-Type是application/json,和表单不匹配:
    StringRequest request = new StringRequest(Request.Method.POST, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    // 解析返回的JSON字符串
                    try {
                        JSONObject orderObj = new JSONObject(response);
                        String OrderCode = orderObj.getString("OrderCode");
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    pDialog.dismiss();
                }
            }, errorListener) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put("mobile", user.Mobile);
            params.put("usercarId", SelectedUserCarId);
            params.put("srvIds", SelectedServiceIds);
            params.put("pkgId", SelectedPackageId);
            params.put("ad", SelectedAddress);
            params.put("lat", SelectedLat);
            params.put("lng", SelectedLong);
            params.put("timeId", SelectedTimeId);
            params.put("date", selectedDate);
            params.put("price", String.valueOf((long)Totalprice));
            return params;
        }
    };
    

三、修复URL拼接的编码问题

你的SelectedAddress包含逗号、空格等特殊字符,直接拼到URL里会导致URL格式非法,服务器无法解析。如果坚持用URL参数传递,必须对每个参数做URL编码:

// 对每个参数进行UTF-8编码
String encodedAddress = URLEncoder.encode(SelectedAddress, "UTF-8");
String encodedMobile = URLEncoder.encode(user.Mobile, "UTF-8");
// 其他参数同理...

// 拼接URL
url = url + "&mobile=" + encodedMobile + "&usercarId=" + SelectedUserCarId + "&srvIds=" + SelectedServiceIds + "&pkgId=" + SelectedPackageId + "&ad=" + encodedAddress + "&lat=" + SelectedLat + "&lng=" + SelectedLong + "&timeId=" + SelectedTimeId + "&date=" + selectedDate+ "&price=" + String.valueOf((long)Totalprice);

四、确认请求头是否匹配API要求

JsonObjectRequest默认会设置Content-Type: application/json; charset=utf-8,如果你的API期望的是其他类型(比如表单),需要手动修改请求头:

request.setHeaders(new HashMap<String, String>() {{
    put("Content-Type", "application/x-www-form-urlencoded");
}});

先按第一步获取详细错误信息,再结合API的文档要求调整参数传递方式,应该就能解决问题了。

内容的提问来源于stack exchange,提问作者milad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:34:26