Java SOAP信封响应错误:读取XMLStreamReader时出错
我有下面的Android应用程序代码。我正在尝试通过HTTP连接到web服务。web服务使用ApacheAxis。但是,我在响应中遇到了错误“错误读取XMLStreamReader”。我真的被卡住了,不知道我能做什么。服务器端和客户端是否使用了不同版本的HTTP客户端和SOAP??在此方面的任何帮助都将不胜感激。web服务非常简单:sayHello方法显示arg0=some\u字符串中给出的参数Java SOAP信封响应错误:读取XMLStreamReader时出错,java,android,web-services,soap,axis,Java,Android,Web Services,Soap,Axis,我有下面的Android应用程序代码。我正在尝试通过HTTP连接到web服务。web服务使用ApacheAxis。但是,我在响应中遇到了错误“错误读取XMLStreamReader”。我真的被卡住了,不知道我能做什么。服务器端和客户端是否使用了不同版本的HTTP客户端和SOAP??在此方面的任何帮助都将不胜感激。web服务非常简单:sayHello方法显示arg0=some\u字符串中给出的参数 public class MainActivity extends Activity { @Over
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();
}
}
}
}
}
公共类MainActivity扩展活动{
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.activity\u主菜单);
返回true;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(策略);
BufferedReader in=null;
试一试{
HttpClient=new DefaultHttpClient();
HttpPost请求=新建HttpPost(
"http://10.0.0.63:8080/archibus/cxf/HelloWorld/sayHello");
addHeader(“内容类型”、“文本/xml”);
List postParameters=new ArrayList();
添加(新的BasicNameValuePair(“arg0”,“测试”);
UrlEncodedFormEntity formEntity=新的UrlEncodedFormEntity(后参数);
请求。setEntity(formEntity);
HttpResponse response=client.execute(请求);
in=新的BufferedReader(新的InputStreamReader(response.getEntity().getContent());
StringBuffer sb=新的StringBuffer(“”);
字符串行=”;
字符串NL=System.getProperty(“line.separator”);
而((line=in.readLine())!=null){
sb.追加(行+NL);
}
in.close();
字符串页=sb.toString();
//Log.i(标签,第页);
系统输出打印项次(第页);
}捕获(例外e){
e、 printStackTrace();
}最后{
if(in!=null){
试一试{
in.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
}
}
您的Web服务请求构造不正确。您实际上是在创建表单请求,而不是实际的SOAP请求
SOAP请求是一个XML文档,它有一个信封和一个正文(参见这里的示例)
这里实际执行的是模拟提交表单的标准HTTP调用,而不是SOAP调用
这里有两种解决方案:
1-您可以通过手动创建XML文档并提交它来模拟SOAP客户端的行为。
除了将适当的XML文档设置为请求主体之外,不要忘记设置适当的标题:SOAPAction、内容类型和内容长度
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 );
RequestEntity-RequestEntity=new-StringRequestEntity(“IBM”);
post.setRequestEntity(requestEntity);
另外,不要忘记使用您的Web服务正在使用的适当名称空间更改上面的名称空间(m)。操作名(GetStockPrice)以及您尝试调用的操作。另外,不要忘记参数名称和类型
2-您可以使用Apache Axis生成一个客户端,并将该客户端与应用程序一起使用
有关更多信息,请参阅此线程,推荐的客户端是Shoukry K。您已经完成了HTTP POST请求。这不是soap Web服务。如果您想知道如何调用Web服务,请访问以下链接。确保下载了最新的ksoapjar文件 使用K-SOAP for 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;
}
//--------Util辅助方法
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());
}