Nswag生成get方法的重复版本

时间:2018-12-06 14:08:40

标签: angular typescript asp.net-core

我有.net核心Web api基本项目。我加了招摇。现在,我想生成Typescript客户端以在angular中使用它。我正在使用NSwag studio。 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方法,这会由于不支持方法重载而导致打字稿中出现错误。我想为每个控制器生成Client类,因此,我设置了操作生成模式:“ 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,因为它应该是这样。 任何人都有主意。 谢谢

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

选项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

中所述更改路由。