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

Android端GET请求仅提取返回结果中userPin字段的实现求助

从XML响应中提取userPin字段的解决方案

嘿,我看你已经成功通过GET请求拿到了数据库的数据,但遇到的问题是接口返回的是XML格式(虽然你请求头指定了JSON),现在需要从中提取userPin字段对吧?我来帮你搞定这个问题。

首先先明确几个关键点:

  • 你的请求头里设置了Accept: application/json,但实际接口返回的是XML(从你贴的Postman结果能看到),所以我们需要做XML解析,而不是JSON解析。
  • 你的现有代码里有个小语法错误:con.setRequestProperty这一行没写完,得删掉或者补全。
  • 最后你返回的是空字符串"",应该返回提取到的userPin值。

第一步:修正网络请求代码并读取XML响应

先把你的网络请求代码里的错误修正,确保能正确读取完整的XML响应内容:

public String getUserPin(String id, String token) {
    String userPinRetrieved = "";
    try {
        String url = "http://xxx.xx.xxx.xxx:7001/engAppApi/webservices/usersTable/" + id;
        URL object = new URL(url);
        HttpURLConnection con = (HttpURLConnection) object.openConnection();
        con.setDoOutput(true);
        con.setDoInput(true);
        con.setRequestProperty("Content-Type", "application/json");
        con.setRequestProperty("Accept", "application/json");
        con.setRequestProperty("Authorization", "Bearer " + token);
        con.setRequestMethod("GET"); // 修正之前的语法错误

        Log.d("responsecode", String.valueOf(con.getResponseCode()));
        Log.d("responsemessage", String.valueOf(con.getHeaderFields()));

        if (con.getResponseCode() == HttpURLConnection.HTTP_OK || con.getResponseCode() == HttpURLConnection.HTTP_ACCEPTED) {
            String line;
            BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            StringBuilder xmlResponse = new StringBuilder(); // 用StringBuilder更高效
            while ((line = br.readLine()) != null) {
                xmlResponse.append(line);
            }
            br.close();
            con.disconnect();
            // 调用解析方法提取userPin
            userPinRetrieved = parseUserPinFromXml(xmlResponse.toString());
        }
    } catch (Exception e) {
        Log.v("ErrorAPP", e.toString());
    }
    return userPinRetrieved; // 返回提取到的userPin,而不是空字符串
}

第二步:添加XML解析方法提取userPin

Android自带了XmlPullParser,可以方便地解析XML内容。我们写一个专门的解析方法:

private String parseUserPinFromXml(String xmlContent) {
    String userPin = "";
    try {
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        XmlPullParser parser = factory.newPullParser();
        parser.setInput(new StringReader(xmlContent));
        int eventType = parser.getEventType();
        boolean isInUserPinTag = false;

        while (eventType != XmlPullParser.END_DOCUMENT) {
            String tagName = parser.getName();
            switch (eventType) {
                case XmlPullParser.START_TAG:
                    if ("userPin".equals(tagName)) {
                        isInUserPinTag = true;
                    }
                    break;
                case XmlPullParser.TEXT:
                    if (isInUserPinTag) {
                        userPin = parser.getText().trim(); // 去掉可能的空格
                        isInUserPinTag = false; // 拿到值后就标记为false,避免重复读取
                    }
                    break;
                case XmlPullParser.END_TAG:
                    if ("userPin".equals(tagName)) {
                        isInUserPinTag = false;
                    }
                    break;
            }
            eventType = parser.next();
        }
    } catch (Exception e) {
        Log.v("XmlParseError", e.toString());
    }
    return userPin;
}

额外注意事项

  • 网络请求线程:别忘了Android不允许在主线程执行网络请求,所以你需要把getUserPin方法放在子线程里执行(比如用AsyncTask、Coroutine或者Thread)。
  • 权限:确保你的AndroidManifest.xml里添加了网络权限:<uses-permission android:name="android.permission.INTERNET" />

你贴的Postman返回的XML格式是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<usersTable>
  <employeeId>2</employeeId>
  <employeeName>Tom Williams </employeeName>
  <userPin>666666</userPin>
</usersTable>

用上面的解析方法就能准确提取出666666这个userPin值啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:46:30