如何使用kso​​ap2-android正确调用我的PHP Web服务?

时间:2012-08-15 01:42:48

标签: php android soap android-ksoap2

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

我也attached the source code for ksoap2-andriod这样我就可以在调试时逐步完成。它有一点帮助,但是没有包含源的捆绑依赖项,特别是“kxml2 v1.6”。如果有人能指出我的源拉链或罐子,我会很感激。

这是我从Android客户端调用PHP webservice时无法解决的错误。

  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)

它告诉我它无法解析WSDL \ XML - poistion @ 10.42是开放定义标记的结尾。

我认为,由于现在符合WS-I的WSDL,问题是由Ksoap2解释的这个服务命名空间定义。这是我用来调用它的android客户端代码。

public class SoapClientActivity extends Activity {
      @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView tv = (TextView) findViewById(R.id.myText);
        String soapResponse="";
        final String METHOD_NAME = "getArrval";
        final String SOAP_ACTION = "http://www.naturallyIrrational.com/naturallyIrrationalsoapserver.wsdl";
        final String NAMESPACE = "http://www.naturallyIrrational.com";

*下一行不正确,应该指向 http://www.naturallyIrrational.com/naturallyIrrationalsoapserver.php *

        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);

*返回此值有问题,已收到但从ksoap * 传回来时会抛出错误

 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中缓存和重用wsdl的指令,就像在PHP中一样?

也许使用net beans会有所帮助,那是我有空的时候。如果有人可以在此期间请求帮助,请不要犹豫,建议。

<?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();

2 个答案:

答案 0 :(得分:3)

我重新开发了Restful Web服务。除了SOAP之外,将Web服务开发为一个宁静的原因有很多。我做了一个关于SOAP的非常小的项目,只是为了获得全局,然后转向开发,因为它更有优势。 为了开发这两种模型,Netbeans IDE提供了非常方便的设施。读 Web Services Learning Trail

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

答案 1 :(得分:3)

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

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

3周后最终真的很简单。下载源代码是必不可少的,因为它允许我看到服务正在运行。有关传递参数的另一个问题,如:

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

但这是一个不同的问题。

感谢您的评论。