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

Android:Volley调用PUT方法失败求助,Postman请求该URL正常

解决Volley PUT请求无法正常工作的问题

我猜你的代码里getParams()方法还没写完,这大概率是问题的核心之一。另外Volley的PUT请求在参数传递、请求头设置上,和Postman的默认行为可能存在差异,咱们一步步来排查调整:

1. 补全参数传递并规范请求头

首先,Volley的StringRequest默认会以表单形式(application/x-www-form-urlencoded)传递参数,但你得确保Postman里用到的所有参数都在getParams()里正确返回,同时匹配后端要求的请求头:

StringRequest reg = new StringRequest(Request.Method.PUT, AppConfig.Registration,
        response -> Log.d("USER_REG", response),
        error -> {
            // 先优化错误日志,方便定位问题
            if (error.networkResponse != null) {
                String errorBody = new String(error.networkResponse.data, StandardCharsets.UTF_8);
                Log.d("USER_REG", "错误状态码:" + error.networkResponse.statusCode);
                Log.d("USER_REG", "错误响应体:" + errorBody);
            }
            Log.d("USER_REG", "错误信息:" + error.getMessage());
        }
) {
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        // 把你在Postman里传的所有PUT参数都放这里,键值对要完全匹配
        Map<String, String> params = new HashMap<>();
        params.put("username", "你的用户名");
        params.put("email", "你的邮箱");
        // 其他必填参数...
        return params;
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = new HashMap<>();
        // 复刻Postman里的请求头,比如Content-Type、认证Token等
        headers.put("Content-Type", "application/x-www-form-urlencoded");
        // 如果后端需要Token,就加上:headers.put("Authorization", "Bearer " + 你的Token);
        return headers;
    }
};

// 别忘了把请求加入Volley队列
RequestQueue queue = Volley.newRequestQueue(你的上下文对象);
queue.add(reg);

2. 排查请求头与Postman的差异

打开Postman的「Headers」标签,把所有自动生成或你手动添加的请求头都复制下来,完全复刻到Volley的getHeaders()方法里。很多时候后端会因为请求头不匹配(比如缺少某个标识、Content-Type不对)拒绝请求,这一步能快速对齐Postman的请求环境。

3. 如果后端期望JSON格式的请求体

如果你的后端要求PUT请求的参数是JSON格式(application/json),那Volley默认的表单参数就不适用了,需要自定义一个Request类来传递JSON字符串:

public class JsonPutRequest extends Request<String> {
    private final Response.Listener<String> listener;
    private String jsonBody;

    public JsonPutRequest(String url, String jsonBody, Response.Listener<String> listener, Response.ErrorListener errorListener) {
        super(Method.PUT, url, errorListener);
        this.listener = listener;
        this.jsonBody = jsonBody;
    }

    @Override
    public String getBodyContentType() {
        return "application/json; charset=utf-8";
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        try {
            return jsonBody.getBytes("utf-8");
        } catch (UnsupportedEncodingException e) {
            VolleyLog.wtf("编码失败:%s", jsonBody);
            return null;
        }
    }

    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        String responseBody = "";
        if (response != null) {
            // 解析后端返回的响应体
            responseBody = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        }
        return Response.success(responseBody, HttpHeaderParser.parseCacheHeaders(response));
    }

    @Override
    protected void deliverResponse(String response) {
        listener.onResponse(response);
    }
}

使用这个自定义请求的示例:

// 构建JSON参数
JSONObject jsonParams = new JSONObject();
try {
    jsonParams.put("username", "你的用户名");
    jsonParams.put("email", "你的邮箱");
} catch (JSONException e) {
    e.printStackTrace();
}

JsonPutRequest regRequest = new JsonPutRequest(AppConfig.Registration, jsonParams.toString(),
        response -> Log.d("USER_REG", response),
        error -> {
            // 打印详细错误
            if (error.networkResponse != null) {
                String errorBody = new String(error.networkResponse.data, StandardCharsets.UTF_8);
                Log.d("USER_REG", "错误状态码:" + error.networkResponse.statusCode);
                Log.d("USER_REG", "错误响应体:" + errorBody);
            }
            Log.d("USER_REG", "错误信息:" + error.getMessage());
        }
);

RequestQueue queue = Volley.newRequestQueue(你的上下文对象);
queue.add(regRequest);

4. 最后核对URL和参数一致性

再仔细检查一遍:Volley里的AppConfig.Registration是否和Postman里的URL完全一致?参数的键名、值有没有拼写错误或者大小写不一致的情况?有时候就是这种细节导致请求失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:05:02