【问题标题】:kSOAP2 output / org.xmlpull.v1.xmlpullparserexception expected start_tagkSOAP2 输出 / org.xmlpull.v1.xmlpullparserexception 预期 start_tag
【发布时间】:2010-12-09 05:58:16
【问题描述】:

我有一个标准代码可以调用.net webservice

我收到exception "org.xmlpull.v1.xmlpullparserexception expected start_tag" 在线

transportSE.call(SOAP_ACTION,soapSerializationEnvelope);

但是,如果我从 .NET code 调用相同的 Web 服务,我会根据需要得到结构良好的正确输出。

似乎从kSOAP2 开始,它得到了一个明确的输出,但是当它进一步解析 w.r.t SoapPrimitive 对象时,它失败了。

那么,有没有其他方法可以查看收到的实际输出(实际的肥皂信封),然后可以自己适当地解析它。

【问题讨论】:

  • 您的 .NET Web 服务是否返回原始类型?如果不是,那么您应该尝试使用 SoapObject 代替 SoapPrimitive 类型。
  • 它返回一个字符串,所以是的......SoapObject 应该在这里,但这不是我面临问题的地方。它卡在 transportSE.call(SOAP_ACTION,soapSerializationEnvelope);那么,我如何查看实际/原始肥皂信封...出于验证目的,因为在调用方法中会发生解析异常
  • 我看到,通过调用“transportSE.requestDump”,信封完全符合要求,并通过调用“transportSE.responseDump”得到一个空字符串,我得到一个空的o/p调用到“soapSerializationEnvelope.bodyIn”...任何输入家伙...我真的卡住了...我的意思是我看不出有什么不同的事情要做,主要是其他非移动客户端能够从同一个给定的网络获取所需的响应-服务

标签: android android-ksoap2


【解决方案1】:

我正在调查我遇到的类似问题。无意中看到这条评论

当我使用 SoapEnvelope.VER11 时,它工作正常,但是当我使用 SoapEnvelope.VER12,它给了我错误: “org.xmlpull.v1.XmlPullParserException:预期:START_TAG”。

http://groups.google.com/group/android-developers/browse_thread/thread/b585862b6e939fd2

也许我们在肥皂版本方面遇到了兼容性问题。还连接到 dot net 服务,您可能需要设置 envelope.dotNet = true; .. 但您可能已经这样做了

