Я занимаюсь разработкой 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>}
Пожалуйста, помогите мне определить проблему.