2012-08-15 98 views
6

到目前爲止,我已經創建了一個PHP客戶端和一個VB.NET客戶端,它們都成功地調用了我的PHP Web服務。爲了讓後者工作,我需要使用SourceForge的SoapUI工具。它告訴我,我的wsdl不符合WS-I標準。我不需要Pro版本交互測試我的服務,因爲它允許您直接編輯肥皂請求。修復我的WSDL並讓我的VB.Net客戶端運行Android仍然是一個問題。如何使用kso​​ap2-android正確調用我的PHP webservice?

我也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 [email protected]) 

它告訴我它不能解析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); 

*有一些錯誤返回此值時,它已收到,但傳遞時拋出一個錯誤back from 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中那樣在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(); 
+0

指定WSDL:http://www.w3.org/TR/wsdl – hakre 2012-08-15 13:51:46

+0

當談到編寫/使用Web服務時,我的觀點是「除SOAP之外的任何東西」。 SOAP代表「嚴重超架構協議」。設置起來很痛苦,速度很慢,容易變脆。有很多更好的選擇。如果您有選擇,請轉儲SOAP,然後使用Rest,JSON或Thrift。 – SDC 2012-08-15 15:43:01

+0

感謝您的評論,我也將看到Restful JSON解決方案。儘管我在這裏的問題是關於如何讓SOAP工作。我想確信我創建的WSDL是正確的。我將通過WSDL規範(感謝鏈接hakra),除非有一個可以幫助我的快捷方式..就像.NET soap工具箱使用實用程序自動創建WSDL一樣。 – Kickaha 2012-08-15 16:25:35

回答

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

但這是一個不同的問題。

謝謝您的意見。

3

我非常喜歡開發一個Restful web服務。開發Web服務的原因很多,除了SOAP以外,還有其他的一些原因。我在SOAP上做了一個非常小的項目,只是爲了獲得全面的情況,然後開始放鬆,因爲它具有更多的優勢。 開發兩種型號Netbeans IDE提供非常方便的設施。閱讀 Web Services Learning Trail

該鏈接包含restful和SOAP/WDSL Web服務開發以非常簡單的方式...希望這會有所幫助。

+1

感謝您的鏈接,我一直在使用eclipse而不是netbeans,並會試用它。此外,我確實認爲Restful解決方案可能是更好的選擇。但是,首先像你一樣,我想得到大局。無法獲得SOAP/WSDL的工作不是我想用於轉移到Restful方法的原因。 – Kickaha 2012-08-15 16:19:22

相關問題