Ошибка ответа на конверт SOAP: ошибка чтения XMLStreamReader

У меня есть следующий код приложения для Android ниже. Я пытаюсь подключиться к веб-службе через HTTP. Веб-служба использует ось apache. Однако я столкнулся с ошибкой «Ошибка чтения XMLStreamReader» в ответе. Я действительно застрял и не знаю, что я могу сделать. Может быть, существуют разные версии HTTP-клиента и SOAP, используемые на сервере и на стороне клиента? Любая помощь по этому вопросу будет принята с благодарностью. Веб-сервис очень прост: метод sayHello отображает аргумент, заданный в arg0 = some_string

public class MainActivity extends Activity { @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); BufferedReader in = null; try { HttpClient client = new DefaultHttpClient(); HttpPost request = new HttpPost( "http://10.0.0.63:8080/archibus/cxf/HelloWorld/sayHello"); request.addHeader("Content-Type", "text/xml"); List<NameValuePair> postParameters = new ArrayList<NameValuePair>(); postParameters.add(new BasicNameValuePair("arg0", "testing")); UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters); request.setEntity(formEntity); HttpResponse response = client.execute(request); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.separator"); while ((line = in.readLine()) != null) { sb.append(line + NL); } in.close(); String page = sb.toString(); // Log.i(tag, page); System.out.println(page); } catch (Exception e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 

Ваш запрос WebService не создан правильно. Фактически вы создаете запрос формы, а не фактический запрос SOAP.

SOAP-запрос представляет собой XML-документ, который имеет конверт и тело, например, пример SOAP-сообщения в Википедии .

То, что вы на самом деле делаете здесь, это стандартный HTTP-вызов, который эмулирует форму отправки, а не вызов SOAP.

Здесь у вас есть два решения:

1- Вы можете либо эмулировать поведение клиента SOAP вручную, создав XML-документ и отправив его. Помимо установки правильного документа XML в качестве тела запроса, не забудьте установить соответствующие заголовки: SOAPAction, Content-Type и Content-Length

  RequestEntity requestEntity = new StringRequestEntity("<?xml version=\"1.0\"?><soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\"><soap:Header></soap:Header><soap:Body><m:GetStockPrice xmlns:m=\"http://www.example.org/stock\"><m:StockName>IBM</m:StockName></m:GetStockPrice></soap:Body></soap:Envelope>"); post.setRequestEntity(requestEntity ); 

Также не забудьте изменить пространство имен (m) выше с соответствующим пространством имен, которое использует ваш веб-сервис. И имя операции ( GetStockPrice ) с операцией, которую вы пытаетесь вызвать. Также не забудьте имена и типы параметров.

2- Вы можете использовать Apache Axis для генерации клиента и использования этого клиента с вашим приложением

См. Эту тему для получения дополнительной информации и рекомендуемого клиента. Как вызвать веб-службу SOAP на Android

Шурик К прав. Вы выполнили запрос HTTP POST. Это не мыло webservice. Если вы хотите узнать, как вызвать веб-сервис, следуйте ссылке. http://www.youtube.com/watch?v=v9EowBVgwSo . Убедитесь, что вы загрузили последний файл ksoap jar.

