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

