【问题标题】:Send data from Android to Web Service (via SOAP)将数据从 Android 发送到 Web 服务(通过 SOAP)
【发布时间】:2012-11-22 14:03:58
【问题描述】:

我有一个 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 服务它给了我:

java.lang.RuntimeException: Cannot serialize...

有人可以向我解释我应该添加什么以使其正常工作吗?在尝试使用 Marshal 类的线索之后,我真的不知道......

【问题讨论】:

    标签: android soap web


    【解决方案1】:

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

    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 输出。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多