使用zabbix的java api來對主機進行刪除時的bug說明
阿新 • • 發佈:2019-01-01
在最近的程式碼開發中,通過java呼叫zabbix的api來實現對主機(host)的刪除(host.delete
),問題出現在當在程式碼中傳入hostid的時候,請求傳送異常,異常資訊是no permission什麼的(沒截圖,手動求原諒)。找了一下午,終於找到了原因
<dependency> <groupId>com.github.0312birdzhang</groupId> <artifactId>Zabbix4j</artifactId> <version>0.1.8</version> </dependency>
2,說重點,因為公司的zabbix伺服器是3.0版本的,而大神封裝好的jar包是基於zabbix1.8版本的。這也是我在開發中遇到的bug之一,詳情如下:
{
"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資料是基本型,不是物件。