转载请声明地址:http://blog.csdn.net/skyunicorn/article/details/51731605
jsonrpc4j调用的库有三个(jsonrpc4j.jar 、jsonrpc4j-sources.jar 、jsonrpc4j-javadoc.jar)
jsonrpc4j下载地址:http://download.csdn.net/detail/skyunicorn/9555833
但是调用jsonrpc4j的时候还要依赖三个包(好麻烦,我当时用的时候不知道,结果搞这个都要奔溃了)
(另外我在这吐槽一下:CSDN文章审批太慢,而且传个jar包,竟然让我传了3-4次,搞什么啊)
jackson-annotations.jar http://download.csdn.net/detail/skyunicorn/9556107
jackson-core-.jar http://download.csdn.net/detail/skyunicorn/9556128
jackson-databind.jar http://download.csdn.net/detail/skyunicorn/9556110
使用方法:
一、导包
具体步骤就不说了
二、具体使用
//连接服务器
JsonRpcHttpClient client = new JsonRpcHttpClient(new URL(path)); // path为URL
//设置传递对象
Map login = new HashMap();
login.put("db",db); //db为参数
login.put("login",user); //user为参数
login.put("password", pwd); //pwd为参数
//调用方法连接(invoke(method,object,returnType))
Map map = client.invoke("method", login, Map.class);
获取返回对象的session_id
if (SessionID == "")
{
JSONObject jsonObject = new JSONObject(map);//此处的JSONObject为org.json包下的
SessionID = jsonObject.optString("session_id");
Log.d("SessionID", SessionID);
}
// 连接URL并设置SessionID
JsonRpcHttpClient client = new JsonRpcHttpClient(new URL(path));
// 设置头部传SessionID
Map headers = new HashMap();
headers.put("Session_ID", SessionID); // 请咨询后台的SessionID名
client.setHeaders(headers);
// 设置连接超时
client.setConnectionTimeoutMillis(5000);
client.setReadTimeoutMillis(5000);
根据需求我们设置传参
//整体对象
Map map = new HashMap();
//model传值
map.put("model", "aaaa");
//method传值
map.put("method", "bbbb");
//设置args里的列表(就是这里坑了我好久)
List argsList = new ArrayList();
List itemList = new ArrayList();
itemList.add(1);
argsList.add(itemList);
//args传值
map.put("args", argsList);
//定义kwargs里的对象
Map kwargsMap = new HashMap<>();
//设置kwargs里的列表
List kwargsList = new ArrayList();
kwargsList.add("id");
kwargsList.add("name");
//设置kwargs里的对象
kwargsMap.put("fields", kwargsList);
//kwargs传值
map.put("kwargs", kwargsMap);
//发送请求:(获取数据类型转为List)
List list = client.invoke("method", map, List.class); //第一个参数是方法名,请咨询后台
// 将获取的数据转为JSONArray
JSONArray array = new JSONArray(list);
// 遍历jsonArray转为jsonObject
for (int i = 0; i < array.length(); i++)
{
JSONObject object = array.getJSONObject(i);
Log.d(TAG, object.toString());
String name = object.optString("name");
}
// 出现LinkedHashMap转JsonObject出错情况时,将JsonArray强转为LinkedHashMap然后取值
Log.d(TAG, "array---" + ((LinkedHashMap)array.get(0)).get("name").toString());
暂时搞了这么多,谁有更简单的方法,请留言让我学习下,谢谢。
Demo因为涉及公司URL就不提供了,主要代码都贴上了。
注:我后来尝试下,发现将数据转为JSONObject再取值会更方便(2016.9.26修改)
在bulid里添加Gson库
compile 'com.google.code.gson:gson:2.2.4'
然后取值
Object object = client.invoke("method", map, Object.class);
Gson gson = new Gson();
JSONObject jsonObject = new JSONObject(gson.toJson(object));
然后直接按Json格式取值就可以
感谢 燕智凯 提供的依赖地址(2017.1.20修改)
compile 'com.github.briandilley.jsonrpc4j:jsonrpc4j:1.5.0'