我在查找如何使用Android调用标准SOAP/WSDL Web服务方面遇到很多麻烦.我能找到的所有文件都是非常复杂的文档和对"kSoap2"的引用,然后是一些关于使用SAX手动解析它的一些内容.好的,这很好,但是它是2008年,所以我认为应该有一些很好的库来调用标准的Web服务.
Web服务基本上是在NetBeans中创建的.我想有IDE支持生成管道类.我只需要最简单/最优雅的方式来从基于Android的手机联系基于WSDL的Web服务.
Android不提供任何类型的SOAP库.您可以自己编写,也可以使用kSOAP 2之类的东西.正如您所说,其他人已经能够在他们自己的项目中编译和使用kSOAP2,但我没有必要.
到目前为止,谷歌对向Android添加SOAP库几乎没有兴趣.我对此的怀疑是,他们宁愿支持当前基于REST服务的Web服务趋势,并使用JSON作为数据封装格式.或者,使用XMPP进行消息传递.但这只是猜想.
基于XML的Web服务目前在Android上是一项稍微不重要的任务.不了解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/
要从移动设备(特别是在Android手机上)调用Web服务,我使用了一种非常简单的方法来执行此操作.我没有使用任何Web服务客户端API来尝试调用Web服务.我的方法是拨打电话如下.
使用Java标准API创建简单的HTTP连接
HttpURLConnection
.
形成SOAP请求.(您可以帮助SOAPUI发出SOAP请求.)
将doOutPut标志设置为true.
设置HTTP标头值,如内容长度,内容类型和用户代理.不要忘记设置Content-length值,因为它是必需的.
将整个SOAP请求写入输出流.
调用方法建立连接并接收响应(在我使用的情况下
getResonseCode
).
如果您收到的响应代码为
这意味着您已成功调用Web服务.
现在在同一HTTP连接上获取输入流并接收字符串对象.此字符串对象是SOAP响应.
如果响应代码不是200,则ErrorInput
在同一HTTP对象上获取流并接收错误(如果有).
使用SAXParser(在我的情况下)或DOMParaser或任何其他解析机制解析收到的响应.
我已经为Android手机实现了这个程序,并且它已成功运行.即使响应超过700 KB,我也能够解析响应.
SOAP是一种不适合在Android(或一般移动设备)上使用的技术,因为它需要处理/解析开销.REST服务是一种更轻量级的解决方案,这就是我的建议.Android附带一个SAX解析器,使用起来相当简单.如果您绝对需要在移动设备上处理/解析SOAP,那么我为您感到遗憾,我能提供的最佳建议就是不使用SOAP.
大约一年前,我正在阅读这个线程,试图找出如何在Android上进行SOAP调用 - 使用HttpClient构建我自己的建议导致我为Android构建自己的SOAP库:
IceSoap
基本上,它允许您构建信封以通过简单的Java API发送,然后自动将它们解析为您通过XPath定义的对象...例如:
变为:
@XMLObject("//Dictionary") public class Dictionary { @XMLField("Id") private String id; @XMLField("Name") private String name; }
我用它为自己的项目,但我想它可能会帮助一些人,所以我花了一些时间分离出来,并记录它.我真的很喜欢它,如果你的一些可怜的灵魂在谷歌搜索"SOAP Android"时偶然发现这个线程可能会给它带来一些好处.
不要忘记在项目中添加ksoap2.jar并在AndroidManifest文件中添加INTERNET权限
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实例将此数据发布到服务端点并获取响应流.使用XML Pull解析器解析响应流.
你可以看看WSClient ++
我为Android平台创建了一个新的SOAP客户端.它使用的是JAX-WS生成的接口,但到目前为止它只是一个概念验证.
如果您有兴趣,请尝试示例和/或在AndroidSOAP上观看来源.
如果可以,请选择JSON.Android附带完整的org.json包
调用ksoap2方法.它工作得非常好.
设置细节,比如
private static String mNAMESPACE=null; private static String mURL=null; public static Context context=null; SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(Request); envelope.addMapping(mNAMESPACE, "UserCredentials",new UserCredendtials().getClass()); AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(mURL);
然后得到结果呢
androidHttpTransport.call(SOAP_ACTION, envelope); result = (SoapPrimitive)envelope.getResponse();
我希望从Android调用Web服务有所帮助.
几个月前,我在j2ee应用程序中使用jax-ws Web服务,我们使用CXF wsdl2java从WSDL文件生成WS客户端存根,并使用这些客户端存根来使用Web服务.几个星期前,当我试图消耗在android平台上我不能以同样的方式在网络服务,因为Android的罐子并没有所有的"JAX-WS"支持在它的类.那个时候我没有找到任何这样的工具(如果我没有有效地谷歌),以满足我的要求 -
从WSDL获取客户端存根.
并使用一些参数(java业务请求对象)调用服务.
获取响应业务对象.
所以,我开发了自己的Android SOAP客户端生成工具.你必须遵循以下步骤:
从WSDL获取WS Client Stub,将其放入您的项目中.
说一些服务"ComplexOperationService",实例化服务,获取端点端口并调用服务方法,并从Web服务获取响应:
例如:
ComplexOperationService service = new ComplexOperationService( ); ComplexOperation port= service.getComplexOperationPort(); SomeComplexRequest request = --Get some complex request----; SomeComplexResp resp = port.operate( request );
您不需要关心服务类/ req /响应类或任何其他类和方法,因为您知道它们都是从WSDL生成的.
当然,你不需要知道soap action/envelop/namespace等.只需像我们一样调用方法,开发人员一直这样做.
我相信你可以用Axis创建一个小型的SOAP客户端.轴安装说明.
我认为来自Android应用程序的Call SOAP Web Service 将为您提供很多帮助.
如果您可以使用JSON,那么在开发带有PHP服务器和Android手机客户端的应用程序服务中有一个白皮书,一个视频和sample.code .
按照SOAP方法执行这些步骤
从WSDL文件中
为每个请求创建SOAP请求模板.
然后替换要在代码中传递的值.
使用DefaultHttpClient实例将此数据发布到服务端点.
最后得到响应流
使用XML Pull解析器解析响应流.
对我来说,最简单的方法是使用好的工具来生成所有必需的类.我个人使用这个网站:
http://easywsdl.com/
它支持相当复杂的Web服务并使用ksoap2.
如果您在使用android调用Web服务时遇到问题,则可以使用以下代码来调用Web服务并获得响应。确保您的Web服务以数据表格式返回响应。如果您使用SQL Server数据库中的数据,则此代码将为您提供帮助。如果您使用MYSQL,则需要更改一件事,只需用DocumentElement替换句子中的单词 NewDataSetobj2=(SoapObject) obj1.getProperty("NewDataSet");
void callWebService(){ private static final String NAMESPACE = "http://tempuri.org/"; // for wsdl it may be package name i.e http://package_name private static final String URL = "http://localhost/sample/services/MyService?wsdl"; // you can use IP address instead of localhost private static final String METHOD_NAME = "Function_Name"; private static final String SOAP_ACTION = "urn:" + METHOD_NAME; SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); request.addProperty("parm_name", prm_value);// Parameter for Method SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true;// **If your Webservice in .net otherwise remove it** envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); try { androidHttpTransport.call(SOAP_ACTION, envelope);// call the eb service // Method } catch (Exception e) { e.printStackTrace(); } // Next task is to get Response and format that response SoapObject obj, obj1, obj2, obj3; obj = (SoapObject) envelope.getResponse(); obj1 = (SoapObject) obj.getProperty("diffgram"); obj2 = (SoapObject) obj1.getProperty("NewDataSet"); for (int i = 0; i < obj2.getPropertyCount(); i++) { // the method getPropertyCount() and return the number of rows obj3 = (SoapObject) obj2.getProperty(i); obj3.getProperty(0).toString();// value of column 1 obj3.getProperty(1).toString();// value of column 2 // like that you will get value from each column } }
如果对此有任何疑问,可以给我写信。
我建议查看一个非常有用的工具,帮助了我很多.照顾这个项目的人也很有帮助.www.wsdl2code.com/