Невозможно получить параметры из веб-сервиса, используя KSOAP2 в Android - PullRequest
0 голосов
/ 29 марта 2012

Я занимаюсь разработкой Android-клиента для веб-службы ideone.com. Этот веб-сервис позволяет выполнять код на разных языках на онлайн-веб-сервере и получать вывод выполненного вами кода. Адрес WSDL для этого веб-сервиса:

http://ideone.com/api/1/service.wsdl

Я использую KSOAP2.4 для связи с веб-службой через приложение Android. Но я не получаю ответ от веб-службы должным образом. Ответ, который я получаю от веб-службы, содержит нулевые значения для последних четырех параметров. Вот код, который я использовал для вызова веб-службы:

public IdeoneSubmissionDetails getSubmissionDetails(String link,
        Boolean withSource, Boolean withInput, Boolean withOutput,
        Boolean withStderr, Boolean withCmpinfo) {

    IdeoneSubmissionDetails ret = null;
    Hashtable<String, Object> data = new Hashtable<String, Object>();

    try {
        SoapObject request = new SoapObject(NAMESPACE,"getSubmissionDetails");
        request.addProperty("user", "ashwanikumar");
        request.addProperty("pass", "13@silvi");
        request.addProperty("link", link);
        request.addProperty("withSource", withSource);
        request.addProperty("withInput", withInput);
        request.addProperty("withOutput", withOutput);
        request.addProperty("withStderr", withStderr);
        request.addProperty("withCmpinfo", withCmpinfo);
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.setOutputSoapObject(request);
        HttpTransportSE transport = new HttpTransportSE(URL);
        transport.debug = true;
        transport.call(SOAP_ACTION + "getSubmissionDetails", envelope);
        SoapObject so = (SoapObject) envelope.bodyIn;
        SoapObject so2 = (SoapObject) so.getProperty(0);
        int count = so2.getPropertyCount();
        for (int i = 0; i < count; ++i) {
            SoapObject so4 = (SoapObject) so2.getProperty(i);
            String key = so4.getProperty(0).toString();
            Log.i("Key", key);
            Object val = so4.getProperty(1);
            Log.i("Object",val.toString());
            data.put(key, val);
        }

        String error = (String) data.get("error");
        if (!error.equals("OK")) {
            System.out.println("Error occurred: " + error);
            return null;
        }

        ret = new IdeoneSubmissionDetails();
        ret.langId = (Integer) data.get("result");
        ret.langName = (String) data.get("langName");
        ret.langVersion = (String) data.get("langVersion");
        ret.date = (String) data.get("date");
        ret.time = Float.valueOf(((SoapPrimitive) data.get("time"))
                .toString());
        ret.result = (Integer) data.get("result");
        ret.status = (Integer) data.get("status");
        ret.memory = (Integer) data.get("memory");
        ret.signal = (Integer) data.get("signal");
        ret.isPublic = (Boolean) data.get("public");
        if (withSource.booleanValue()) {
            ret.source = (String) data.get("source");
        }
        if (withInput.booleanValue()) {
            ret.input = (String) data.get("input");
        }
        if (withOutput.booleanValue()) {
            ret.output = (String) data.get("output");
        }
        if (withStderr.booleanValue()) {
            ret.stderr = (String) data.get("stderr");
        }
        if (withCmpinfo.booleanValue()) {
            ret.cmpinfo = (String) data.get("cmpinfo");
        }

    } catch (IOException ex) {
        System.out.println("IO Error");
    } catch (NumberFormatException ex) {
        System.out.println("Number Format Error");
    } catch (Exception ex) {
        System.out.println("Error "+ex.toString());
    }

    return ret;
}

В ответ значение выходного параметра равно нулю. В случае любой ошибки Stderr вернет информацию об ошибке. при успешном выполнении кода выходной параметр должен содержать вывод выполненного вами кода. Для проверки выполнения веб-сервиса используется SOAPUI. Вот запрос, который я использовал для отправки кода на веб-сервис:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://ideone.com/api/1/service">
   <soapenv:Header/>
   <soapenv:Body>
      <ser:createSubmission soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <user xsi:type="xsd:string">ashwanikumar</user>
         <pass xsi:type="xsd:string">13@silvi</pass>
         <sourceCode xsi:type="xsd:string">class Main{public static void main (String[] args){    System.out.println("Hello");}}</sourceCode>
         <language xsi:type="xsd:int">10</language>
         <input xsi:type="xsd:string"></input>
         <run xsi:type="xsd:boolean">true</run>
         <private xsi:type="xsd:boolean">false</private>
      </ser:createSubmission>
   </soapenv:Body>
</soapenv:Envelope>

