Membuat Validasi Ip Address atau IP Filter dalam Fungsi Web Service dengan WEB API 2 C# VS2013 Dengan Database Mysql

Masih teringat saya pernah memposting tentang pengertian web api 2 didalam nya membahas konsep web service, sekarang kita akan coba membuat IP FILTER atau Validasi IP Address dengan WEB API 2 c#

Persyaratannya adalah anda harus menginstall di VS2013 atau Visual studio lainnya
NuGet WebApiTestClient
NuGet MySql.Data

karena saya memakai database Mysql jadi saya harus menginstall driver mysql untuk VS2013
untuk itu saya menginstall mysql-for-visualstudio-1.2.4.msi dan mysql-connector-net-6.9.7.msi link nya silahkan cari di google 😀

untuk melihat sukses atau tidak nya bisa di cek seperti gambar di bawah ini
mysqlnet

Jika sudah sukses mari kita coba membuat koneksi database

Web.config

  <connectionStrings>
    <add name="DefaultConnection" connectionString="server=localhost;User Id=root;Persist Security Info=True;database=rusun;" providerName="MySql.Data.MySqlClient" />
  </connectionStrings>

setelah itu kita akan membuat class dengan nama “con” untuk koneksi yang didalamnya ada fungsi “OPEN” dan “CLOSE

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Configuration;

namespace Webrusun.Models
{
    public class Conn
    {
        public MySqlConnection SqlCon;

        public bool Open(string Connection = "DefaultConnection")
        {
            SqlCon = new MySqlConnection(@WebConfigurationManager.ConnectionStrings[Connection].ToString());

            try
            {
                bool Test = true;
                if (SqlCon.State.ToString() != "open")
                {
                    SqlCon.Open();


                }
                return Test;
            }
            catch (Exception ex)
            {

                return false;

            }
        }

        public bool Close()
        {

            try
            {
                SqlCon.Close();
                GC.Collect();
                return true;
            }
            catch (Exception ex)
            {

                return false;

            }
        }
    }
}

untuk databasenya saya namakan “rusun” saya ambil contoh 2 table yaitu ipaddress untuk memfilter ipaddress yang masuk dan penghuni untuk contoh web service yang akan di selipkan validasi ip filter yang kerangkanya bisa di lihat di bawah :

/*
SQLyog Ultimate v11.11 (64 bit)
MySQL - 5.5.16 : Database - rusun
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`rusun` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `rusun`;

/*Table structure for table `ipaddress` */

DROP TABLE IF EXISTS `ipaddress`;

