我有.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,因为它应该是这样。 任何人都有主意。 谢谢
答案 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
中所述更改路由。