Android:以编程方式创建和发送XML SOAP请求

时间:2013-03-15 05:55:44

标签: android xml soap wsdl

嗨,谢谢你。我发现了这个教程,我试图模仿它:http://lalit3686.blogspot.com/2012/06/calling-soap-webservice-using-httppost.html。在我的iOS应用程序中,我能够创建一个包含xml属性的字符串,将其作为SOAP请求发送,并以字符串形式获取xml响应。我正在尝试用我的Android应用程序做同样的事情。

不幸的是有些东西不起作用。我附上了相关的代码。

    StringBuilder stringBuilder = new StringBuilder ();
    stringBuilder.append(String.format("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"\n" +
            "xmlns:csr=\"http://www.mywebsite.net/\">\n" +
            "<soapenv:Header/>\n" +
            "<soapenv:Body>\n" +
            "<csr:www.mywebsite.net><![CDATA[\n" +
            "<www.mywebsite.net>\n" +
            "<Request>\n" +
            "<user>%s</user>\n" +
            "<password>%s</password>\n" +
            "<Function>requestdata</Function>\n" +
            "<FromDate>2013-01-01</FromDate>\n" +
            "<ToDate>2014-01-01</ToDate>\n" +
            "</Request>\n" +
            "</www.mywebsite.net>\n" +
            "]]></csr:www.mywebsite.net>\n" +
            "</soapenv:Body>\n" +
            "</soapenv:Envelope>\n", username, password));

    String xml = stringBuilder.toString();
    HttpPost httpPost = new HttpPost("http://www.mywebsite.net/");
    StringEntity entity;
    String response_string = null;

    try {

        entity = new StringEntity(xml, HTTP.UTF_8);
        httpPost.setHeader("Content-Type","text/xml;charset=UTF-8");
        httpPost.setEntity(entity);
        HttpClient client = new DefaultHttpClient();
        HttpResponse response = client.execute(httpPost);
        response_string = EntityUtils.toString(response.getEntity());
        Log.d("request", response_string);
        prefs.edit().putString("response", response_string).commit();

    } 

    catch (Exception e) {
        e.printStackTrace();
    }

编辑:问题已解决。我收到了错误:

android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099).

上面的代码有效 - 只需确保在onCreate()方法中包含此代码。

 if (android.os.Build.VERSION.SDK_INT > 9) {
  StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
  StrictMode.setThreadPolicy(policy);
 }

这允许您将主线程用于SOAP请求/响应。

3 个答案:

答案 0 :(得分:2)

我收到了错误:

android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)。

我搜索了这个错误并发现了这个链接:DefaultHttpClient to AndroidHttpClient - 这表明我在onCreate方法中包含以下代码。

if (android.os.Build.VERSION.SDK_INT > 9) {
  StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
  StrictMode.setThreadPolicy(policy);
}

现在它的工作。实际上,Android不再允许在主线程上执行网络操作。

答案 1 :(得分:1)

这是因为您在UI线程上运行违反严格模式的网络操作。使用AsyncTask进行后台操作。

答案 2 :(得分:0)

http://www.youtube.com/watch?v=v9EowBVgwSo。该视频有一个如何在android中发送soap webservice请求的教程。

http://www.helloandroid.com/tutorials/using-ksoap2-android-and-parsing-output-data。这里的链接有一个解释的例子。浏览链接并相应地修改您的代码。

以xml格式发送请求。我有类似的要求,我用下面的格式以xml格式发送了一个soap reuest。根据您的需要修改以下内容。我

PropertyInfo loginreq = new PropertyInfo();
loginreq.name="LoginReq";
loginreq.type=String.class;
loginreq.setValue("<LoginReq>" 
     +"<nickName>"+name+"</nickName>" 
     +"<password>"+pass+"</password>" 
     +"<IMEI>"+mImei+"</IMEI>" 
     +"<location>" 
     +"<latitude>"+lati+"</latitude>"
         +"<longitude>"+longi+"</longitude>"
     +"</location>" 
     +"</LoginReq>");
request.addProperty(loginreq);

Android, sending XML via HTTP POST (SOAP)。请查看链接中已加入的答案。

编辑

http://www.ibm.com/developerworks/opensource/library/x-android/。查看标题Creating XML。