从Android电子数据发送至Web服务(通过SOAP)数据、电子、发送至、Android

2023-09-05 09:57:23 作者:贱男村村长

我有一个Web服务,需要一个SOAP请求做一个简单的方法上的字符串。现在,我写了Android应用程序来使用这个Web服务,我想它序列化的一些数据,并通过SOAP发送到Web服务。

I've got a Web Service, that need a SOAP request to do a simple method on String. Now i wrote app on Android to use this Web Service and i want it to serialize some data and send it to Web Service via SOAP.

下面是一些code:

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()方法:

and I'm invoking this callWebService() method in onCreate() like this:

callWebService(ID , (float)location.getLongitude() , (float)location.getLatitude());

然后,当我运行我的应用程序从GPS得到修复,但是当涉及到​​发送数据做Web服务它给了我:

then, when i run my app it get fixes from gps but when comes to sending data do Web Service it gives me:

java.lang.RuntimeException: Cannot serialize...

谁能向我解释什么,我应该补充,使其工作?我真的不知道,试图线索使用Marshal类之后...

Can somebody explain to me what should I add to make it work? I really have no idea, after trying clue to use Marshal class...

推荐答案

尝试使用SOAP信封用于发送数据, 语法SOAP信封:

Try using SOAP Envelope for sending data, Syntax for 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信封

and then use this envelop in this function, you can pass multiple value with 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输出​​。

and in the end parse the XML output by using any XML parser.

 
精彩推荐
图片推荐