웹 API 사용 방법Net Core Infrastructure - 고급 섹션 5 디렉터 및 SwiggerUI

14047 단어 csharpdatabasewebdev
컨트롤러란?
컨트롤러는 ASP의 첫 번째 연락처입니다.NET 웹 API 코어 5 응용 프로그램이들은 전송된 요청을 처리합니다. 응용 프로그램의 구조에 따라 요청을 서비스 층에 전달할 수 있습니다. 예를 들어 모델 데이터에 대한 작업을 수행하고 JSON이나 SOAP 형식으로 응답을 되돌려줍니다. 그러나 본고에서 JSON 응답을 사용할 것입니다.컨트롤러는 Controllers 폴더에 저장되며 기본적으로 C# 클래스이며 그 공통적인 방법은Action 방법이라고 부른다.이러한 방법은 HTTP 요청을 처리하고 클라이언트에 보내는 응답을 준비합니다.
다음 그림에는 UI의 ASP가 될 수 있는 전송 요청과 뷰를 처리하는 데이터와 컨트롤러를 대표하는 모델이 있습니다.Net MVC 웹 앱, Angular, React 또는 Google 웹 API를 사용할 수 있는 모바일 애플리케이션입니다.

컨트롤러는 ASP의 ControllerBase 클래스에서 파생된 클래스입니다.Net Core 5와 on words, 컨트롤러 클래스를 사용할 때 기억해야 할 점은 'Controller' 접미사가 있어야 한다는 것이다.예를 들어 Company라는 컨트롤러를 추가하려면 컨트롤러의 이름이 Company Controller여야 합니다.이와 같이 Address에 컨트롤러를 추가하려면 이름이 AddressController여야 합니다.컨트롤러 클래스는 ControllerBase 클래스에서 상속되어야 합니다.
ControllerBase 클래스는 HTTP 요청을 처리하는 데 사용되는 많은 속성과 방법을 제공합니다.자세한 내용을 보려면 링크를 클릭하십시오.To find more about Controllers click me
다음은 ControllerBase에서 제공하는 몇 가지 방법의 예입니다.
메서드
되돌아오다
나쁜 부탁
400 상태 코드를 반환합니다.
찾을 수 없음
404 상태 코드를 반환합니다.
물리적 파일
파일을 반환합니다.
내용이 없다
어떤 내용도 되돌려주지 않습니다.
충분한 이론이 우리로 하여금 컨트롤러를 만들게 한다.
디렉터를 추가하려면 솔루션 리소스 매니저에서 디렉터 폴더를 마우스 오른쪽 버튼으로 클릭한 다음 -> 디렉터 추가 를 선택합니다.

마지막으로 AddNew Scaffold Item을 보실 수 있습니다. API 옵션을 선택했는지 확인하십시오. 기본값은 MVC입니다. 저는 API 컨트롤러 - Empty 옵션을 사용할 것입니다. 이것은 가장 좋은 학습 방법이기 때문입니다.하지만 더 많은 컨트롤러를 추가할 때 다른 템플릿을 탐색하는 것을 권장합니다.

다음에 우리는 우리의 컨트롤러를 명명할 것이다. 따라서 우리의 첫 번째 컨트롤러는 회사가 될 것이다. 아래 그림과 같다.

WebAPI 컨트롤러의 기본 템플릿으로 종료
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace WebApiSeriesCore5.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class CompanyController : ControllerBase
    {
    }
}

Get Put Post Delete 사용 방법
우선, 나는 회사 목록을 얻고 싶다. 이 점을 하려면, 우리는 컨트롤러에서 [HttpGet]을 사용할 수 있다. 아래의 예시 코드와 같다.
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(List<CompanyDto>))]
public async Task<IActionResult> GetAll()
{            
       return OK();
}
위의 코드에 두 가지를 추가했습니다. 첫째, Produces ResponseType 컨트롤러의Iaction Result 방법은 여러 응답 유형과 경로를 되돌릴 수 있습니다. [Produces ResponseType] 속성을 사용하는 것은 좋은 방법입니다.이는 Swagger와 같은 도구로 생성된 웹 API 도움말 페이지에 더욱 설명적인 응답 디테일을 생성하는 데 도움이 된다.또한 작업이 반환되는 알려진 응답 유형과 HTTP 상태 코드의 범위를 좁힙니다.To find more about ProducesResponseType click me
async는 본 프로젝트의 범위 내에 있지 않지만, 비동기 코드를 탐색하고 실험하며, 어떻게 사용하는지, 어떻게 실현하는지 배우도록 권장합니다.
만약 네가 내가 지난번에 서비스층을 실현한 문장을 읽은 적이 있다면.따라서 우리는 서비스 대상을 컨트롤러에 주입하여 데이터와 상호작용하도록 한다.
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace WebApiSeriesCore5.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class CompanyController : ControllerBase
    {
        private readonly ICompanyService _companyService;

        public CompanyController(ICompanyService companyService)
        {
            this._companyService = companyService;
        }

        [HttpGet]
        [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(List<CompanyDto>))]
        public async Task<IActionResult> GetAll()
        {
            var companies = await _companyService.GetCompaniesAsync();

            return Ok(companies);
        }

    }
}

