До сих пор я создал клиент PHP и клиент VB.NET, которые успешно вызывают мой веб-сервис PHP. Чтобы заставить последнее работать, мне нужно было использовать инструмент SoapUI из SourceForge. Он сказал мне, что мой wsdl не соответствует требованиям WS-I. Мне не нужна версия Pro для интерактивного тестирования моего сервиса, поскольку она позволяет напрямую редактировать запрос на мыло. После исправления моего WSDL и запуска моего клиента VB.Net Android все еще остается проблемой.
Я также прикрепил исходный код для ksoap2-andriod, чтобы можно было выполнять отладку. Это немного помогло, но есть связанные зависимости, для которых исходники не включены, в частности "kxml2 v1.6". Если кто-нибудь может указать мне на исходный почтовый индекс или банку для этого, я был бы признателен.
Это ошибка, которую я не могу пройти при вызове веб-службы PHP из моего клиента Android.
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 - позиция @10.42 является концом открывающего тега определений.
Я считаю, что, поскольку WSDL теперь совместим с WS-I, проблема заключается в определениях этого пространства имен службы, интерпретируемых 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);
}
}
Если я делаю что-то глупое, и кто-то может указать на это, я был бы признателен.
Есть ли директива не кэшировать и повторно использовать wsdl в Android, как в 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();