【讨论】:

    【解决方案2】:

    我得到了这个 START_TAG 异常,但在我的情况下,这是因为我的价值观

    METHOD_NAME="";
    NAMESPACE ="";      
    SOAP_ACTION ="";
    URL ="";
    

    不正确。

    现在如何找出这些参数的正确值你可以Check out my other answer here

    SoapObject req = new SoapObject(NAMESPACE,METHOD_NAME);
                //SoapObject req = new SoapObject(Namespace_Server,MethodName_Server);
    
        //req.addProperty("ImageData", Base64.encode(data));
        req.addProperty("ImageData", data);
        req.addProperty("login", CommonStaticData.getusername());
        req.addProperty("password",CommonStaticData.getpassword());
        req.addProperty("recipeId",FileID);
    
        MarshalBase64 mbase = new MarshalBase64();// marshal is used to serialize the byte array
    
        SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelop.bodyOut = req;
        envelop.encodingStyle = SoapSerializationEnvelope.ENC2001;
        envelop.dotNet = true;
        envelop.setOutputSoapObject(req);
    
    
        HttpTransportSE aht = new HttpTransportSE(URL);
    
        mbase.register(envelop);
    
    
        aht.call(SOAP_ACTION,envelop);
    

    【讨论】:

      【解决方案3】:

      好吧,既然我已经解决了我原来的问题,那就来解决这个问题吧!

      我发现 ksoap2 无法解析响应...特别是 org.kxml2.io.KXmlParser.require(type, namespace, name) 抛出了以下异常。

      WARN/System.err(2330): org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://www.w3.org/2001/12/soap-envelope}Envelope (position:START_TAG <h1>@1:4 in java.io.InputStreamReader@47ff3050) 
      

      注意 h1 标签。这来自&lt;h1&gt;404 Not Found&lt;/h1&gt; ...所以是的,请注意您的回复可能来自网站,而不是您的网络服务:)

      希望有一天能对某人有所帮助

      【讨论】:

        【解决方案4】:

        我遇到了几乎相同的错误,我的例外是“position:START_TAG @2:7”

        但我已经修复了,因为我以错误的方式命名参数,名称必须与 XSD 上指定的完全一致。

             SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
             request.addProperty("arg0_java_lang_String", "Club");
        

        addPropery 方法中,我使用了错误的参数名称。

        【讨论】:

          【解决方案5】:


          通过观察变量 urlc.getResponseCode() 的响应代码,同时从 localhost 更改 ip,使用以下代码确保 web 服务的 url 可访问 后,固定,外部,最后到 10.0.2.2

          public static boolean isNetworkAvailable() {
          //http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts/4009133#comment24565402_4009133
                  /* ConnectivityManager cm =
                              (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
                          NetworkInfo netInfo = cm.getActiveNetworkInfo();
                          if (netInfo != null && netInfo.isConnected()) {//netInfo.isConnectedOrConnecting()
                              return true;
                          }
                          return false;*/
          
          //http://stackoverflow.com/questions/5474089/how-to-check-currently-internet-connection-is-available-or-not-in-android?rq=1             
                          boolean connected = false;
                          ConnectivityManager connectivityManager = (ConnectivityManager)_context.getSystemService(Context.CONNECTIVITY_SERVICE);
                              if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || 
                                      connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
                                  //we are connected to a network
                                  connected=true;
                                  return connected;
                              }
                              else
                                  {
                                  connected=false;
                                  return false;
                                  }
              }
          
              public static boolean hasActiveInternetConnection() {
                  if (isNetworkAvailable()) {
                      try {
                          //String url = "http://www.google.com",
                          String url = "http://10.0.2.2:8089/UNIV_AXIS_DYN_WEB/services/ServiceMethods?wsdl",
                                  proxy = "proxy.rss.jo",
                                  port= "8080";
                          URL server = new URL(url);
                          Properties systemProperties = System.getProperties();
                          /*systemProperties.setProperty("http.prosyHost",proxy);
                          systemProperties.setProperty("http.prosyHost",port);*/
                          HttpURLConnection urlc = (HttpURLConnection) (server.openConnection());
                          urlc.setRequestProperty("User-Agent", "Test");
                          urlc.setRequestProperty("Connection", "close");
                          urlc.setConnectTimeout(500); 
                          urlc.connect();
                          System.out.println(urlc.getResponseCode());
                          return (urlc.getResponseCode() == 200);
                      } catch (IOException e) {
                          Log.e(LOG_TAG, "Error checking internet connection", e);
                          return false;
                      }
                  } else {
                      Log.d(LOG_TAG, "No network available!");
                      return false;
                  }
          
              }
          

          对我来说,我得到了这个提示“不是下面缺少的字符 s

          [ERROR] Exception occurred while trying to invoke service method login org.apache.axis2.AxisFault: namespace mismatch require http://services.univ.rss found http://service.univ.rss

          tomcat等日志的其余部分

          at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:190)
              at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:117)
              at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
              at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
              at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:181)
              at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:172)
              at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:146)
              at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
              at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
              at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
              at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
              at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
              at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
              at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
              at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
              at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
              at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
              at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
              at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
              at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
              at java.lang.Thread.run(Unknown Source)
          

          是的,在跟踪 LogCat 之后,如果服务被 SoapUi 测试成功,我没有检查 th tomcat 服务器日志,你应该在每次更改测试中监控所有日志,我什至一开始忘记启动数据库服务所以小心:)

          肥皂电话

          public SoapObject SoapCall(Vector<PropertyInfo> propertyInfo)
          
              {       
          
                   Integer parametersSize = propertyInfo.size();
          
                   //Initialize soap request + add parameters
                   SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
          
                   for(int i=0;i<parametersSize;i++)
                   {
                       request.addProperty(propertyInfo.get(i));
                   }
          
          
                  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                  //envelope.dotNet = false; if service of type asmx .NET
                  envelope.setOutputSoapObject(request);
          
                  Log.d("App Log c ","c");
          
                  HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                  try {
                      System.out.println(androidHttpTransport.getPort());
                      // Make the soap call.
                      //this is the actual part that will call the webservice
                       androidHttpTransport.call(SOAP_ACTION, envelope);                      
          
                       SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
                       //Log.i("App Log 1 ", response.toString());
          
                  } catch (Exception e) {
                      e.printStackTrace(); 
                  }
          
                  // Get the SoapResult from the envelope body.       
                  SoapObject result = (SoapObject)envelope.bodyIn;
                  Log.i("App Log 2 ", result.toString());
                  Log.i("App Log 2 ", result.getProperty(0).toString());
          
                  return result;
          
              }
          



           Vector<PropertyInfo> vectorProperyInfo = new Vector<PropertyInfo>();
          
                      PropertyInfo userProp = new PropertyInfo();
                      userProp.setName("userName");
                      userProp.setValue(username);
                      userProp.setType(String.class);
                      vectorProperyInfo.addElement(userProp);
          
                      PropertyInfo passProp = new PropertyInfo();
                      passProp.setName("pass");
                      passProp.setValue(password);
                      passProp.setType(String.class);
                      vectorProperyInfo.addElement(passProp);
          
                      SoapObject result = soapUtil.SoapCall(vectorProperyInfo);
          
                     if (result != null && result.getProperty(0).toString().equals("1")) {
                      return "LOGIN_SUCCESS";// for a student
                  }
          

          P.S我的数据库是Oracle,webservice是soap并使用axis2-1.2 bin并在Android 4.0上测试上述错误响应代码为500 Internal Error

          【讨论】:

            猜你喜欢
            • 2012-09-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-18
            • 1970-01-01
            相关资源
            最近更新 更多