在最近的代码开发中,通过java调用zabbix的api来实现对主机(host)的删除(host.delete
),问题出现在当在代码中传入hostid的时候,请求发送异常,异常信息是no permission什么的(没截图,手动求原谅)。找了一下午,终于找到了原因
1,首先说明一下我在开发过程中引用的是大神将api封装好的jar包,链接地址如下:
http://www.mvnrepository.com/artifact/com.github.0312birdzhang/Zabbix4j
这也是maven的一个中央仓库,喜欢的朋友也可以收藏一下。
按照说明在项目中添加好这个jar包就行了
com.github.0312birdzhang
Zabbix4j
0.1.8
2,说重点,因为公司的zabbix服务器是3.0版本的,而大神封装好的jar包是基于zabbix1.8版本的。这也是我在开发中遇到的bug之一,详情如下:
在zabbix官方api中(https://www.zabbix.com/documentation/3.0/manual/api/reference/host/delete)
通过调用api来实现对主机的删除的json格式如下:
{
"jsonrpc": "2.0",
"method": "host.delete",
"params": [
"13",
"32"
],
"auth": "038e1d7b1735c6a5436ee9eae095879e",
"id": 1
}
这里可以看出在params内部传入的host的id值即可,但是借助jar包帮助我们生成的json格式如下:
{
"jsonrpc": "2.0",
"method": "host.delete",
"params": [
"hostid":"13",
"hostid":"32"
],
"auth": "038e1d7b1735c6a5436ee9eae095879e",
"id": 1
}
那么在发送请求的时候就会报出错误:no permission…….
3,原因找到了,解决办法就有了,在jar包中找到了发送host.delete请求的封装json数据的代码,贴出代码:
public class HostDeleteRequest extends ZabbixApiRequest {
private List params = new ArrayList();
public HostDeleteRequest() {
setMethod("host.delete");
}
public List getParams() {
return params;
}
public void setParams(List params) {
this.params = params;
}
public void addParams(int hostid) {
this.params = ZbxListUtils.add(this.params, new Params(hostid));
}
public class Params {
private Integer hostid;
public Params(Integer hostid) {
this.hostid = hostid;
}
public Params() {
}
}
}
可以看出这个类将我们需要删除的hostid封装成了一个Params对象,因此在发送json的时候显示
的是 “hostid”:”234” 这种格式。
解决办法有两种:
一种是将源码包下载下来,将List< params > 更改为 List < Integer >。然后打成新jar包放在项目中即可
一种就是仿照这个HostDelteRequest类,自己重新写一个类,不过将参数List< params > 改为 List,然后发送json的时候引用这个类就可以了。(这种方式需要更改两个文件,比较麻烦,推荐使用第一种)
这两种更改方式表明我们发送的json数据是基本型,不是对象。