첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170

TestSolution.zip
다운로드

[TestServer 프로젝트]

▶ Models/TestModel.cs

using System.ComponentModel.DataAnnotations;

namespace TestServer.Models
{
    /// <summary>
    /// 테스트 모델
    /// </summary>
    public class TestModel
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region ID - ID

        /// <summary>
        /// ID
        /// </summary>
        public int ID { get; set; }

        #endregion
        #region 성명 - Name

        /// <summary>
        /// 성명
        /// </summary>
        [Required]
        [StringLength(50, MinimumLength = 3, ErrorMessage = "성명은 3자 이상 입력해 주시기 바랍니다.")]
        public string Name { get; set; }

        #endregion
    }
}

 

728x90

 

▶ Models/TestRepository.cs

using System.Collections.Generic;

namespace TestServer.Models
{
    /// <summary>
    /// 테스트 저장소
    /// </summary>
    public class TestRepository
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Public

        #region Field

        /// <summary>
        /// 테스트 딕셔너리
        /// </summary>
        public static Dictionary<int, TestModel> TestDictionary;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Static

        #region 생성자 - TestRepository()

        /// <summary>
        /// 생성자
        /// </summary>
        static TestRepository()
        {
            TestDictionary = new Dictionary<int, TestModel>();

            TestDictionary.Add(1, new TestModel { ID = 1, Name = "홍길동" });
            TestDictionary.Add(2, new TestModel { ID = 2, Name = "김철수" });
            TestDictionary.Add(3, new TestModel { ID = 3, Name = "이용희" });
        }

        #endregion
    }
}

 

300x250

 

▶ Controllers/TestController.cs

using Microsoft.AspNetCore.Mvc;
using System.Linq;
using System.Net;

using TestServer.Models;

namespace TestServer.Controllers
{
    /// <summary>
    /// 테스트 컨트롤러
    /// </summary>
    [ApiController]
    [Route("api/[controller]")]
    public class TestController : Controller
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 리스트 구하기 - GetList()

        /// <summary>
        /// 리스트 구하기
        /// </summary>
        /// <returns>리스트</returns>
        [HttpGet]
        public JsonResult GetList()
        {
            Response.StatusCode = (int)HttpStatusCode.OK;

            return Json(TestRepository.TestDictionary.Values.ToList());
        }

        #endregion
        #region 항목 구하기 - GetItem(id)

        /// <summary>
        /// 항목 구하기
        /// </summary>
        /// <returns>항목</returns>
        [HttpGet("{id:int}")]
        public JsonResult GetItem(int id)
        {
            if(TestRepository.TestDictionary.ContainsKey(id))
            {
                Response.StatusCode = (int)HttpStatusCode.OK;

                return Json(TestRepository.TestDictionary[id]);
            }
            else
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;

                return Json(null);
            }
        }

        #endregion
        #region 항목 추가하기 - AddItem(test)

        /// <summary>
        /// 항목 추가하기
        /// </summary>
        /// <param name="test">테스트</param>
        /// <returns>처리 결과</returns>
        [HttpPost]
        public JsonResult Post([FromBody]TestModel test)
        {
            if(ModelState.IsValid)
            {
                if(TestRepository.TestDictionary.ContainsKey(test.ID))
                {
                    Response.StatusCode = (int)HttpStatusCode.BadRequest;

                    return Json("FAILURE");
                }

                TestRepository.TestDictionary.Add(test.ID, test);

                Response.StatusCode = (int)HttpStatusCode.Created;

                return Json("SUCCESS");
            }

            Response.StatusCode = (int)HttpStatusCode.BadRequest;

            return Json("FAILURE");
        }

        #endregion
    }
}

 

[TestClient 프로젝트]