Пример кода с использованием K-SOAP для Android.

 private void sendSOAPmsg(DamageAssessmentFormPojo pojo) throws IOException, XmlPullParserException, SoapFault { SoapObject request = new SoapObject(WEBSERVICE.NAMESPACE, WEBSERVICE.METHOD_NAME_SUBMIT_REPORT); request.addProperty("xmlBytes", Util.getSoapBase64String(pojo)); request.addProperty("fileName", IO.DefaultReportName); request.addProperty("deviceId", AppConstants.IMEI != null ? AppConstants.IMEI : Util.getIMEI(this)); SoapPrimitive response = sendSOAPEnvelope(request, WEBSERVICE.SOAP_ACTION_SUBMIT_REPORT); if (response.toString().equalsIgnoreCase("true")) { Logger.logInfo("REPORT SENT SUCCESSFULLY", "WEB-SERVICE"); pojo.setReportSent(true); IO.writeObject(pojo.getReportsFolderPath() + IO.DefaultReportName, pojo); } else { Logger.logInfo("REPORT SENT FAILED", "WEB-SERVICE - RESONSE " + response.toString()); } } private SoapPrimitive sendSOAPEnvelope(SoapObject request, String soapAction) throws IOException, XmlPullParserException, SoapFault { SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(WEBSERVICE.URL); androidHttpTransport.call(soapAction, envelope); SoapPrimitive response = (SoapPrimitive) envelope.getResponse(); return response; } private boolean sendSOAPimage(String strImg, File pFile) throws IOException, XmlPullParserException { boolean result = false; if (strImg != null) { SoapObject request = new SoapObject(WEBSERVICE.NAMESPACE, WEBSERVICE.METHOD_NAME_SUBMIT_IMAGE); request.addProperty("imageBytes", strImg); request.addProperty("fileName", pFile.getName()); request.addProperty("deviceId", AppConstants.IMEI != null ? AppConstants.IMEI : Util.getIMEI(this)); SoapPrimitive response = sendSOAPEnvelope(request, WEBSERVICE.SOAP_ACTION_SUBMIT_MAGE); if (response.toString().equalsIgnoreCase("true")) { result = true; Logger.logInfo("IMAGE SENT SUCCESSFULLY", "WEB-SERVICE"); } else { Logger.logInfo("IMAGE SENT FAILED", "WEB-SERVICE - RESONSE " + response.toString()); } } return result; } 

// ——– Метод вспомогательного помощника

 public static String getSoapBase64String(DamageAssessmentFormPojo pojo) { XmlSerializer xmlSerializer = Xml.newSerializer(); StringWriter writer = new StringWriter(); try { xmlSerializer.setOutput(writer); xmlSerializer.startDocument("UTF-8", true); xmlSerializer.startTag("", XMLTags.TAG_ROD); xmlSerializer.startTag("", XMLTags.TAG_ORDER); xmlSerializer.startTag("", XMLTags.TAG_SEVERITY); xmlSerializer.text(pojo.getCheckedSeverity_Complexity()); xmlSerializer.endTag("", XMLTags.TAG_SEVERITY); xmlSerializer.startTag("", XMLTags.TAG_DAMAGE_TYPE); StringBuilder builder = new StringBuilder(); for (String str : pojo.getCheckedDamageTypes()) { builder.append(str + " , "); } xmlSerializer.text(builder.toString()); xmlSerializer.endTag("", XMLTags.TAG_DAMAGE_TYPE); xmlSerializer.startTag("", XMLTags.TAG_ENV_IMPACT); xmlSerializer.text(pojo.getCheckedEnvImpact()); xmlSerializer.endTag("", XMLTags.TAG_ENV_IMPACT); xmlSerializer.startTag("", XMLTags.TAG_ENV_COMMENT); xmlSerializer.text(pojo.getEnvImpactComments()); xmlSerializer.endTag("", XMLTags.TAG_ENV_COMMENT); xmlSerializer.startTag("", XMLTags.TAG_TRAVEL_CONDITION); xmlSerializer.text(pojo.getCheckedTravelCond()); xmlSerializer.endTag("", XMLTags.TAG_TRAVEL_CONDITION); xmlSerializer.startTag("", XMLTags.TAG_TRAVEL_COMMENT); xmlSerializer.text(pojo.getTravCondComments()); xmlSerializer.endTag("", XMLTags.TAG_TRAVEL_COMMENT); xmlSerializer.startTag("", XMLTags.TAG_ORDER_DATE); xmlSerializer.text(pojo.getDateTime()); xmlSerializer.endTag("", XMLTags.TAG_ORDER_DATE); xmlSerializer.endTag("", "Order"); xmlSerializer.endTag("", "ROD"); xmlSerializer.endDocument(); } catch (IllegalArgumentException e) { Logger.logException(e); } catch (IllegalStateException e) { Logger.logException(e); } catch (IOException e) { Logger.logException(e); } return Base64.encode(writer.toString().getBytes()); }