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
相关产品推荐
相关产品推荐