▶ Program.cs

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace TestClient
{
    /// <summary>
    /// 프로그램
    /// </summary>
    class Program
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Public

        #region 프로그램 시작하기 - Main()

        /// <summary>
        /// 프로그램 시작하기
        /// </summary>
        static void Main()
        {
            // 포트 5569는 서버 설정과 일치시킨다.
            using(HttpClient client = GetHTTPClient("http://localhost:5569/"))
            {
                List<TestModel> list;
                TestModel       item;
                string          status;

                Console.WriteLine();
                Console.WriteLine("리스트를 조회합니다.");
                Console.WriteLine("--------------------------------------------------");

                list = GetList(client).GetAwaiter().GetResult();

                for(int i = 0; i < list.Count; i++)
                {
                    item = list[i];

                    Console.WriteLine($"{item.ID}, {item.Name}");
                }


                Console.WriteLine();
                Console.WriteLine("항목을 조회합니다.");
                Console.WriteLine("--------------------------------------------------");

                item = GetItem(client, 3).GetAwaiter().GetResult();

                Console.WriteLine($"{item?.ID}, {item?.Name}");


                Console.WriteLine();
                Console.WriteLine("값을 추가합니다.");
                Console.WriteLine("--------------------------------------------------");

                status = AddItem(client, new TestModel { ID = 4, Name = "백만원" }).GetAwaiter().GetResult();

                Console.WriteLine(status);


                Console.WriteLine();
                Console.WriteLine("리스트를 조회합니다.");
                Console.WriteLine("--------------------------------------------------");

                list = GetList(client).GetAwaiter().GetResult();

                for(int i = 0; i < list.Count; i++)
                {
                    item = list[i];

                    Console.WriteLine($"{item.ID}, {item.Name}");
                }


                Console.WriteLine("--------------------------------------------------");

                Console.WriteLine("아무 키나 눌러 주시기 바랍니다.");

                Console.ReadKey(true);
            }
        }

        #endregion

        #region HTTP 클라이언트 구하기 - GetHTTPClient(baseAddress)

        /// <summary>
        /// HTTP 클라이언트 구하기
        /// </summary>
        /// <param name="baseAddress">기준 주소</param>
        /// <returns>HTTP 클라이언트</returns>
        private static HttpClient GetHTTPClient(string baseAddress)
        {
            HttpClient client = new HttpClient();

            client.BaseAddress = new Uri(baseAddress);

            client.DefaultRequestHeaders.Accept.Clear();

            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            return client;
        }

        #endregion

        #region 리스트 구하기 - GetList(client)

        /// <summary>
        /// 리스트 구하기
        /// </summary>
        /// <param name="client">클라이언트</param>
        /// <returns>리스트</returns>
        private static async Task<List<TestModel>> GetList(HttpClient client)
        {
            string url = string.Format("api/test/");

            HttpResponseMessage response = await client.GetAsync(url);

            if(response.IsSuccessStatusCode)
            {
                List<TestModel> list = await response.Content.ReadAsAsync<List<TestModel>>();

                return list;
            }

            return null;
        }

        #endregion
        #region 항목 구하기 - GetItem(client, id)

        /// <summary>
        /// 항목 구하기
        /// </summary>
        /// <param name="client">클라이언트</param>
        /// <param name="id">ID</param>
        /// <returns>항목</returns>
        private static async Task<TestModel> GetItem(HttpClient client, int id)
        {
            string url = string.Format("api/test/{0}", id);

            HttpResponseMessage response = await client.GetAsync(url);

            if(response.IsSuccessStatusCode)
            {
                TestModel item = await response.Content.ReadAsAsync<TestModel>();

                return item;
            }

            return null;
        }

        #endregion
        #region 항목 추가하기 - AddItem(client, item)

        /// <summary>
        /// 항목 추가하기
        /// </summary>
        /// <param name="client">클라이언트</param>
        /// <param name="item">항목</param>
        /// <returns>처리 결과</returns>
        private static async Task<string> AddItem(HttpClient client, TestModel item)
        {
            string url = string.Format("api/test/");

            var response = await client.PostAsJsonAsync<TestModel>(url, item);

            if(response.IsSuccessStatusCode)
            {
                string result = await response.Content.ReadAsAsync<string>();

                return result;
            }

            return null;
        }

        #endregion
    }
}
728x90
반응형
그리드형
Posted by 사용자 icodebroker

댓글을 달아 주세요