从为 TypeScript 客户端生成的 DTO 获取原始 ServiceStack 路由

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

我们在生产版本中遇到了一个问题,我们得到的 JSON 响应与生成的 TypeScript DTO 中描述的预期模型不同,同时获得了成功的状态代码。

在我们的案例中,作为一种解决方案,我们希望使用作为 OpenAPI 文档的一部分提供的 JSON 模式元数据(通常是

/openapi
端点)来验证 JSON 响应。文档包含以下路径所需的响应元数据:

openapi.paths[Route][HttpMethod].respones[StatusCode].schema

我们想要在运行时获取三个变量:

  • HTTP 方法 - 这一个明确指定
  • HTTP 响应状态代码 - 这可以作为最后一个状态代码从
    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,但如果可能的话,我们更喜欢更通用的方式。

什么将被视为解决问题的最佳实践?

http validation servicestack openapi
1个回答
0
投票

无法从生成的 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 元数据中填充的

© www.soinside.com 2019 - 2024. All rights reserved.