如何使用ksoap2 android正确调用我的PHP Web服务?

如何使用ksoap2 android正确调用我的PHP Web服务?,php,android,soap,android-ksoap2,Php,Android,Soap,Android Ksoap2,到目前为止,我已经创建了一个PHP客户端和一个VB.NET客户端,它们都成功地调用了我的PHP web服务。为了让后者发挥作用,我需要使用来自的SoapUI工具。它告诉我我的wsdl不符合WS-I。我不需要Pro版本以交互方式测试我的服务,因为它允许您直接编辑soap请求。在修复我的WSDL并使我的VB.Net客户端运行android之后,仍然是一个问题 我还可以在调试过程中单步执行。这有一点帮助,但是有一些捆绑的依赖项不包括源代码,特别是“kxml2v1.6”。如果有人能为我指出一个源zip或

到目前为止,我已经创建了一个PHP客户端和一个VB.NET客户端,它们都成功地调用了我的PHP web服务。为了让后者发挥作用,我需要使用来自的SoapUI工具。它告诉我我的wsdl不符合WS-I。我不需要Pro版本以交互方式测试我的服务,因为它允许您直接编辑soap请求。在修复我的WSDL并使我的VB.Net客户端运行android之后,仍然是一个问题

我还可以在调试过程中单步执行。这有一点帮助,但是有一些捆绑的依赖项不包括源代码,特别是“kxml2v1.6”。如果有人能为我指出一个源zip或Jar,我将不胜感激

这是我从android客户端调用PHP Web服务时无法克服的错误

  org.xmlpull.v1.XmlPullParserException: expected: START_TAG   {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <definitions name='naturallyIrrationalsoapserver' targetNamespace='http://www.naturallyIrrational.com'>@10:42 in java.io.InputStreamReader@44dce560)
*下一行不正确,应指向 *

        final String URL = "http://www.naturallyIrrational.com/naturallyIrrationalsoapserver.wsdl";

        if (InternetStatus.getInstance(this).isOnline(this)) {

            try{                            
                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);


                    PropertyInfo pi = new PropertyInfo();
            pi.setName("valname");
            pi.setValue("rt2");
            pi.setType(String.class);
            request.addProperty(pi);    

                 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);  
                    envelope.dotNet=false;
                    envelope.setOutputSoapObject(request); 
                    HttpTransportSE andHttpTransport = new HttpTransportSE(URL); 
                    andHttpTransport.debug = true;
                    andHttpTransport.call(SOAP_ACTION, envelope);
 soapResponse = (String) envelope.getResponse();  //Exception is thrown here  
                        String strrequest = andHttpTransport.requestDump;
                        String strresponse = andHttpTransport.responseDump;

            }catch(Exception e){soapResponse = "Nope not working "+"\n\n" + e.getMessage() + "/n/n" + e.getStackTrace() ;}
            } else {soapResponse="You are not online"; }   


        tv.setText(soapResponse);    
    }
}
*返回此值时出错,已收到该值,但从ksoap传回时抛出错误*

        final String URL = "http://www.naturallyIrrational.com/naturallyIrrationalsoapserver.wsdl";

        if (InternetStatus.getInstance(this).isOnline(this)) {

            try{                            
                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);


                    PropertyInfo pi = new PropertyInfo();
            pi.setName("valname");
            pi.setValue("rt2");
            pi.setType(String.class);
            request.addProperty(pi);    

                 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);  
                    envelope.dotNet=false;
                    envelope.setOutputSoapObject(request); 
                    HttpTransportSE andHttpTransport = new HttpTransportSE(URL); 
                    andHttpTransport.debug = true;
                    andHttpTransport.call(SOAP_ACTION, envelope);
 soapResponse = (String) envelope.getResponse();  //Exception is thrown here  
                        String strrequest = andHttpTransport.requestDump;
                        String strresponse = andHttpTransport.responseDump;

            }catch(Exception e){soapResponse = "Nope not working "+"\n\n" + e.getMessage() + "/n/n" + e.getStackTrace() ;}
            } else {soapResponse="You are not online"; }   


        tv.setText(soapResponse);    
    }
}
如果我做了一些愚蠢的事情,有人能指出,我会很感激的

有没有一个指令可以像PHP一样在Android中缓存和重用wsdl

也许使用网豆会有帮助,那是我下一次有时间的时候。如果有人能在此期间提供帮助,请毫不犹豫地提出建议

<?php
class naturallyIrrational {
  private $arrval = array("pi" => 3.1415,"e" =>  2.7183, "rt2" => 1.414, "phi" => 1.618 );  
  function getIrrationalvalue($valname) {
$myFile = "logFile.html";
$fh = fopen($myFile, 'a') or die("can't open file");
$datq = date('m/d/Y h:i:s a', time());
fwrite($fh, $datq);
if (isset($this->arrval[$valname])) {

$stringData = " ".$valname." = ".$this->arrval[$valname]."<br/>";
fwrite($fh, $stringData);
fclose($fh);      
return $this->arrval[$valname];
    } else {
    throw new SoapFault("Server","Unknown Symbol '$valname'.");
    }
  }
}
$server = new SoapServer("naturallyIrrational.wsdl");
$server->setClass("naturallyIrrational");
$server->handle();

我开发了一个Restful web服务。将web服务开发为restful而不是SOAP的原因有很多。我在SOAP上做了一个非常小的项目,只是为了了解全局,然后转而开发restful,因为它更具优势。
为了开发这两种模型,Netbeans IDE提供了非常方便的工具。阅读


该链接以非常简单的方式包含restful和SOAP/WDSL web服务开发……希望这会有所帮助。

我发现URL字符串需要指向公共php

最终字符串URL=”http://www.naturallyIrrational.com/naturallyIrrationalsoapserver.php“

真的很简单的事情在3周后结束。下载源代码非常重要,因为它让我看到服务正在运行。关于传递参数还有另一个问题,如下所示:

PropertyInfo pi = new PropertyInfo();
pi.setName("valname");
pi.setValue("rt2");
pi.setType(String.class);
但这是另一个问题


感谢您的评论。

WSDL被指定为:当涉及到编写/使用web服务时,我目前的观点是“除了SOAP之外的任何东西”。SOAP代表“严重过度架构的协议”。这是痛苦的设置,它的缓慢,它往往是脆弱的。有很多更好的选择。如果你有选择的话,就扔掉SOAP,使用Rest、JSON或Thrift。谢谢你的评论,我还将介绍一个RESTfulJSON解决方案。恕我直言,我这里的问题是关于让SOAP正常工作的。我想确信我创建的WSDL是正确的。我将研究WSDL规范(感谢链接hakra),除非有人可以帮助我的快捷方式。。与.NET soap toolkit一样,使用实用工具自动创建WSDL。soap和Restful与其他工具相比具有优势。但大多数情况下使用Restful,因为它是轻量级的,并且支持所有MIME媒体类型,如JSON、XML、tex、urlencored等。再次感谢,但这仍然是一个WSDL/soap问题。感谢您的链接,我一直在使用eclipse而不是netbeans,并将尝试使用它。同时,我也认为,一个安静的解决方案可能是一个更好的方法。但首先像你一样,我想了解全局。无法使SOAP/WSDL工作并不是我想要使用Restful方法的原因。