我们在生产版本中遇到了一个问题,我们得到的 JSON 响应与生成的 TypeScript DTO 中描述的预期模型不同,同时获得了成功的状态代码。
在我们的案例中,作为一种解决方案,我们希望使用作为 OpenAPI 文档的一部分提供的 JSON 模式元数据(通常是
/openapi
端点)来验证 JSON 响应。文档包含以下路径所需的响应元数据:
openapi.paths[Route][HttpMethod].respones[StatusCode].schema
我们想要在运行时获取三个变量:
client.responseFilter
作为示例,让我们使用以下 DTO:
[Route("/api20/data", "GET")]
public class GetData20
{
public string Id { get; set; }
public string Name { get; set; }
}
我们想要获得
RouteAttribute
中描述的路线。
深入
JsonServiceClient
实现表明没有用于获取路线的 API。客户端本身依赖于/json/reply/nameof(TResponse)
路由,其中nameof(TResponse)
是DTO构造函数名称。
生成的 DTO 文件仅包含路由作为 JS 装饰器格式的注释。如果可以启用某些功能使其成为真正的装饰器,那将使用路由数据扩展结果对象——这将是一种可能的解决方案。
.NET
TypeScriptGenerator
允许我们为生成的 DTO 添加任何 TypeScript 代码——这也可以用作解决方案。
作为一个明显的解决方案,我们可以为每个请求指定路由以及请求 DTO,但如果可能的话,我们更喜欢更通用的方式。
什么将被视为解决问题的最佳实践?
无法从生成的 DTO 以编程方式访问路由信息,您需要从 API 元数据中解析它,您可以从
/metadata/app.json
的 App 元数据中解析它,例如:
可从
/api/operations[op]/routes
获得
如果您启用了
OpenApiFeature
,您可以从/openapi
json 端点解析它,例如:
你可以解析嵌入在
/types/typescript
注释中的路由信息,它被注释在每个请求DTO上,例如:
// @Route("/orders")
// @Route("/orders/page/{Page}")
// @Route("/customers/{CustomerId}/orders", "GET")
export class GetOrders implements IReturn<OrdersResponse>, IGet
{
public page?: number;
public customerId: string;
public constructor(init?: Partial<GetOrders>) { (Object as any).assign(this, init); }
public getTypeName() { return 'GetOrders'; }
public getMethod() { return 'GET'; }
public createResponse() { return new OrdersResponse(); }
}
有效地通过扫描// @Route
,解析与
export class <RequestDTO>
中后续请求DTO关联的路由信息。否则,您可以返回一个自定义 API,其中包含您想要的格式的信息,这些信息是从
HostContext.Metadata
.内部维护的 API 元数据中填充的