Ответ, который я получил от веб-службы:

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://ideone.com/api/1/service" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Body>
      <ns1:createSubmissionResponse>
         <return xsi:type="ns2:Map">
            <item>
               <key xsi:type="xsd:string">error</key>
               <value xsi:type="xsd:string">OK</value>
            </item>
            <item>
               <key xsi:type="xsd:string">link</key>
               <value xsi:type="xsd:string">8GaBJ</value>
            </item>
         </return>
      </ns1:createSubmissionResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Предыдущий запрос указывает, что код был успешно отправлен, и вы можете получить к нему доступ по ссылке

http://ideone.com/8GaBJ

Параметр 8GaBJ указывает идентификатор для созданного мною представления и используется для ссылки на представление позже. Второй запрос, который я создал, чтобы выполнить детали представления, это метод, который возвращает неправильный ответ при вызове с помощью клиента KSOAP2 android. Вот код:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://ideone.com/api/1/service">
   <soapenv:Header/>
   <soapenv:Body>
      <ser:getSubmissionDetails soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <user xsi:type="xsd:string">ashwanikumar</user>
         <pass xsi:type="xsd:string">13@silvi</pass>
         <link xsi:type="xsd:string">8GaBJ</link>
         <withSource xsi:type="xsd:boolean">TRUE</withSource>
         <withInput xsi:type="xsd:boolean">TRUE</withInput>
         <withOutput xsi:type="xsd:boolean">TRUE</withOutput>
         <withStderr xsi:type="xsd:boolean">TRUE</withStderr>
         <withCmpinfo xsi:type="xsd:boolean">TRUE</withCmpinfo>
      </ser:getSubmissionDetails>
   </soapenv:Body>
</soapenv:Envelope>

Ответ получен:

<SOAP-ENV:Body>
          <ns1:getSubmissionDetailsResponse>
             <return xsi:type="ns2:Map">
                <item>
                   <key xsi:type="xsd:string">error</key>
                   <value xsi:type="xsd:string">OK</value>
                </item>
                <item>
                   <key xsi:type="xsd:string">langId</key>
                   <value xsi:type="xsd:int">10</value>
                </item>
                <item>
                   <key xsi:type="xsd:string">langName</key>
                   <value xsi:type="xsd:string">Java</value>
                </item>
                <item>
                   <key xsi:type="xsd:string">langVersion</key>
                   <value xsi:type="xsd:string">sun-jdk-1.6.0.31</value>
                </item>
                <item>
                   <key xsi:type="xsd:string">time</key>
                   <value xsi:type="xsd:float">0.03</value>
                </item>
                <item>
                   <key xsi:type="xsd:string">date</key>
                   <value xsi:type="xsd:string">2012-03-29 07:30:29</value>
                </item>
                <item>
                   <key xsi:type="xsd:string">status</key>
                   <value xsi:type="xsd:int">0</value>
                </item>
                <item>
                   <key xsi:type="xsd:string">result</key>
                   <value xsi:type="xsd:int">15</value>
                </item>
                <item>
                   <key xsi:type="xsd:string">memory</key>
                   <value xsi:type="xsd:int">245632</value>
                </item>
                <item>
                   <key xsi:type="xsd:string">signal</key>
                   <value xsi:type="xsd:int">0</value>
                </item>
                <item>
                   <key xsi:type="xsd:string">public</key>
                   <value xsi:type="xsd:boolean">true</value>
                </item>
                <item>
                   <key xsi:type="xsd:string">source</key>
                   <value xsi:type="xsd:string">class Main{public static void main (String[] args){    System.out.println("Hello");}}</value>
                </item>
                <item>
                   <key xsi:type="xsd:string">input</key>
                   <value xsi:type="xsd:string"/>
                </item>
                <item>
                   <key xsi:type="xsd:string">output</key>
                   <value xsi:type="xsd:string">Hello</value>
                </item>
                <item>
                   <key xsi:type="xsd:string">stderr</key>
                   <value xsi:type="xsd:string"/>
                </item>
                <item>
                   <key xsi:type="xsd:string">cmpinfo</key>
                   <value xsi:type="xsd:string"/>
                </item>
             </return>
          </ns1:getSubmissionDetailsResponse>
       </SOAP-ENV:Body>

Обратите внимание, что значения следующих пунктов верны

<item>


 <key xsi:type="xsd:string">input</key>
           <value xsi:type="xsd:string"/>
        </item>
        <item>
           <key xsi:type="xsd:string">output</key>
           <value xsi:type="xsd:string">Hello</value>
        </item>
        <item>
           <key xsi:type="xsd:string">stderr</key>
           <value xsi:type="xsd:string"/>
        </item>
        <item>
           <key xsi:type="xsd:string">cmpinfo</key>
           <value xsi:type="xsd:string"/>
        </item>

но если я посмотрю на ответ, полученный в Android, расскажу мне совершенно другую историю.

 itemType{key="output" value=}

это то, что я получаю от веб-службы в ответ. Но вместо этого я должен получить:

 itemType{key="output" value=<Output_text>}

Пожалуйста, помогите мне определить проблему.

1 Ответ

0 голосов
/ 14 августа 2012

Ваше значение равно нулю, возвращенному веб-сервисом

...