2

嗨,提前感谢。我找到了这个教程,我正在尝试模仿它: 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 请求/响应。

4

3 回答 3

3

我收到了错误:

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 不再让网络操作在主线程上进行。

于 2013-03-15T07:21:43.123 回答
1

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

于 2013-11-15T21:56:55.043 回答
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 形式发送肥皂请求。根据您的需要修改以下内容。一世

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,通过 HTTP POST (SOAP) 发送 XML。查看链接中接受的答案。

编辑

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

于 2013-03-15T06:05:41.063 回答