我有.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 ,就像它应该的那样。 任何人都有想法。 谢谢
您似乎正在使用基于路径的生成模式,例如“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
中提到的那样更改您的路由尝试将字符串传递给 HttpGet(这也会更改 url)
// GET api/values
[HttpGet("GetAll")]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { "value1", "value2" };
}
我也有同样的问题,通过更改NSwag配置中的操作生成模式可以解决。
操作生成模式是 NSwag 中的一个选项,它定义了如何根据 Swagger/OpenAPI 文档中给定的操作 ID 生成客户端方法。此选项有几个可能的值,但我指定了
SingleClientFromOperationId
来解决问题。此模式生成一个客户端类,其中包含操作 ID 中的所有方法。客户端名称由 className 选项指定,方法名称是操作 ID。这种模式可以避免方法名重复。
您可以在 NSwagStudio 中指定它,如下图所示: [在此输入图像描述][1] [1]:https://i.stack.imgur.com/UVhiF.png
或者你可以将其放入生成的 NSwag 配置文件中:
{
...
"codeGenerators": {
"openApiToTypeScriptClient": {
...
"operationGenerationMode": "SingleClientFromOperationId"
}
}