Android没有提供任何类型的SOAP库。你可以编写自己的库,或者使用像kSOAP 2这样的库。正如你所指出的那样,其他人已经能够在他们自己的项目中编译和使用kSOAP2,但我并没有这样做过。
迄今为止,Google似乎对将SOAP库添加到Android中没有太大兴趣。我怀疑这是因为他们更愿意支持Web服务中当前潮流,即支持基于REST的服务,并使用JSON作为数据封装格式,或者使用XMPP进行通信。但这只是推测。
目前,在Android上实现基于XML的Web服务稍微有些困难。我不了解NetBeans,无法评论那里可用的工具,但我同意应该提供更好的库。可能XmlPullParser可以避免使用SAX,但我对此了解甚少。
org.apache.http.impl.client.DefaultHttpClient
默认包含在Android SDK中。这将使您连接到WSDL。
HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet("http://www.example.com/" + URL);
HttpResponse response = httpClient.execute(httpGet, localContext);
确实,由于SOAP的开销较大,它不是与移动设备进行数据交换的最佳选择。但是,在某些情况下,您可能会发现自己无法控制服务器输出格式。
因此,如果必须坚持使用SOAP,则可以在这里找到专为Android修补的kSOAP2库:
http://code.google.com/p/ksoap2-android/
HttpURLConnection
建立一个简单的 HTTP 连接。getResponseCode
)。ErrorInput
流并接收任何错误。SOAP技术在Android(或移动设备)上使用是不太适合的,因为需要处理/解析开销。REST服务是一种更轻量级的解决方案,这是我建议的做法。 Android自带SAX解析器,使用起来相对容易。如果你绝对需要在移动设备上处理/解析SOAP,那么我为你感到难过,我能提供的最好建议就是不要使用SOAP。
大约一年前,我在阅读这篇帖子时想要弄清楚如何在Android上进行SOAP调用。建议使用HttpClient构建自己的库后,我创建了自己的Android SOAP库:
基本上,它允许您通过一个简单的Java API来构建信封并发送,接着自动解析为您通过XPath定义的对象... 例如:
<Dictionary>
<Id></Id>
<Name></Name>
</Dictionary>
变成:
@XMLObject("//Dictionary")
public class Dictionary {
@XMLField("Id")
private String id;
@XMLField("Name")
private String name;
}
我最初是为自己的项目使用它,但我认为它可能有助于其他人,因此我花了一些时间将其分离并进行了文档化。如果你们这些在谷歌搜索“SOAP Android”时偶然发现这个帖子的可怜人能够尝试并从中受益,我会非常高兴的。
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class WebserviceActivity extends Activity {
private static final String NAMESPACE = "https://api.authorize.net/soap/v1/";
private static final String URL ="https://apitest.authorize.net/soap/v1/Service.asmx?wsdl";
private static final String SOAP_ACTION = "https://api.authorize.net/soap/v1/AuthenticateTest";
private static final String METHOD_NAME = "AuthenticateTest";
private TextView lblResult;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lblResult = (TextView) findViewById(R.id.tv);
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("name","44vmMAYrhjfhj66fhJN");
request.addProperty("transactionKey","9MDQ7fghjghjh53H48k7e7n");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
//SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
// SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;
lblResult.setText(resultsRequestSOAP.toString());
System.out.println("Response::"+resultsRequestSOAP.toString());
} catch (Exception e) {
System.out.println("Error"+e);
}
}
}
我曾经和KSOAP有过交集;我选择了一个比较简单的方法。
给定一个WSDL文件,为每个请求创建SOAP请求模板(例如:使用SOAP UI),然后在代码中替换要传递的值。使用DefaultHttpClient实例将此数据POST到服务端点并获取响应流。使用XML Pull解析器解析响应流。
我已经为Android平台创建了一个新的SOAP客户端。它使用了一个JAX-WS生成的接口,但目前只是一个概念验证。
如果您有兴趣,请尝试这个示例并/或查看AndroidSOAP的源代码。