本文已经假设你已经安装好了phonegap3.4.x相关开发环境,并能成功添加phonegap的相关插件,如下图
1. 插件js文件准备,如下图
建立一个空文件 CallService.js。
2. 插件java文件准备
建立一个空文件 WebService.java
3. 填写相关插件配置
在 cordova_plugins.js 文件中加入以下内容,该文件在安装phonegap 3.4.x时会自动生成,在安装网上插件后,会有相关插件内容填入,如下图
注意红色字的说明部分。
res/xml/config.xml 中加入
<feature name="CallService">
<param name="android-package" value="com.bl.cordova.service.WebService" />
</feature>
4. 分别填充以上的 CallService.js 和 WebService.java 两个文件,代码内容分别如下
WebService.java
package com.bl.cordova.service;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class WebService extends CordovaPlugin{
public static final String ACTION_NAME = "callService";
public static String NAMESPACE = "http://tempuri.org/";
/**
* @param action callService
* @param args [{'url':'值','namespace':'命名空间'},{'params':'值'}]
* */
@Override
public boolean execute(String action, JSONArray args,
CallbackContext callbackContext) throws JSONException {
// TODO Auto-generated method stub
boolean pass = true;
System.out.println("调用了"+action);
if(action.equals(ACTION_NAME)){
JSONObject arg_object = args.getJSONObject(0);
String url = arg_object.getString("url");
String namespace = arg_object.getString("namespace");
if(namespace!=null&&!namespace.equals("")){
NAMESPACE = namespace;
}
String method = arg_object.getString("method");
String donet = arg_object.getString("donet");
//取得参数,放在第二个参数
JSONObject params_object = args.getJSONObject(1);
ServiceHelp serviceHelp = ServiceHelp.getInstance();
String result = serviceHelp.callService(url, NAMESPACE, method, params_object,donet);
if(result!=null&&!result.equals("")){
callbackContext.success(result);
}else{
pass = false;
callbackContext.error("调用出错!");
}
}
return pass;
}
}
CallService.js
cordova.define("com.bl.cordova.service.WebService", function(require, exports, module) {
var exec = require('cordova/exec'),
cordova = require('cordova'),
channel = require('cordova/channel'),
utils = require('cordova/utils');
var me = new WebService();
function WebService() {
this.type = 'webservice';
}
WebService.prototype.callService = function(params,successCallback, errorCallback) {
/***
* {'url':'','method':'','params':{}}
* */
exec(successCallback, errorCallback, "CallService", "callService", params);
};
module.exports = me;
});
5.页面调用方法
var params = [{'url':'http://10.194.158.54:8080/axis_service/services/jsonservice?wsdl','method':'jsonParams','namespace':'http://services.bl.com','donet':''},{'name':{"nl":"20","xb":"男","address":"南宁"}}];
navigator.service.callService(params,function(result){
alert(result);
},function(e){ alert('调用出错'+e.code);});
调用结果如图
6.有网友反映,少写了一个类ServiceHelp.java,现在补上
package com.bl.cordova.service;
import java.util.Iterator;
import org.json.JSONObject;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
public class ServiceHelp {
private String method; //调用的方法
private String namespace; //命名空间
private String url; //服务的url
private static ServiceHelp serviceHelp;
public static ServiceHelp getInstance(){
if(serviceHelp==null){
serviceHelp = new ServiceHelp();
}
return serviceHelp;
}
/**
* 执行 webservice
*
* */
public String callService(String url,String namespace,String method,JSONObject params,String donet){
boolean net = false;
if(donet!=null&&donet.equals("true")){
net = true;
}
String resultJson = "";
try {
SoapObject rpc = new SoapObject(namespace, method);
if(params!=null){
Iterator it = params.keys();
while(it.hasNext()){
String key = String.valueOf(it.next());
String value = String.valueOf(params.getString(key)).replaceAll("null", "");
rpc.addProperty(key, value);
}
}
HttpTransportSE ht = new HttpTransportSE(url);
// ht.debug = true;
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = rpc;
envelope.dotNet = net;
envelope.setOutputSoapObject(rpc);
ht.call(null, envelope);
Object result = (Object)envelope.getResponse();
if(result!=null)
resultJson = result.toString();
} catch (Exception e) {
e.printStackTrace();
} finally{
}
return resultJson;
}
}