【问题标题】:Nswag generates duplicate versions of get methodNswag 生成 get 方法的重复版本
【发布时间】:2020-05-02 22:45:45
【问题描述】:

我有 .net core web api 基础项目。我向它添加了招摇。现在我想生成打字稿客户端以在角度中使用它。我正在使用 NSwag 工作室。 API 如下所示:

public class ValuesController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        [HttpGet("{id}")]
        public ActionResult<string> Get(int id)
        {
            return "value";
        }

        // POST api/values
        [HttpPost]
        public void Post([FromBody] string value)
        {
        }

        // PUT api/values/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody] string value)
        {
        }

        // DELETE api/values/5
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }
    }

当我使用 NswagStudio 生成 typescript 客户端时,它会生成两个版本的 get 方法,由于不支持方法重载,导致 typescript 出错。我想为每个控制器生成客户端类,所以我设置了操作生成模式:“MultipleClientsFromPathSegments”。 生成的结果是:

export class ApiClient {
  valuesGet(): Observable<string[]> {}
 protected processValuesGet(response: HttpResponseBase): Observable<string[]>{}

valuesPost(value: string | null | undefined): Observable<void>{}
protected processValuesPost(response: HttpResponseBase): Observable<void>{}

valuesGet(id: number): Observable<string>{}
protected processValuesGet(response: HttpResponseBase): Observable<string>{}
}

我想生成第一个名称为“getAll”的 get,因为它应该是。 任何人都有想法。 谢谢

【问题讨论】:

    标签: angular typescript asp.net-core


    【解决方案1】:

    尝试将字符串传递给 HttpGet(这也会改变 url)

    // GET api/values
    [HttpGet("GetAll")]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "value1", "value2" };
    }
    

    【讨论】:

      【解决方案2】:

      您似乎正在使用基于路径的生成模式,例如“SingleClientFromPathSegments”。这种生成模式创建一个单一的打字稿文件并使用路径来命名函数。由于Get() 和Get(int id) 具有相同的路径,因此nswag 会生成两个具有相同名称的函数。这是一个问题,因为 typescript 不支持函数重载。

      选项 1:

      您可以使用不同的生成模式,例如“SingleClientFromOperationId”。此生成模式使用您的方法名称来生成打字稿函数。这应该会产生一个有效的打字稿文件,并且你的函数应该命名为values_Get() 和values_Get2()。要获得更具表现力的函数名称,您可以将 c# 方法 Get() 重命名为 GetAll()。这使您可以在 typescript 客户端中保留路由并获得富有表现力的函数名称。

      您可以使用 NSwagStudio 或通过文本编辑器编辑文件来更改 nswag.json 文件中的生成模式。在 NSwagStudio 中,此设置位于 Typscript 客户端设置中。在 nswag.json 文件中,该设置称为 'operationGenerationMode';

      您的控制器会这样:

      public class ValuesController : ControllerBase {
              // GET api/values
              [HttpGet]
              public ActionResult<IEnumerable<string>> GetAll(){
                  return new string[] { "value1", "value2" };
              }
      
              // GET api/values/5
              [HttpGet("{id}")]
              public ActionResult<string> Get(int id){
                  return "value";
              }
      
              // ...
      }
      

      选项 2:

      你可以像Quails4Eva'sanswer中提到的那样改变你的路由

      【讨论】:

        猜你喜欢
        • 2018-02-25
        • 2018-11-09
        • 1970-01-01
        • 2021-11-18
        • 1970-01-01
        • 1970-01-01
        • 2020-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多