到目前爲止,我已經創建了一個PHP客戶端和一個VB.NET客戶端,它們都成功地調用了我的PHP Web服務。爲了讓後者工作,我需要使用SourceForge的SoapUI工具。它告訴我,我的wsdl不符合WS-I標準。我不需要Pro版本交互測試我的服務,因爲它允許您直接編輯肥皂請求。修復我的WSDL並讓我的VB.Net客戶端運行Android仍然是一個問題。如何使用ksoap2-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();
指定WSDL:http://www.w3.org/TR/wsdl – hakre 2012-08-15 13:51:46
當談到編寫/使用Web服務時,我的觀點是「除SOAP之外的任何東西」。 SOAP代表「嚴重超架構協議」。設置起來很痛苦,速度很慢,容易變脆。有很多更好的選擇。如果您有選擇,請轉儲SOAP,然後使用Rest,JSON或Thrift。 – SDC 2012-08-15 15:43:01
感謝您的評論,我也將看到Restful JSON解決方案。儘管我在這裏的問題是關於如何讓SOAP工作。我想確信我創建的WSDL是正確的。我將通過WSDL規範(感謝鏈接hakra),除非有一個可以幫助我的快捷方式..就像.NET soap工具箱使用實用程序自動創建WSDL一樣。 – Kickaha 2012-08-15 16:25:35