Как правильно вызвать веб-службу PHP с помощью ksoap2-android?

До сих пор я создал клиент 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();

person Kickaha    schedule 15.08.2012    source источник
comment
Указан WSDL: w3.org/TR/wsdl   -  person hakre    schedule 15.08.2012
comment
Когда дело доходит до написания/использования веб-сервисов, мое текущее мнение совсем не SOAP. SOAP расшифровывается как серьезно перепроектированный протокол. Его сложно настроить, он медленный, он имеет тенденцию быть хрупким. Есть любое количество альтернатив, которые лучше. Если у вас есть выбор, откажитесь от SOAP и используйте Rest, JSON или Thrift.   -  person SDC    schedule 15.08.2012
comment
Спасибо за комментарий, и я также рассмотрю решение Restful JSON. С уважением, хотя мой вопрос здесь конкретно о том, как заставить работать SOAP. Я хочу быть уверен, что WSDL, который я создаю, правильный. Я буду работать со спецификацией WSDL (спасибо за ссылку hakra), если не будет ярлыка, с которым кто-то может мне помочь ... например, набор инструментов мыла .NET автоматически создает WSDL с помощью утилиты.   -  person Kickaha    schedule 15.08.2012
comment
SOAP и Restful имеют преимущества перед другими. Но в основном используется restful, поскольку он легкий и поддерживает все типы носителей MIME, такие как JSON, XML, tex, urlencored и многие другие.   -  person Ruwantha    schedule 16.08.2012
comment
Еще раз спасибо, но это все еще вопрос WSDL/SOAP.   -  person Kickaha    schedule 16.08.2012


Ответы (2)


Недавно я разработал веб-сервис Restful. Было много причин для разработки веб-сервиса как успокоительного, кроме SOAP. Я сделал очень маленький проект на SOAP, чтобы получить общую картину, а затем перешел к разработке на Restful, так как это дает больше преимуществ. Для разработки обеих моделей Netbeans IDE предоставляет очень удобные средства. Прочтите учебный курс по веб-сервисам

Эта ссылка содержит очень простую разработку веб-службы Restful и SOAP / WDSL ... Надеюсь, это поможет.

person Ruwantha    schedule 15.08.2012
comment
Спасибо за эту ссылку, я использовал eclipse, а не netbeans, и попробую. Также я принимаю предложение о том, что решение Restful может быть лучшим способом. Но сначала, как и вы, я хочу получить общую картину. Неспособность заставить работать SOAP/WSDL не является причиной, по которой я хочу использовать подход Restful. - person Kickaha; 15.08.2012

Я обнаружил, что строка 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);

но это другой вопрос.

Спасибо за ваши Коментарии.

person Kickaha    schedule 20.08.2012