【发布时间】:2017-09-26 11:18:12
【问题描述】:
我已经集成了可以很好地使用 JSON 的 volley 库。现在正在尝试访问 WCF SOAP 我不知道如何将 XML 字符串作为请求传递以及如何获取 XML 字符串作为响应。
【问题讨论】:
标签: android xml wcf post android-volley
我已经集成了可以很好地使用 JSON 的 volley 库。现在正在尝试访问 WCF SOAP 我不知道如何将 XML 字符串作为请求传递以及如何获取 XML 字符串作为响应。
【问题讨论】:
标签: android xml wcf post android-volley
// Tag used to cancel the request
String tag_string_req = "string_req";
//String url = "URL......";
final ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setMessage("Loading...");
pDialog.show();
StringRequest strReq = new StringRequest(Request.Method.POST,
url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, response.toString());
pDialog.hide();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
pDialog.hide();
}
}){
@Override
public String getBodyContentType() {
return "application/xml; charset=" +
getParamsEncoding();
}
@Override
public byte[] getBody() throws AuthFailureError {
String postData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<sampletag>\n" +
"\t<sampletag>data</sampletag>\n" +
"</sampletag>"; // TODO get your final output
try {
return postData == null ? null :
postData.getBytes(getParamsEncoding());
} catch (UnsupportedEncodingException uee) {
// TODO consider if some other action should be taken
return null;
}
}
};
// 将请求添加到请求队列 AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
【讨论】:
您可以使用 Volley 的 String 请求。 String 请求返回一个字符串,您可以使用 XMLReader 解析它
StringRequest req = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>()
{
@Override
public void onResponse(String response) {
processDataUsingXMLReader(reponse);
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error) {
// handle error response
}
}
);
【讨论】:
Volley没有任何XML Request,查看官方文档:https://android.googlesource.com/platform/frameworks/volley/+/android-4.3_r0.9/src/com/android/volley/toolbox/
有两种方法可以做到:
方法一
因此,您必须使用 StringRequest 获取原始字符串,然后对其进行解析。
代码:
StringRequest request = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>()
{
@Override
public void onResponse(String response) {
// now, convert response (String) to XML
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error) {
//error
}
}
);
queue.add(request);
要将String 转换为XML:
你可以试试Simple-XML,它是一个 XML Marshaling Tool。链接:http://simple.sourceforge.net/download.php
示例代码(使用Simple 将字符串转换为xml):
Serializer serializer = new Persister();
serializer.read(Pojo.class, response);
方法二
试试这个 Volley 适配器类:https://gist.github.com/itsalif/6149365 它也做同样的事情,使用 Simple-XML 序列化 XML 对象而无需您的编码工作。
【讨论】:
假设您想使用 Android Volley 从 String 响应中解析 XML 数据,您可以通过使用 ByteArrayInputStream 将响应转换为 InputStream 来实现,如下所示:
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
XMLParser xmlParser = new XMLParser();
InputStream inputStream = new
ByteArrayInputStream(response.getBytes("UTF-8"));
List<YourObject> object = new ArrayList<>();
object.addAll(xmlParser.parseFeed(inputStream));
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
此示例仅演示了解析 RSS 提要并将对象数组存储在 List 中,更详细地演示了 here。
【讨论】: