{ "jsonrpc" : "2.0" , "method" : "apiinfo.version" , "params" :[], "auth" : "a6e895b98fde40f4f7badf112fd983bf" , "id" :2 } <br>{ "jsonrpc" : "2.0" , "result" : "1.3" , "id" :2 } * This source code was highlighted with Source Code Highlighter .
JSON-RPC प्रोटोकॉल का विस्तृत विवरण लेख के लक्ष्य में शामिल नहीं है, हम कार्यान्वयन के साथ आगे बढ़ेंगे:
private string GetWebRequest( string body)
{
WebRequest wb = WebRequest.Create(url);
wb.ContentType = @"application/json-rpc" ;
wb.Credentials = CredentialCache.DefaultCredentials;
ASCIIEncoding encoding = new ASCIIEncoding();
string postData = body;
byte [] data = encoding.GetBytes(postData);
wb.Method = "POST" ;
wb.ContentLength = data.Length;
Stream newStream = wb.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();
HttpWebResponse response = (HttpWebResponse)wb.GetResponse();
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
return reader.ReadToEnd();
}
public string obj2json( object obj)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
return serializer.Serialize(obj);
}
public string CallApi( string method, object param)
{
object Query = new
{
jsonrpc = "2.0" ,
auth = auth_hash,
id = id.ToString(),
method = method,
Params = param
};
String qr = obj2json(Query);
qr=qr.Replace( "Params" , "params" );
id++;
string result = GetWebRequest(qr);
return result;
}
* This source code was highlighted with Source Code Highlighter .
CallAPI फ़ंक्शन फ़ंक्शन के लिए API कॉल करता है। एक विधि और इसके मापदंडों को स्वीकार करता है (Zabbix एपीआई प्रलेखन के अनुसार एक वस्तु के रूप में)। उपयोग के उदाहरण थोड़े कम होंगे। Obj2json का उद्देश्य, और GetWebRequest मुझे लगता है कि स्पष्ट है, मैं सिर्फ इतना जोड़ूंगा कि अनुरोध POST विधि का उपयोग करके भेजा गया है। सर्वर पर प्राधिकरण के उदाहरण के रूप में इस फ़ंक्शन के उपयोग पर विचार करें। प्राधिकरण के लिए, हमें उपयोगकर्ता और पासवर्ड मापदंडों के साथ "user.authenticate" विधि के लिए एक अनुरोध भेजने की आवश्यकता है। इसका परिणाम होगा, जो कि प्रत्येक बाद के अनुरोध का क्षेत्र है। प्राधिकरण के लिए एक तैयार कार्य, उपरोक्त बातों को ध्यान में रखते हुए, कुछ इस तरह दिखाई देगा:
public bool login()
{
bool res;
Update( new UpdateInfoMessage( this ) { message = " " , status = "LOGIN" });
try
{
var userinfo = new { user = _user, password = _password };
string result = CallApi( "user.authenticate" , userinfo);
auth_hash = (serializer.Deserialize< string >(result)).result;
res= true ;
Update( new UpdateInfoMessage( this ) { message = " " , status = "LOGIN" });
}
catch (Exception ex)
{
Update( new UpdateInfoMessage( this ) { message = " :" + ex.Message, status = "LOGIN" });
res= false ;
}
return res;
}
* This source code was highlighted with Source Code Highlighter .
जैसा कि आप देख सकते हैं, तर्क बदसूरत सरल है, हम मापदंडों का वर्णन करते हैं, विधि का नाम निर्धारित करते हैं, फ़ंक्शन को कॉल करते हैं। अगर सबकुछ ठीक हो जाता है और वहाँ स्थित है, तो हम इसे कक्षा के वैश्विक क्षेत्र में सहेजते हैं और सकारात्मक परिणाम देते हैं। अगर कुछ गलत हुआ है - त्रुटि को पकड़ें और झूठ को वापस करें। यह अद्यतन फ़ंक्शन को भी ध्यान देने योग्य है - यह हमारी कक्षा में परिवर्तनों के मुख्य अनुप्रयोग को सूचित करने का कार्य करता है। इसलिए, हमने सीखा कि अनुरोध को कैसे पूरा किया जाए और सर्वर से सरल प्रतिक्रियाएं प्राप्त करें। लेकिन सर्वर से अधिकांश प्रतिक्रियाएं पूरी तरह से अलग तत्वों के सरणियां हैं। नई कार्यक्षमता को बढ़ाने के लिए, निम्न सामान्यीकृत वर्ग बनाया गया था:
public class Result: IEnumerable
{
//
public T[] result;
///
public ZabbixConnection server;
// Zabbix API, maps.get, triggers.update .
protected string method;
//
protected object Params;
// ,
public string stringResult;
// .
public object SyncRoot;
// , "method" "Params"
protected virtual void init() { }
public Result(ZabbixConnection Server)
{
init();
server = Server;
SyncRoot = new object ();
}
public Result()
{
init();
}
// , result collection
public virtual void get ()
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
lock (SyncRoot)
{
stringResult = (server.CallApi(method, Params));
result = serializer.Deserialize<Result>(stringResult).result;
if (result== null ){result= new T[1];}
}
}
public T this [ int index]
{
get
{
return result[index];
}
}
public IEnumerator GetEnumerator()
{
foreach (T item in result)
{
yield return item;
}
}
IEnumerator IEnumerable .GetEnumerator()
{
return GetEnumerator();
}
}
, Zabbix API . , Init , . :
using System;
using System.Collections. Generic ;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
namespace Zabbix
{
public class Hosts:Result
{
protected override void init()
{
method = "host.get" ;
Params = new { output = "extend" };
}
public Hosts(ZabbixConnection Server) : base (Server) { }
}
public class Host
{
public string host;
public string hostid;
public string ip;
public override string ToString()
{
return host;
}
}
}
मुझे लगता है कि यहां सब कुछ काफी सरल है, उसी तरह आप किसी भी डेटा को प्राप्त कर सकते हैं, चाहे वह ट्रिगर, होस्ट समूह, ईवेंट या शेड्यूल डेटा हो। सभी तरीकों और मापदंडों के विवरण Zabbix एपीआई प्रलेखन अनुभाग में पाए जा सकते हैं। मैं इस विषय को महसूस करता हूं और यह छोटा नहीं निकला है, और इसे समाप्त करने का समय आ गया है। मैंने .NET अनुप्रयोगों में Zabbix API का उपयोग करने के तरीके के बारे में जितना संभव हो उतना कम वर्णन किया है। अधिक पूर्ण लाइब्रेरी कोड, साथ ही WPF पर एक उदाहरण क्लाइंट, यहां डाउनलोड किया जा सकता है: https://github.com/p1nger/odzl