【问题标题】:Post XML request and XML response Volley Library发布 XML 请求和 XML 响应 Volley 库
【发布时间】:2017-09-26 11:18:12
【问题描述】:

我已经集成了可以很好地使用 JSON 的 volley 库。现在正在尝试访问 WCF SOAP 我不知道如何将 XML 字符串作为请求传递以及如何获取 XML 字符串作为响应。

【问题讨论】:

    标签: android xml wcf post android-volley


    【解决方案1】:
        // 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);

    【讨论】:

      【解决方案2】:

      您可以使用 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
         }
      }
      );
      

      【讨论】:

        【解决方案3】:

        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 对象而无需您的编码工作。

        【讨论】:

          【解决方案4】:

          假设您想使用 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

          【讨论】: