我有一个Web服务,它需要一个SOAP请求来对String执行一个简单的方法。现在我在Android上编写应用程序以使用此Web服务,我希望它能序列化一些数据并通过SOAP将其发送到Web服务。
以下是一些代码:
public class SendedLocation implements Serializable {
public String MESSAGE;
public SendedLocation() {
}
public SendedLocation(int mId, float mLongitude, float mLatitude) {
MESSAGE = String.valueOf(mId) + ";" + String.valueOf(mLongitude) + ";" + String.valueOf(mLatitude);
}
public Object getProperty(int arg0) {
switch (arg0) {
case 0:
return MESSAGE;
}
return null;
}
public int getPropertyCount() {
return 1;
}
public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) {
switch (index) {
case 0:
info.type = PropertyInfo.STRING_CLASS;
info.name = "MESSAGE";
break;
default:
break;
}
}
public void setProperty(int index, Object value) {
switch (index) {
case 0:
MESSAGE = value.toString();
break;
default:
break;
}
}
}
public void callWebService(int ID, float Longitude, float Latitude) {
try {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(
URL);
SendedLocation mSended = new SendedLocation(ID, Longitude, Latitude);
PropertyInfo p1 = new PropertyInfo();
p1.setName("mSended");
p1.setValue(mSended);
p1.setType(mSended.getClass());
request.addProperty(p1);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
envelope.addMapping(NAMESPACE, "mSended", mSended.getClass());
MarshalString marshalString = new MarshalString();
marshalString.register(envelope);
// Make the soap call.
androidHttpTransport.call(SOAP_ACTION, envelope);
Object results = (Object) envelope.getResponse();
// to get the data String
// resultData=result.getProperty(0).toString();
String temp = results.toString();
System.out.println(temp);
} catch (Exception aE) {
System.out.println(aE.toString());
}
}
public class MarshalString implements Marshal
{
public Object readInstance(XmlPullParser parser, String namespace, String name,
PropertyInfo expected) throws IOException, XmlPullParserException {
return String.valueOf(parser.nextText());
}
public void register(SoapSerializationEnvelope cm) {
cm.addMapping(cm.xsd, "string", String.class, this);
}
public void writeInstance(XmlSerializer writer, Object obj) throws IOException {
writer.text(obj.toString());
}
}
我在onCreate()中调用这个callWebService()方法,如下所示:
callWebService(ID , (float)location.getLongitude() , (float)location.getLatitude());
然后,当我运行我的应用程序时,它会从gps获得修复,但是当发送数据时,Web Service会给我:
java.lang.RuntimeException: Cannot serialize...
有人可以向我解释一下我应该添加什么才能让它起作用?在尝试使用Marshal类之后,我真的不知道......
答案 0 :(得分:2)
尝试使用SOAP Envelope发送数据, SOAP Envelope的语法:
final String envelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
"<SOAP-ENV:Envelope SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" " +
"xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" " +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" " +
"xmlns:tns=\"urn:registerwsdl\">"+
"<SOAP-ENV:Body>"+
"<tns:register " +
"xmlns:tns=\"urn:registerwsdl\">"+
"<your_feild_name xsi:type=\"xsd:string\">"+"your_value"+"</your_feild_name>"+
"</tns:register>"+
// "</SOAP-ENV:Body></SOAP-ENV:Envelope>",Name,Email,Password,Status,Type,Date];
"</SOAP-ENV:Body></SOAP-ENV:Envelope>";
然后在此函数中使用此包络, 您可以使用Soap Envelope传递多个值
String CallWebService(String url,
String soapAction,
String envelope) {
final DefaultHttpClient httpClient=new DefaultHttpClient();
// request parameters
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, 20000);
HttpConnectionParams.setSoTimeout(params, 25000);
// set parameter
HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), true);
// POST the envelope
HttpPost httppost = new HttpPost(url);
// add headers
httppost.setHeader("soapaction", soapAction);
httppost.setHeader("Content-Type", "text/xml; charset=utf-8");
String responseString="";
try {
// the entity holds the request
HttpEntity entity = new StringEntity(envelope);
httppost.setEntity(entity);
// Response handler
ResponseHandler<String> rh=new ResponseHandler<String>() {
// invoked when client receives response
public String handleResponse(HttpResponse response)
throws ClientProtocolException, IOException {
// get response entity
HttpEntity entity = response.getEntity();
// read the response as byte array
StringBuffer out = new StringBuffer();
byte[] b = EntityUtils.toByteArray(entity);
// write the response byte array to a string buffer
out.append(new String(b, 0, b.length));
return out.toString();
}
};
responseString=httpClient.execute(httppost, rh);
}
catch (Exception e) {
Log.v("exception", e.toString());
}
xml = responseString.toString();
// close the connection
System.out.println("xml file ------"+xml);
httpClient.getConnectionManager().shutdown();
return responseString;
}
最后使用任何XML解析器解析XML输出。