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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:34:54