【问题标题】:Android kSOAP web service problemAndroid kSOAP web服务问题
【发布时间】:2011-07-08 14:11:31
【问题描述】:

我正在尝试通过 kSOAP(直接从 Google 下载并包含“.jar”)调用公共网络服务 (w3schools.com/webservices/tempconvert.asmx)。

这是我的代码:

// declarations

private static final String NAMESPACE = "http://tempuri.org/" ;
private static final String METHOD_NAME = "CelsiusToFahrenheit";
private static final String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit";
private static final String URL = "http://216.128.29.26/webservices/tempconvert.asmx";

// code

try
{
   SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
   SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
   HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

   request.addProperty("Celsius", "32");
   envelope.setOutputSoapObject(request);
   androidHttpTransport.call(SOAP_ACTION, envelope);

   Object result = envelope.getResponse();
}
catch(Exception e)
{
   e.printStackTrace();
}

另外,“AndroidManifest.xml”包含访问互联网的权限:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

另外,我的 AVD 可以访问互联网(通过浏览器应用尝试过)。

有人可以帮帮我吗?我已经尝试了大约 6 个小时,但仍然失败。

谢谢!

【问题讨论】:

  • 有什么问题?有什么异常或错误吗?发布日志猫
  • @Balaji:是的。出现异常。如果有帮助,这是一个堆栈跟踪。 i54.tinypic.com/2e0vl2r.png
  • 我仍然有问题,这越来越紧急。有人吗?

标签: java android web-services ksoap


【解决方案1】:

问题是您正在主线程上进行网络调用,并且在 API 级别 12 中不再允许这样做。您只需将 ksoap2 调用移动到 AsyncTask 左右。顺便说一句,任何进行网络访问的东西都会出现这个问题。这是一个强制的严格模式检查。

【讨论】:

  • 我正在 'AsyncTask' 中进行网络服务调用。但是得到 Expected start_tag .....blah blah ...任何建议。 PS:一个
  • 您需要调试以检查您的响应转储是什么。在 ksoap2-android wiki 上查找详细信息。
  • 我缓存 XMLPullParserException 后的响应转储是一个 HTML 字符串,它的错误描述为“CACHE ACCESS DENIED”。因为它是 HTML 响应而不是 SOAP XML 响应。所以 KSOAP 的解析器正在寻找“XML SOAP 响应的开始标记”,但在那里没有找到,所以触发了异常“预期的 START_TAG ....”
  • 嗯..你的服务器不应该抛出一个html响应错误,而是一个soapfault......修复你的服务器或在你的android代码中捕获与该问题有关的异常,寻找那个特定的错误消息左右。
  • 嘿,谢谢你的关注,我刚刚通过使用 java.net.Proxy 实例在应用程序中设置代理解决了这个问题。
【解决方案2】:

好像你在做和我一样的教程。 http://www.vimeo.com/9633556

你好像不见了envelope.dotNet = true;

【讨论】:

【解决方案3】:

不完全是。我以前有过(尝试了至少 5 种不同的方法)。它没有帮助。这是 API 版本。我有 12 个。它没有用。我在某处发现 kSOAP 仅适用于 8 或更低版本。去图:)

我希望每个遇到这个问题的人都能在他们花太多时间使用 12 API 之前找到这个问题。

【讨论】:

  • 这是完全错误的。 ksoap2-android 在 Android 4.0 之前工作得很好。问题是您正在尝试在 UI 线程上进行网络访问,就像我在回答中所说的那样,并且 Android 框架本身从 API 级别 12 起不再允许这样做。
【解决方案4】:

我刚刚使用 api 版本 10 和 ksoap2 尝试了我自己的代码(仅在尝试使用的 web 服务中有所不同),它仍然可以按预期工作。

            private static final String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit";
            private static final String METHOD_NAME = "CelsiusToFahrenheit";
            private static final String NAMESPACE = "http://tempuri.org/";
            private static final String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";
            System.out.println("--==Creating SOAP object==--");
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
            request.addProperty("Celsius", "32");
            System.out.println("--==Finished Creating SOAP object==--");

            System.out.println("--==Creating SOAP envelope==--");
            SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
                    SoapEnvelope.VER11);
            soapEnvelope.dotNet = true;
            soapEnvelope.setOutputSoapObject(request);
            System.out.println("--==Finished Creating SOAP envelope==--");

            HttpTransportSE aht = new HttpTransportSE(URL);
            // aht.debug = true;

            try {
                System.out.println("--==Creating SOAP call==--");
                aht.call(SOAP_ACTION, soapEnvelope);
                System.out.println("test");

                SoapPrimitive response = (SoapPrimitive) soapEnvelope.getResponse();
                System.out.println(response.toString());
                tableData.addView(resultSoap);
                System.out.println("--==Finished Creating SOAP call==--");
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (aht.debug == true) {
                System.out.println(aht.responseDump);
            }

【讨论】:

  • 10 没试过。12 试过了,还是不行。用8试了一下,效果很好。试试 11 或 12...
  • 顺便说一句,我们有保存服务(我刚刚将 w3schools.com 转换为 IP,因为我发现了一个建议,这可能是我的问题的原因):)
【解决方案5】:
package com.soap;

    import org.ksoap2.SoapEnvelope;
    import org.ksoap2.serialization.SoapObject;
    import org.ksoap2.serialization.SoapPrimitive;
    import org.ksoap2.serialization.SoapSerializationEnvelope;
    import org.ksoap2.transport.AndroidHttpTransport;

    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
    public class SoapsActivity extends Activity {
    /** Called when the activity is first created. */
    private static final String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit";
    private static final String METHOD_NAME = "CelsiusToFahrenheit";
    private static final String NAMESPACE = "http://tempuri.org/"; 
    private static final String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv = (TextView) findViewById(R.id.tvsoap);
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        request.addProperty("Celsius", "32");
        SoapSerializationEnvelope evenlop = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        evenlop.dotNet = true;
        evenlop.setOutputSoapObject(request);
        AndroidHttpTransport aht = new AndroidHttpTransport(URL);
        try {
            aht.call(SOAP_ACTION, evenlop);
            SoapPrimitive resultString = (SoapPrimitive) evenlop.getResponse();
            tv.setText("ststus :" + resultString.toString());
        } catch (Exception e) {
            System.out.println(e.toString());
        }

    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多