Esempio di utilizzo in C#

Questo esempio visualizza un’esempio di utilizzo delle API.

Per utilizzarlo digitare da riga di comando:

# DMKExampleApi.exe URL USERNAME PUBLIC_KEY PRIVATE_KEY COMMAND

Dove:

  • URL = Url della piattaforma a cui collegarsi
  • PRIVATE_KEY = La chiave privata
  • PUBLIC_KEY = La chiave pubblica
  • COMMAND = I comandi di esempio da eseguire, che possono essere:
    • leads: Visualizza 1 lead, a partire dal 100° lead
    • fields: Visualizza la lista dei campi
    • leads_save: Salva un generico lead

Utilizzare:

# DMKExampleApi.exe –help

Per visualizzare un messaggio di utilizzo.

using System;
using System.Net;
using System.Linq;
using System.Collections.Specialized;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Security.Cryptography;
using System.Threading.Tasks;
using System.Web.Script.Serialization;

namespace DMKApiExample
{
    class DMKApi
    {
        string baseUrl;
        string username;
        string publicKey;
        string privateKey;

        public DMKApi(string baseUrl, string username, string publicKey, string privateKey)
        {
            this.baseUrl        = baseUrl;
            this.username       = username;
            this.publicKey      = publicKey;
            this.privateKey     = privateKey;
        }

        static void Main(string[] args)
        {
            string baseUrl      = args[0] + "/z/dmkapi/";
            string username     = args[1];         //Username
            string publicKey    = args[2];            //Chiave pubblica: Può anche essere utilizzata per accessi diretti
            string privateKey   = args[3];           //Chiave privata: Nessun altro deve conoscerla (solo client e server)
            string command      = args[4];



            DMKApi dmkApi = new DMKApi(baseUrl, username, publicKey, privateKey);

            string response;

            /* LETTURA DELLA LISTA DEI LEAD */
            if (command == "leads")
            {
                Dictionary<string, object> request = new Dictionary<string, object>
                {
                    {"limit","1"},
                    {"offset", "100"}
                };

                response = dmkApi.sendRequest("leads/leads", request);

                /* Stampo la lista dei lead */
                Console.Write(response);
            }
            else if (command == "fields")
            {
                /* LETTURA DELLA LISTA DEI CAMPI DEI LEAD */
                response = dmkApi.sendRequest("leads/fields/fields", new Dictionary<string, object> { });

                //Stampa la lista dei campi
                Console.Write(response);
            }
            else if (command == "leads_save")
            {

                Dictionary<string, object> request = new Dictionary<string, object>
                {
                    {"lead",new
                        {
                            owner_id = "1",
                            firstname = "Enrico",
                            lastname = "Venezia",
                            email = "enrico.venezia@sefin.it"
                        }},

                };

                /* CREAZIONE DI UN NUOVO LEAD */
                response = dmkApi.sendRequest("leads/save", request);

                //Stampa della risposta
                Console.Write(response);
            }

            if (args[1] == "--help")
            {
                Console.Write("URL USERNAME PUBLIC_KEY PRIVATE_KEY COMMANDn");
                Console.Write("COMMANDS ARE: n");
                Console.Write("tleads: List of leadsn");
                Console.Write("tfields: List of fieldsn");
                Console.Write("tleads_save: Save/Update a leadn");
            }

            Console.ReadLine();
        }

        /*
        * Invia una richiesta
        */
        private string sendRequest(string action, Dictionary<string, object> other_data)
        {
            string realToken = this.getToken();

            Dictionary < string, object> request = new Dictionary<string, object>
            {
                {"token", realToken},
            };

            other_data.ToList().ForEach(x => request.Add(x.Key, x.Value));

            string response = postCryptedRequest(action, request);

            return response;
        }

        /*
        * Richiede la generazione di un codice Token
        */
        private string getToken()
        {
            string realToken = this.postCryptedRequest("get-token", new Dictionary<string, object> { });
            return realToken;
        }

        /*
        * Effettua un invio di dati utilizzando POST, ma cripta i dati utilizzando
        * AES-256, con chiave privata
        */
        private string postCryptedRequest(string url, Dictionary<string, object> fields)
        {
            string jsonData = new JavaScriptSerializer().Serialize(fields);
            string data = this.Encrypt(jsonData);

            using (WebClient client = new WebClient())
            {
                byte[] response = client.UploadValues(this.baseUrl + url, new NameValueCollection(){
                       { "username", username},
                       { "key", publicKey},
                       { "data", Convert.ToBase64String(ASCIIEncoding.UTF8.GetBytes(data))}
                   });

                return this.Decrypt(response, privateKey);
            }
        }

        /*
        * Cripta un stringa utilizzando AES-256
        */
        private string Encrypt(string text)
        {
            RijndaelManaged AesEncryption = new RijndaelManaged();

            AesEncryption.KeySize = 256;
            AesEncryption.BlockSize = 128;
            AesEncryption.Mode = CipherMode.CBC;
            AesEncryption.Padding = PaddingMode.PKCS7;
            AesEncryption.Key = ASCIIEncoding.UTF8.GetBytes(this.privateKey);
            AesEncryption.IV = ASCIIEncoding.UTF8.GetBytes("0000000000000000");

            byte[] plainText = ASCIIEncoding.UTF8.GetBytes(text);

            ICryptoTransform crypto = AesEncryption.CreateEncryptor();
            byte[] resultBytes = crypto.TransformFinalBlock(plainText, 0, plainText.Length);

            return Convert.ToBase64String(resultBytes);

        }

        /*
        * Decripta un stringa utilizzando AES-256
        */
        private string Decrypt(byte[] text, string privateKey)
        {
            RijndaelManaged AesEncryption = new RijndaelManaged();

            AesEncryption.KeySize = 256;
            AesEncryption.BlockSize = 128;
            AesEncryption.Mode = CipherMode.CBC;
            AesEncryption.Padding = PaddingMode.PKCS7;
            AesEncryption.Key = ASCIIEncoding.UTF8.GetBytes(this.privateKey);
            AesEncryption.IV = ASCIIEncoding.UTF8.GetBytes("0000000000000000");

            ICryptoTransform decrypto = AesEncryption.CreateDecryptor();

            byte[] decodeTextBase64 = Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(text));
            byte[] resultBytes = decrypto.TransformFinalBlock(decodeTextBase64, 0, decodeTextBase64.Length);

            return System.Text.Encoding.UTF8.GetString(resultBytes);
        }

    }
}