CREATE TABLE `ipaddress` (
  `ip` varchar(50) NOT NULL,
  `aktif` smallint(6) DEFAULT '1',
  `name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`ip`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

/*Table structure for table `penghuni` */

DROP TABLE IF EXISTS `penghuni`;

CREATE TABLE `penghuni` (
  `no_ktp` varchar(20) NOT NULL,
  `nama_penghuni` varchar(50) NOT NULL,
  `tgl_daftar` date NOT NULL,
  PRIMARY KEY (`no_ktp`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

Kita akan membuat validasi ip filter atau validasi ip address, saya sudah mencoba berbagai metode untuk validasi ip address dari berbagai sumber dari google dan ini lah versi saya yang saya custom dari berbagai sumber dan saya sukai untuk validasi ip address di WEB API 2 C#.

Pertama kita buat class validasi didalam Models isinya seperti di bawah :

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Webrusun.Models
{
    public class validasi
    {

        private Conn DB = new Conn();
        public bool IsIpAddressAllowed()
        {

            //string ipAddress = HttpContext.Current.Request.UserHostAddress;
            System.Web.HttpContext context2 = System.Web.HttpContext.Current;
            string ipAddress2 = context2.Request.ServerVariables["SERVER_NAME"];

            DB.Open();
            var sql = "SELECT ip FROM ipaddress where aktif = 1 and ip like '" + ipAddress2.ToString() + "'";
            MySqlCommand db_cmd = new MySqlCommand(sql, DB.SqlCon);

            using (var dbread = db_cmd.ExecuteReader())
            {
                // If your reader can read
                if (dbread.Read())
                {
                    // Set your label to the first value available
                    DB.Close();
                    return true;
                }
                else
                {
                    // Otherwise return nothing
                    DB.Close();
                    return false;
                }

            }            

        }

    }
}

Sebelum kita menggunakan fungsi di class diatas kita akan membuat contoh objek yaitu penghuniyang akan ditanamkan fungsi tersebut:

buat class baru dengan nama penghuni di dalam Models seperti di bawah :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Webrusun.Models
{
    public class penghuni
    {
        public string no_ktp { get; set; }
        public string nama_penghuni { get; set; }
        public string tgl_daftar { get; set; }
    }
}

dan buat detail class nya dengan nama penghunidetail di Models seperti dibawah ini :

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;

namespace Webrusun.Models
{
    public class penghunidetail : ipenghunidetail
    {
        private Conn DB = new Conn();
        public object GetAll(int jtStartIndex, int jtPageSize)
        {
            List<penghuni> customers = new List<penghuni>();

            int lihat = jtPageSize ;
            DB.Open();
            var sql = string.Format("SELECT  no_ktp,nama_penghuni,tgl_daftar, (select count(1) from penghuni) as tot FROM penghuni Limit "+ jtStartIndex + "," + lihat);
            MySqlCommand db_cmd = new MySqlCommand(sql, DB.SqlCon);
            MySqlDataAdapter MyAdapter = new MySqlDataAdapter();
            MyAdapter.SelectCommand = db_cmd;
            DataTable dTable = new DataTable();
            MyAdapter.Fill(dTable);
            int tot = 0;
            foreach (DataRow row in dTable.Rows)
            {
                penghuni customer = new penghuni();
                customer.no_ktp = row["no_ktp"].ToString();
                customer.nama_penghuni = row["nama_penghuni"].ToString();
                customer.tgl_daftar = row["tgl_daftar"].ToString();
                if (tot == 0) {
                    tot = Convert.ToInt32(row["tot"].ToString());
                 }
                customers.Add(customer);
            }
            dTable.Dispose();

            //using (var dbread = db_cmd.ExecuteReader())
            //{
            //    // If your reader can read
            //    if (dbread.Read())
            //    {
            //        while (dbread.Read())
            //        {
            //            // Set your label to the first value available
            //            penghuni customer = new penghuni();
            //            customer.no_ktp = dbread.GetString(0).ToString();
            //            customer.nama_penghuni = dbread.GetString(1).ToString();
            //            customer.tgl_daftar = dbread.GetString(2).ToString();
            //            if (tot == 0)
            //            {
            //                tot = Convert.ToInt32(dbread.GetValue(3));

            //            }
            //            customers.Add(customer);
                        
            //        }
            //    }

            //}
            DB.Close();
           

            return new
            {
                Result = "OK",
                Records = customers,
                TotalRecordCount = tot
            };
        }

    }
}

dan membuat interface nya dengan nama class ipenghunidetail di dalam Models sebagai berikut :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Webrusun.Models
{
    public interface ipenghunidetail
    {
        object GetAll(int jtStartIndex, int jtPageSize);
    }
}

Kita bahas koding diatas terlebih dahulu, saya membuat contoh satu fungsi saja yaitu GetAll(int jtStartIndex, int jtPageSize) yang fungsinya memanggil semua data dengan 2 parameter yaitu jtStartIndex untuk awal record yang di panggil dan jtPageSize untuk berapa banyak record yang di panggil dengan memanfaatkan fungsi dari query mysql yaitu “Limit“.
Awalnya saya memakai Limit dengan menggunakan ExecuteReader dari MySqlCommand yang fungsinya diatas saya matikan, ketika saya memakai itu saya tidak mengerti kenapa jika saya request data record di jtPageSize itu hilang satu record, saya coba mengganti NuGet Mysql tetapi sama saja hasilnya, akhirnya saya mencoba memakai MySqlDataAdapter yang di lempar ke DataTable dan hasil dari request data record di jtPageSize terpenuhi dengan sempurna.

Terakhir kita akan membuat Controllers dengan nama “PenghuniController” dengan koding seperti dibawah ini :

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using Webrusun.Models;

namespace Webrusun.Controllers
{
    [RoutePrefix("api/penghuni")]
    public class PenghuniController : ApiController
    {
         static readonly ipenghunidetail repository = new penghunidetail();

        [Route("getallpenghuni/{jtStartIndex:int}/{jtPageSize:int}")]
        [HttpGet]
         public object GetAllCustomers(int jtStartIndex, int jtPageSize)
         {
            

             validasi vali = new validasi();
             bool hasil = vali.IsIpAddressAllowed();
             if (hasil == true)
             {
                 return repository.GetAll(jtStartIndex, jtPageSize);
             }
             else
             {
                 return new
                 {
                     Result = "False",
                     Records = "0",
                     TotalRecordCount ="0"
                 };
             }   
         }
    }
}

Alamat Web service nya bisa di ganti sesuai kebutuhan dengan cara merubah RoutePrefix dan Route. Diatas saya mengambil contoh dengan menggunakan HttpGet yang artinya hanya bisa dilakukan dengan Get, agar mudah ditesnya, untuk masalah SQL Inject silahkan ditambah lagi fungsinya sesuai kebutuhan.

Jika sudah, bisa kita test setelah kamu install WebApiTestClient di Nuget untuk menjalankan web service nya.

sebelum mencoba silahkan isi record penghuni terlebih dahulu agar bisa terlihat hasilnya.

kita akan gagal mendapatkan data karena kita belum memasukan nama alamat kita didalam table ipaddress seperti dibawah ini

gagalservice

masukan record kedalam table ipaddress seperti di bawah ini :
recordip

dan cobalah jalankan web service lagi, jika anda sukses maka data record yang dibutuhkan akan muncul. seperti gambar di bawah ini :

suksesservice

jika sudah di publish web service nya jangan lupa memainkan ipaddress didalam table ipaddress pada database.

Selamat mencoba 🙂 , lain waktu saya akan coba membahas memanggil web service ini di PHP dan mencoba ip address filter nya.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s