使用zabbix的java api来对主机进行删除时的bug说明

本文介绍在使用Java调用Zabbix API删除主机时遇到的问题及解决方法。主要原因是使用的API封装库版本与Zabbix服务器版本不匹配,导致JSON格式错误。文章提供了两种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在最近的代码开发中,通过java调用zabbix的api来实现对主机(host)的删除(host.delete
),问题出现在当在代码中传入hostid的时候,请求发送异常,异常信息是no permission什么的(没截图,手动求原谅)。找了一下午,终于找到了原因

1,首先说明一下我在开发过程中引用的是大神将api封装好的jar包,链接地址如下:
http://www.mvnrepository.com/artifact/com.github.0312birdzhang/Zabbix4j
这也是maven的一个中央仓库,喜欢的朋友也可以收藏一下。
按照说明在项目中添加好这个jar包就行了

<dependency>
    <groupId>com.github.0312birdzhang</groupId>
    <artifactId>Zabbix4j</artifactId>
    <version>0.1.8</version>
</dependency>

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> params = new ArrayList<Params>();

    public HostDeleteRequest() {
        setMethod("host.delete");
    }
    public List<Params> getParams() {
        return params;
    }
    public void setParams(List<Params> 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<Integer>,然后发送json的时候引用这个类就可以了。(这种方式需要更改两个文件,比较麻烦,推荐使用第一种)

这两种更改方式表明我们发送的json数据是基本型,不是对象。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值