C#교과서 마스터하기 48. 네트워크 프로그래밍 맛보기

https://www.youtube.com/watch?v=u3DP9ms3bxk&list=PLO56HZSjrPTB4NxAsEP8HRk6YKBDLbp7m&index=83

1. 네트워크 프로그래밍

  • 로컬 네트워크가 아닌 서버에 데이터를 주고 받는 글로벌 네트워크 프로그래밍

2. 프로젝트

01. 47까지의 프로젝트 솔루션에 API 솔루션 폴더 생성 후 웹 어플리케이션 API 프로젝트 생성

  • TodoApp.Apis


02. Model 참조

03. Contreollers 폴더에 TodosController.cs 생성

04. GET 예제 코드(TodosController.cs)

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace TodoApp.Apis.Controllers
{
    [Route("api/[Controller]")]
    public class TodosController : ControllerBase
    {
        [HttpGet]
        public IActionResult GetAll()
        {
            return Content("안녕하세요.");
        }
    }
}

05. POST 예제 코드(TodosController.cs)

  • Talend API Tester 사용(Postman ok)
using CShopTodoApp.Models;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace TodoApp.Apis.Controllers
{
    [Route("api/[Controller]")]
    public class TodosController : ControllerBase
    {
        [HttpGet]
        public IActionResult GetAll()
        {
            return Content("안녕하세요.");
        }

        [HttpPost]
        public IActionResult Add([FromBody]Todo dto)
        {
            return Ok(dto);
        }
    }
}


06. Model Repository 구현(TodosController.cs)

using CShopTodoApp.Models;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace TodoApp.Apis.Controllers
{
    [Route("api/[Controller]")]
    public class TodosController : ControllerBase
    {
        private readonly ITodoRepository _repository;

        public TodosController()
        {
            _repository = new TodoRepositoryJson(@"C:\Temp\Todos.json"); 
        }

        [HttpGet]
        public IActionResult GetAll()
        {
            return Ok(_repository.GetAll());
        }

        [HttpPost]
        public IActionResult Add([FromBody]Todo dto)
        {
            _repository.Add(dto);
            return Ok(dto);
        }
    }
}




3. 이기종(다른 곳에서도 사용할 수 있다)

01. TodoApp.Apis / Startup.cs 수정

  • 다른 진영(기기)에서의 접근 허용
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace TodoApp.Apis
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddCors(options => { // 다른 진영에서의 접근 허용
                options.AddDefaultPolicy(build =>
                {
                    build.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod();
                });
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseCors(); // 다른 진영에서의 접근 허용

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}



02. 콘솔에서 테스트(API에 콘솔 프로젝트 생성)

  • TodoApp.Apis.Tests.ConsoleApp


03. Newtonsoft.json 참조(NuGet)


04. 콘솔 Program.cs 작성(Git 저장)

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace TodoApp.Apis.Tests.ConsoleApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string url = "https://localhost:5001/api/Todos";

            using (var client = new HttpClient())
            {
                // 데이터 전송
                var json = JsonConvert.SerializeObject(new Todo { Title = "HttpClient", IsDone = true});
                var post = new StringContent(json, Encoding.UTF8, "application/json");

                await client.PostAsync(url, post);

                // 데이터 수신
                var response = await client.GetAsync(url);
                var result = await response.Content.ReadAsStringAsync();
                var todos = JsonConvert.DeserializeObject<List<Todo>>(result);
                foreach (var item in todos)
                {
                    Console.WriteLine($"{item.Id} - {item.Title}({item.IsDone})");
                }
            }

        }
    }
    public class Todo
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public bool IsDone { get; set; }
    }

}
  • WebAPI 먼저 실행

  • 콘솔 실행

좋은 웹페이지 즐겨찾기