Android WebService提交XML请求体方法及Volley返回无效凭证问题
嘿,我看你用Volley发送带XML请求体的POST请求时遇到了「invalid credentials」的问题,这大概率是请求体的处理方式不对或者凭证格式有问题,我给你梳理几个排查方向和解决办法:
1. 先确认XML请求体本身没问题
首先别着急看代码,先把你要发送的XML内容拿出来,用Postman或者curl直接给后端发一次请求。如果这样还是返回无效凭证,那问题就出在XML里的凭证字段(比如用户名、密码)格式或者内容不对——比如后端要求的字段名是<user_id>你写成了<username>,或者密码有特殊字符没转义。先把这一步搞定,排除后端和凭证本身的问题。
2. 别用默认的StringRequest,自定义XML专用Request
Volley的StringRequest默认会把请求参数编码成x-www-form-urlencoded格式,而你需要发送的是纯XML文本,这就会导致后端接收到的内容不是它期望的XML格式,自然验证失败。你得自定义一个继承自Request<String>的XmlRequest,专门处理XML请求体:
public class XmlRequest extends Request<String> { private final Listener<String> mListener; private String mXmlBody; public XmlRequest(int method, String url, String xmlBody, Listener<String> listener, ErrorListener errorListener) { super(method, url, errorListener); mListener = listener; mXmlBody = xmlBody; } @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { String parsed; try { parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); } catch (UnsupportedEncodingException e) { parsed = new String(response.data); } return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); } @Override protected void deliverResponse(String response) { mListener.onResponse(response); } @Override public byte[] getBody() throws AuthFailureError { // 直接返回XML字符串的字节数组 return mXmlBody.getBytes(); } @Override public String getBodyContentType() { // 指定正确的Content-Type return "application/xml; charset=utf-8"; } }
然后用这个自定义Request来发送请求:
// 构造你的XML请求体,替换成实际的内容 String xmlContent = "<your_request_tag>" + "<username>your_real_username</username>" + "<password>your_real_password</password>" + "</your_request_tag>"; XmlRequest xmlRequest = new XmlRequest(Request.Method.POST, yourUrl, xmlContent, response -> Log.e("onResponse", "...." + response), error -> Log.e("onErrorResponse", "...." + error.getMessage())); // 添加到Volley请求队列 Volley.newRequestQueue(getApplicationContext()).add(xmlRequest);
3. 检查请求头是否符合后端要求
有些后端除了XML内容,还需要特定的请求头才能验证凭证,比如Authorization令牌,或者要求Content-Type必须严格匹配。如果需要添加额外请求头,可以在自定义的XmlRequest里重写getHeaders()方法:
@Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<>(); // 比如添加Authorization头,根据后端要求调整 // headers.put("Authorization", "Bearer your_auth_token"); return headers; }
4. 确认编码一致
确保你的XML字符串用的是UTF-8编码,和getBodyContentType()里指定的charset=utf-8一致,避免因为编码问题导致后端解析凭证时出现乱码,进而判定为无效凭证。
按照这几步排查下来,应该能解决你遇到的问题啦!
内容的提问来源于stack exchange,提问作者Rajesh

