子标签的SOAP请求

时间:2011-03-02 04:52:01

标签: android soap request

我必须发出SOAP请求,其格式如下:

<parentname>test</parentname>    
<address>16, texas</address>    
<childrennames>
     <child>c1</child>
     <child>c2</child>
     <child>c3</child>     
</childrennames>    
<email>parent@gmail.com</email> 

如何发送childnames标记请求?

2 个答案:

答案 0 :(得分:2)

最简单的方法之一是将整个SOAP请求放在StringBuilder中,并使用一些唯一键代替实际值。使用StringBuilder#replaceAll(..)在运行时使用实际值替换密钥,然后通过将实体的内容类型设置为XML,将此字符串作为StringEntity发布到服务器。 例如:您可以创建模板:

"<parentname>@parentName@</parentname>"

然后在运行时将@parentName@替换为实际值。

您可以使用SOAPUI等工具生成整个SOAP请求XML。 希望你能得到一张照片。

[编辑:添加插图示例] 假设您必须创建此SOAP请求:

<soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:bok="http://www.example.org/bok/">
   <soapenv:Header/>
   <soapenv:Body>
      <bok:Name>
         <name>Foucault's Pendulum</name>
      </bok:Name>
   </soapenv:Body>
</soapenv:Envelope>

我建议创建一个String模板,然后在运行时替换模板中的值:

// your SOAP request template
StringBuilder SOAP_REQUEST = 
new StringBuilder("<soapenv:Envelope 
xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' 
xmlns:bok='http://www.example.org/bok/'>
   <soapenv:Header/>
   <soapenv:Body>
      <bok:Name>
         <name>@name@</name>
      </bok:Name>
   </soapenv:Body>
</soapenv:Envelope>");

// replacing keys with actual arguments at runtime
SOAP_REQUEST.toString().replace("@name",actualName);

我希望这是有道理的。

答案 1 :(得分:0)

简单肥皂请求:

 SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

    request.addProperty("Celsius", "32");

    SoapSerializationEnvelope soapEnvelop = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    soapEnvelop.dotNet = true;
    soapEnvelop.setOutputSoapObject(request);
    AndroidHttpTransport aht = new AndroidHttpTransport(URL);   

    try {

        aht.call(SOAP_ACTION , soapEnvelop);

        SoapObject resultString = (SoapObject) soapEnvelop.getResponse();
        } catch (Exception e) {
        e.printStackTrace();
    }   

导入另一个自定义的AndroidHttpTransport文件:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.transport.ServiceConnection;
import org.ksoap2.transport.Transport;
import org.xmlpull.v1.XmlPullParserException;
/**
 * Apache HttpComponent based HttpTransport layer.
 */
public class AndroidHttpTransport extends Transport {

    /**
     * Creates instance of HttpTransport with set url
     * 
     * @param url
     *            the destination to POST SOAP data
     */
    public AndroidHttpTransport(String url) {
        super(url);
    }

    /**
     * set the desired soapAction header field
     * 
     * @param soapAction
     *            the desired soapAction
     * @param envelope
     *            the envelope containing the information for the soap call.
     */
    public void call(String soapAction, SoapEnvelope envelope) throws IOException, XmlPullParserException {
        if (soapAction == null)
            soapAction = "\"\"";
        byte[] requestData = createRequestData(envelope);
        requestDump = debug ? new String(requestData) : null;
        responseDump = null;
        ServiceConnection connection = getServiceConnection();
        connection.connect();

        try {
            connection.setRequestProperty("User-Agent", "kSOAP/2.0");
            connection.setRequestProperty("SOAPAction", soapAction);
            connection.setRequestProperty("Content-Type", "text/xml");
            connection.setRequestProperty("Connection", "close");
            connection.setRequestProperty("Content-Length", "" + requestData.length);
            connection.setRequestMethod("POST");

            OutputStream os = connection.openOutputStream();
            os.write(requestData, 0, requestData.length);
            os.flush();
            os.close();
            requestData = null;

            InputStream is;
            try {
                is = connection.openInputStream();
            } catch (IOException e) {
                is = connection.getErrorStream();
                if (is == null) {
                    connection.disconnect();
                    throw (e);
                }
            }


            //if (debug) {
            if (true) { 
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                byte[] buf = new byte[512];
                while (true) {
                    int rd = is.read(buf, 0, 512);
                    if (rd == -1)
                        break;
                    bos.write(buf, 0, rd);
                }
                bos.flush();
                buf = bos.toByteArray();
                responseDump = new String(buf);
                CommonFunctions.currentXMLString = unescape(responseDump);
                //CommonFunctions.currentXMLString = responseDump;
                is.close();
                is = new ByteArrayInputStream(buf);
            }   

            parseResponse(envelope, is);
        } finally {
            connection.disconnect();
        }
    }

    protected ServiceConnection getServiceConnection() throws IOException {
        return new AndroidServiceConnection(url);
    }

    public static String unescape (String s)
    {
        while (true)
        {
            int n=s.indexOf("&#");
            if (n<0) break;
            int m=s.indexOf(";",n+2);
            if (m<0) break;
            try
            {
                s=s.substring(0,n)+(char)(Integer.parseInt(s.substring(n+2,m)))+
                    s.substring(m+1);
            }
            catch (Exception e)
            {
                return s;
            }
        }
        s=s.replace("&quot;","\"");
        s=s.replace("&lt;","<");
        s=s.replace("&gt;",">");
        s=s.replace("&amp;","&");
        return s;
    }
}

请添加一个自定义的AndroidServiceConnection.java,如下所示

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpConnection;
import org.apache.commons.httpclient.HttpConnectionManager;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.HttpURL;
import org.apache.commons.httpclient.SimpleHttpConnectionManager;
import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.ksoap2.transport.ServiceConnection;


/**
 * Connection using apache HttpComponent
 */

public class AndroidServiceConnection implements ServiceConnection {
    private static HttpConnectionManager connectionManager = new SimpleHttpConnectionManager();
    private HttpConnection connection;
    private PostMethod postMethod;
    private java.io.ByteArrayOutputStream bufferStream = null;

    /**
     * Constructor taking the url to the endpoint for this soap communication
     * @param url the url to open the connection to.
     */
    public AndroidServiceConnection(String url) throws IOException {
        HttpURL httpURL = new HttpURL(url);
        HostConfiguration host = new HostConfiguration();
        host.setHost(httpURL.getHost(), httpURL.getPort());
        connection = connectionManager.getConnection(host);
        postMethod = new PostMethod(url);
    }

    public void connect() throws IOException {
        if (!connection.isOpen()) {
            connection.open();
        }
    }

    public void disconnect() {
        connection.releaseConnection();
    }

    public void setRequestProperty(String name, String value) {
        postMethod.setRequestHeader(name, value);
    }

    public void setRequestMethod(String requestMethod) throws IOException {
        if (!requestMethod.toLowerCase().equals("post")) {
            throw(new IOException("Only POST method is supported"));
        }
    }

    public OutputStream openOutputStream() throws IOException {
        bufferStream = new java.io.ByteArrayOutputStream();
        return bufferStream;
    }

    public InputStream openInputStream() throws IOException {
        RequestEntity re = new ByteArrayRequestEntity(bufferStream.toByteArray());
        postMethod.setRequestEntity(re);
        postMethod.execute(new HttpState(), connection);
        return postMethod.getResponseBodyAsStream();
    }

    public InputStream getErrorStream() {
        return null;
    }
}