我很难找到有关如何使用Android调用标准SOAP / WSDL Web服务的良好信息。 我所能找到的只是非常复杂的文档和对“ kSoap2”的引用,然后是一些有关使用SAX手动解析它们的内容。 好的,很好,但是是2008年,所以我认为应该有一些不错的库来调用标准Web服务。
Web服务基本上只是在NetBeans中创建的一种。 我希望IDE支持生成管道类。 我只需要最简单/最优雅的方法就可以从基于Android的电话联系基于WSDL的Web服务。
#1楼
几个月前,我在j2ee应用程序中使用jax-ws Web服务,我们在使用CXF wsdl2java从WSDL文件生成WS客户端存根,并使用这些客户端存根消耗了Web服务。 几周前,当我试图以相同的方式在android平台中使用Web服务时,我做不到,因为android jar中没有所有的“ jax-ws”支持类。 那个时候,我没有找到任何可以满足我的要求的工具(如果我没有失败地进行有效的Google搜索)-
- 从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 );
- 您无需关心服务类/请求/响应类或任何其他类以及方法,因为您知道它们都是从WSDL生成的。
- 当然,您无需了解soap action / envelop / namespace等。就像我们开发人员一直在调用的方法一样。
#2楼
如果您在使用android调用Web服务时遇到问题,则可以使用以下代码来调用Web服务并获得响应。 确保您的Web服务以数据表格式返回响应。如果您使用SQL Server数据库中的数据,则此代码将为您提供帮助。 如果您使用MYSQL ,则需要更改一件事,只需将句子obj2=(SoapObject) obj1.getProperty("NewDataSet");
单词NewDataSet替换即可 obj2=(SoapObject) obj1.getProperty("NewDataSet");
通过DocumentElement
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
}
}
如果对此有任何疑问,可以给我写信。
#3楼
通过SOAP方法执行以下步骤
在WSDL文件中,
为每个请求创建SOAP请求模板。
然后替换要在代码中传递的值。
使用DefaultHttpClient实例将此数据发布到服务端点。
获取响应流,最后
使用XML Pull解析器解析响应流。
#4楼
要从android调用SOAP Web服务,请尝试使用此客户端
不要忘记在Java构建路径中添加ksoap2-android.jar
public class WsClient {
private static final String SOAP_ACTION = "somme";
private static final String OPERATION_NAME = "somme";
private static final String WSDL_TARGET_NAMESPACE = "http://example.ws";
private static final String SOAP_ADDRESS = "http://192.168.1.2:8080/axis2/services/Calculatrice?wsdl";
public String caclculerSomme() {
String res = null;
SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
OPERATION_NAME);
request.addProperty("a", "5");
request.addProperty("b", "2");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
try {
httpTransport.call(SOAP_ACTION, envelope);
String result = envelope.getResponse().toString();
res = result;
System.out.println("############# resull is :" + result);
} catch (Exception exception) {
System.out.println("########### ERRER" + exception.getMessage());
}
return res;
}
}
#5楼
不要忘记在项目中添加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);
}
}
}
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3156116