NSwag에서 Build 를 사용할 경우 client 측 Swagger 가 자동으로 생성됩니다.

17970 단어 .NETCoreC#
개시하다
이 보도는 부지런한 커피이다
원두커피 추가 달력 Advent Calendar 2021,15일째 보도
이쪽 커뮤니티에서는 예전에 C#의 코딩 생성기였던 NSwag에 대한 소개가 있었거든요.
그 당시의 내용을 기사에 간략하게 쓰도록 하겠습니다.
NSwag 정보
C# 코드 생성기에서 API Controler의 내용을 기준으로
Swagger 코드를 자동으로 생성

사용할 라이브러리
  • NSwag Asp.NET core(NSwag 호스트)
  • NSwag MSBuild(Build 시 NSwag 실행에 필요함)
  • 생성된 코드 정보
    NSwag에서는 디렉터 생성 OpenAPI에 대한 설명서를 볼 수 있습니다.
    예를 들어 다음과 같은 Controller가 있는 경우
    
    namespace NSwag_app.Controllers
    {
        [ApiController]
        public class TestController : Controller
        {
            [HttpGet]
            [Route("[controller]")]
            public TestArray Test()
            {
                return new TestArray();
            }
        }
    
        public class Test
        {   
            public string test{ get; set; }
        }
    
        public class TestArray
        {
            public Test[] tests { get; set; }
        }
    }
    
    다음 json 파일을 출력합니다
         "/Test": {
            "get": {
              "tags": [
                "Test"
              ],
              "operationId": "Test_Test",
              "responses": {
                "200": {
                  "description": "",
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/TestArray"
                      }
                    }
                  }
                }
              }
            }
          },
    
    NSwag에서 Swagger 자동 생성
    Swagger 생성 방법은 nswag 입니다.json으로 관리
    프로젝트 설정은 여러 방면에 관련되어 있어서 하나하나 확인하기가 매우 어렵다
    NSwag Studio GUI를 통해 설정할 수 있는 도구가 있으므로
    여기서 설정하면 프로필을 내보내는 것이 빠르지 않습니까
    TypeScripts를 통해 출력을 설정할 때
    다음ts파일 내보내기
    .ts
    export class TestApiFactory {
        private instance: AxiosInstance;
        private baseUrl: string;
        protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;
    
        constructor(baseUrl?: string, instance?: AxiosInstance) {
            this.instance = instance ? instance : axios.create();
            this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : "";
        }
    
        test(  cancelToken?: CancelToken | undefined): Promise<TestArray> {
            let url_ = this.baseUrl + "/Test";
            url_ = url_.replace(/[?&]$/, "");
    
            let options_ = <AxiosRequestConfig>{
                method: "GET",
                url: url_,
                headers: {
                    "Accept": "application/json"
                },
                cancelToken
            };
    
            return this.instance.request(options_).catch((_error: any) => {
                if (isAxiosError(_error) && _error.response) {
                    return _error.response;
                } else {
                    throw _error;
                }
            }).then((_response: AxiosResponse) => {
                return this.processTest(_response);
            });
        }
    
        protected processTest(response: AxiosResponse): Promise<TestArray> {
            const status = response.status;
            let _headers: any = {};
            if (response.headers && typeof response.headers === "object") {
                for (let k in response.headers) {
                    if (response.headers.hasOwnProperty(k)) {
                        _headers[k] = response.headers[k];
                    }
                }
            }
            if (status === 200) {
                const _responseText = response.data;
                let result200: any = null;
                let resultData200  = _responseText;
                result200 = TestArray.fromJS(resultData200);
                return result200;
            } else if (status !== 200 && status !== 204) {
                const _responseText = response.data;
                return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            }
            return Promise.resolve<TestArray>(<any>null);
        }
    }
    
    
    또한 API의 매개변수 또는 반환 값이 모델로 정의된 경우
    모델도 같이 하고.
    export interface ITest {
        test?: string;
    }
    
    Build 때는 NSwag 뛰어야 돼요.
    NSwag MSBuild 설치 시 NSwag 실행
    기본적으로 프로젝트 파일에서 다음과 같은 방식으로 쓰면 된다
    프로젝트에 맞춰 Version을 교체하십시오.
    
      <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="3.1.16" />
        <PackageReference Include="NSwag.AspNetCore" Version="13.13.2" />
        <PackageReference Include="NSwag.MSBuild" Version="13.13.2">
          <PrivateAssets>all</PrivateAssets>
          <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
      </ItemGroup>
    
    끝맺다
    전면과 후면이 완전히 분리된 시스템이라면
    API의 사양 변경은 플리온으로 수정할 수 없습니다.
    가끔 버그가 발생하지만 유지보수를 수정해도 곤란합니다
    NSwag 같은 코드 발생기를 사용하는 경우
    Swagger를 자동으로 수정할 수 있으며 컴파일 오류로 인해 호출 부분의 오류를 알려 줍니다.
    꼭 한번 써보는 게 좋지 않을까.

    좋은 웹페이지 즐겨찾기