Nswag 生成 get 方法的重复版本

问题描述 投票:0回答:3

我有.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 生成打字稿客户端时,它会生成两个版本的 get 方法,这会导致打字稿中出现错误,因为不支持方法重载。我想为每个控制器生成客户端类,因此我设置操作生成模式:“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
3个回答
1
投票

您似乎正在使用基于路径的生成模式,例如“SingleClientFromPathSegments”。这种生成模式创建一个单一的打字稿文件并使用路径来命名函数。由于

Get()
Get(int id)
具有相同的路径,因此 nswag 会生成两个具有相同名称的函数。这是一个问题,因为 Typescript 不支持函数重载。

选项1:

您可以使用不同的生成模式,例如“SingleClientFromOperationId”。此生成模式使用方法的名称来生成打字稿函数。这应该会生成一个有效的打字稿文件,并且您的函数应命名为

values_Get()
values_Get2()
。要获得更具表现力的函数名称,您可以将 c# 方法
Get()
重命名为
GetAll()
。这允许您保留路线并在打字稿客户端中获取富有表现力的函数名称。

您可以使用 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's answer

中提到的那样更改您的路由

1
投票

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

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

0
投票

我也有同样的问题,通过更改NSwag配置中的操作生成模式可以解决。

操作生成模式是 NSwag 中的一个选项,它定义了如何根据 Swagger/OpenAPI 文档中给定的操作 ID 生成客户端方法。此选项有几个可能的值,但我指定了

SingleClientFromOperationId
来解决问题。此模式生成一个客户端类,其中包含操作 ID 中的所有方法。客户端名称由 className 选项指定,方法名称是操作 ID。这种模式可以避免方法名重复。

您可以在 NSwagStudio 中指定它,如下图所示: [在此输入图像描述][1] [1]:https://i.stack.imgur.com/UVhiF.png

或者你可以将其放入生成的 NSwag 配置文件中:

{
  ...
  "codeGenerators": {
    "openApiToTypeScriptClient": {
      ...
      "operationGenerationMode": "SingleClientFromOperationId"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.