java – SOAP Envelope响应错误:读取XMLStreamReader时出错

前端之家收集整理的这篇文章主要介绍了java – SOAP Envelope响应错误:读取XMLStreamReader时出错前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在下面有以下 Android应用程序代码.我正在尝试通过HTTP连接到Web服务. Web服务使用apache轴.但是我在响应中遇到错误“Error reading XMLStreamReader”.我真的被卡住了,不知道我能做些什么.可能是因为在服务器端和客户端使用了不同版本的HTTP客户端和SOAP?任何有关这方面的帮助将不胜感激. Web服务非常简单:sayHello方法显示arg0 = some_string中给出的参数
  1. public class MainActivity extends Activity {
  2. @Override
  3. public boolean onCreateOptionsMenu(Menu menu) {
  4. getMenuInflater().inflate(R.menu.activity_main,menu);
  5. return true;
  6. }
  7.  
  8. @Override
  9. public void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
  13. StrictMode.setThreadPolicy(policy);
  14.  
  15. BufferedReader in = null;
  16. try {
  17. HttpClient client = new DefaultHttpClient();
  18. HttpPost request = new HttpPost(
  19. "http://10.0.0.63:8080/archibus/cxf/HelloWorld/sayHello");
  20. request.addHeader("Content-Type","text/xml");
  21. List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
  22. postParameters.add(new BasicNameValuePair("arg0","testing"));
  23. UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
  24. request.setEntity(formEntity);
  25.  
  26. HttpResponse response = client.execute(request);
  27.  
  28. in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
  29. StringBuffer sb = new StringBuffer("");
  30. String line = "";
  31. String NL = System.getProperty("line.separator");
  32. while ((line = in.readLine()) != null) {
  33. sb.append(line + NL);
  34. }
  35. in.close();
  36.  
  37. String page = sb.toString();
  38. // Log.i(tag,page);
  39. System.out.println(page);
  40. } catch (Exception e) {
  41. e.printStackTrace();
  42. } finally {
  43. if (in != null) {
  44. try {
  45. in.close();
  46. } catch (IOException e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. }
  51. }
  52. }

解决方法

您的WebService请求构造不正确.您实际上是在创建表单请求而不是实际的SOAP请求.

SOAP请求是一个XML文档,它有一个包络和一个正文参见例子SOAP Message Example on Wikipedia.

你在这里实际做的是标准HTTP调用,它模拟提交表单而不是SOAP调用.

你有两个解决方案:

1-您可以通过手动创建XML文档并提交它来模拟SOAP客户端的行为.
除了将正确的XML文档设置为请求主体外,不要忘记设置正确的标头:SOAPAction,Content-Type和Content-Length

  1. 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>");
  2. post.setRequestEntity(requestEntity );

另外,不要忘记使用webservice正在使用的适当命名空间来更改上面的命名空间(m).以及您尝试调用的操作的操作名称(GetStockPrice).另外不要忘记参数名称和类型.

2-您可以使用Apache Axis生成客户端并将该客户端与您的应用程序一起使用

有关更多信息,请参阅此主题和推荐的客户端How to call a SOAP web service on Android

猜你在找的Java相关文章