對於簡單的SOAP請求:
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(""","\"");
s=s.replace("<","<");
s=s.replace(">",">");
s=s.replace("&","&");
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;
}
}
你能解釋一下你想做什麼? – 2011-03-02 04:57:07
請把你傳遞值的xml根據我告訴你如何將數據放入子標籤中。因爲在SOAP xml中我們使用NAMESPACE,SOAPACTION。 – 2011-03-02 05:05:31