비록 나는 아래의 예에서 완전한 컨트롤러를 제공했지만, GetByGUID (Guid CompanyGUID) 를 발견하면 방법은 주석을 달고, 만약 방법 위에 주석의 어떤 부분을 추가하거나 삭제하거나 편집한다면, 이것은 swagger UI에 반영될 것이다.나는 네가 스스로 HttpPost, HttPut, HttpPatch, HttpDelete를 추가해서 즐거움을 얻는 것을 건의한다.기본 유형과 복잡한 유형을 사용하여 매개 변수를 연결해 보십시오. 이것은 당신이 좋아할 때 배우는 가장 좋은 방법이기 때문입니다.
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using WebApiSeriesCore5.Dtos.Company;
using WebApiSeriesCore5.Service.Contract;

namespace WebApiSeriesCore5.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class CompanyController : ControllerBase
    {
        private readonly ICompanyService _companyService;

        public CompanyController(ICompanyService companyService)
        {
            this._companyService = companyService;
        }


        [HttpGet]
        [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(List<CompanyDto>))]
        public async Task<IActionResult> GetAll()
        {
            var companies = await _companyService.GetCompaniesAsync();

            return Ok(companies);
        }

        [HttpGet("{CompanyID:int}", Name = "GetByCompanyID")]
        [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(CompanyDto))]
        [ProducesResponseType(StatusCodes.Status400BadRequest)]
        [ProducesResponseType(StatusCodes.Status404NotFound)]
        [ProducesDefaultResponseType]
        public async Task<ActionResult<CompanyDto>> GetCompanyID(int CompanyID)
        {
            if (CompanyID <=0)
            {
                return BadRequest(CompanyID);
            }
            var CompanyFound = await _companyService.GetByIdAsync(CompanyID);

            if (CompanyFound.Data == null)
            {
                return NotFound();
            }

            return Ok(CompanyFound);

        }



        /// <summary>
        /// Get Company by GUID.
        /// </summary>
        /// <param name="CompanyGUID"></param>
        /// <returns></returns>
        //GET/companies/123
        [HttpGet("{CompanyGUID:Guid}", Name = "GetCompanyByGUID")]
        [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(CompanyDto))]
        [ProducesResponseType(StatusCodes.Status400BadRequest)]
        [ProducesResponseType(StatusCodes.Status404NotFound)] //Not found
        [ProducesDefaultResponseType]
        public async Task<ActionResult<CompanyDto>> GetByGUID(Guid CompanyGUID)
        {

            if (CompanyGUID == Guid.Empty)
            {
                return BadRequest(CompanyGUID);
            }

            var company = await _companyService.GetByGUIDAsync(CompanyGUID);

            if (company.Data == null)
            {

                return NotFound();
            }

            return Ok(company);
        }

        /// <summary>
        /// Create a new company Record.
        /// </summary>
        /// <param name="createCompanyDto"></param>
        /// <returns></returns>
        //POST /Companies
        [HttpPost]
        [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(CompanyDto))]
        [ProducesResponseType(StatusCodes.Status400BadRequest)]
        [ProducesResponseType(StatusCodes.Status404NotFound)] //Not found
        [ProducesResponseType(StatusCodes.Status500InternalServerError)]
        public async Task<ActionResult<CompanyDto>> CreateCompany([FromBody] CreateCompanyDto createCompanyDto)
        {
            if (createCompanyDto == null)
            {
                return BadRequest(ModelState);
            }

            if (!ModelState.IsValid) { return BadRequest(ModelState); }

            var _newCompany = await _companyService.AddCompanyAsync(createCompanyDto);

            if (_newCompany.Success == false && _newCompany.Message == "Exist")
            {
                return Ok(_newCompany);
            }


            if (_newCompany.Success == false && _newCompany.Message == "RepoError")
            {
                ModelState.AddModelError("", $"Some thing went wrong in respository layer when adding company {createCompanyDto}");
                return StatusCode(500, ModelState);
            }

            if (_newCompany.Success == false && _newCompany.Message == "Error")
            {
                ModelState.AddModelError("", $"Some thing went wrong in service layer when adding company {createCompanyDto}");
                return StatusCode(500, ModelState);
            }

            //Return new company created
            return CreatedAtRoute("GetCompanyByGUID", new { CompanyGUID = _newCompany.Data.GUID }, _newCompany);

        }

        /// <summary>
        /// Update existing company record.
        /// </summary>
        /// <param name="CompanyGUID"></param>
        /// <param name="updateCompanyDto"></param>
        /// <returns></returns>
        //PUT/Companies/id
        [HttpPatch("{CompanyGUID:Guid}", Name = "UpdateCompany")]
        [ProducesResponseType(StatusCodes.Status204NoContent)]
        [ProducesResponseType(StatusCodes.Status400BadRequest)]
        [ProducesResponseType(StatusCodes.Status404NotFound)] //Not found
        [ProducesResponseType(StatusCodes.Status500InternalServerError)]
        public async Task<IActionResult> UpdateCompany(Guid CompanyGUID, [FromBody] UpdateCompanyDto updateCompanyDto)
        {
            if (updateCompanyDto == null || updateCompanyDto.GUID != CompanyGUID)
            {
                return BadRequest(ModelState);
            }


            var _updateCompany = await _companyService.UpdateCompanyAsync(updateCompanyDto);

            if (_updateCompany.Success == false && _updateCompany.Message == "NotFound")
            {
                return Ok(_updateCompany);
            }

            if (_updateCompany.Success == false && _updateCompany.Message == "RepoError")
            {
                ModelState.AddModelError("", $"Some thing went wrong in respository layer when updating company {updateCompanyDto}");
                return StatusCode(500, ModelState);
            }

            if (_updateCompany.Success == false && _updateCompany.Message == "Error")
            {
                ModelState.AddModelError("", $"Some thing went wrong in service layer when updating company {updateCompanyDto}");
                return StatusCode(500, ModelState);
            }


            return Ok(_updateCompany);
        }

        /// <summary>
        /// Mark a record as deleted .
        /// </summary>
        /// <param name="CompanyGUID"></param>
        /// <returns></returns>
        //DELETE /companies/{id}
        [HttpDelete("{CompanyGUID:Guid}")]
        [ProducesResponseType(StatusCodes.Status204NoContent)]
        [ProducesResponseType(StatusCodes.Status404NotFound)] //Not found
        [ProducesResponseType(StatusCodes.Status409Conflict)] //Can not be removed 
        [ProducesResponseType(StatusCodes.Status500InternalServerError)]
        public async Task<IActionResult> DeleteCompany(Guid CompanyGUID)
        {

            var _deleteCompany = await _companyService.SoftDeleteCompanyAsync(CompanyGUID);


            if (_deleteCompany.Success == false && _deleteCompany.Data == "NotFound")
            {
                ModelState.AddModelError("", "Company Not found");
                return StatusCode(404, ModelState);
            }

            if (_deleteCompany.Success == false && _deleteCompany.Data == "RepoError")
            {
                ModelState.AddModelError("", $"Some thing went wrong in Repository when deleting company");
                return StatusCode(500, ModelState);
            }

            if (_deleteCompany.Success == false && _deleteCompany.Data == "Error")
            {
                ModelState.AddModelError("", $"Some thing went wrong in service layer when deleting company");
                return StatusCode(500, ModelState);
            }

            return NoContent();

        }
    }
}

이제 API를 실행하도록 하겠습니다.

응수
우리의 표에 아무런 기록이 없기 때문에, 우리는 빈 json 응답을 받았다.

기록을 추가합시다.

방금 추가한 그 레코드를 보여 주세요.

섹션 6에 두 번째 디렉터와 "실체 관계"기반 추가

좋은 웹페이지 즐겨찾기