在 typescript 接口后面生成一个 http 客户端?可能吗?
Generating an http client behind a typescript interface? Is it possible?
我试图理解装饰器,它们不是 java 的注释,更像是函数的预处理器 in this article and I also found this SO question on setting info。假设我有一个像这样的界面
export default interface UserService {
@Path("/users/create")
@POST
createUser(user: CreateUserRequest): Promise<CreateUserResponse>;
@Path("/users/delete")
@POST
deleteUser(user: DeleteUserRequest): Promise<DeleteUserResponse>;
}
旁注:在 React UI 中使用此生成的客户端以及在 nodejs
中使用会很棒
我想要我的@Path 和@POST、@GET 来保存我能阅读和我认为的信息
class Path(path:string):
def __init__(self, path):
self.path = path
def __call__(self, func):
func.pathAnnotation = self
return func
我读到我无法循环访问接口中的方法,但我想生成实现此接口的 http 客户端,以便任何 API 开发人员创建,它会自动创建实现。 (在 java 中,我们使用 Proxy.java 来生成一个实现)。在服务器端,控制器实现了完全相同的 API,我喜欢生成 'scaffolding',这意味着如果可能的话要调用哪个端点的 http 请求(不确定我是否可以在 nodejs 中做到这一点)。
编辑:一个想法:也许,我创建了一个抽象 class 或 class,每个方法都会抛出一个异常“使用 XXXFactory 生成此 class 的实现”。如何在 class 中循环方法?我可以创建 classes 在运行时扩展所有这些 'apis' 以便我可以注入他供所有人使用(就像 java 世界中的 Proxy.java 一样)吗?
编辑:也许我可以在 java 脚本中用原型 class 以某种方式做到这一点......生成所有方法来调用带有签名的方法
Promise<Object> invoke(String method, object[] paramsToMethod);
然后,我可以查找该方法以及该方法的@Path 和@GET/@POST 属性。原型 class 可以扩展 java 脚本中的 class 以便任何 api 定义(可能在打字稿中定义)由这个 class 实现吗?然后我让每个 api 都像我们在 java 中所做的那样,为每个微服务用相同的代码实现? (这意味着平台团队可以交换协议,开发人员不再关心 http、http2、二进制等协议)
应要求,我花了一些时间来修补反思。反射主要用于使客户端自动符合服务期望的内容(类型 parameters/return 类型),我认为 reflect-metadata
.
可能是可能的
好的,所以我们的想法是让装饰器在映射中存储关于方法的元数据,其中键是 class,值是具有元数据的方法的集合。
然后在您获得客户端的地方,它将每个方法的所有元数据聚合到一个可以使用的函数中。
这是一个模糊的开始,但我认为它可以工作。如果我有时间,我实际上也可以把它变成一个小片段或库。
但实际上,这应该是一个静态生成的客户端,而不是动态的。因为这样验证和生成代码要容易得多。
我试图理解装饰器,它们不是 java 的注释,更像是函数的预处理器 in this article and I also found this SO question on setting info。假设我有一个像这样的界面
export default interface UserService {
@Path("/users/create")
@POST
createUser(user: CreateUserRequest): Promise<CreateUserResponse>;
@Path("/users/delete")
@POST
deleteUser(user: DeleteUserRequest): Promise<DeleteUserResponse>;
}
旁注:在 React UI 中使用此生成的客户端以及在 nodejs
中使用会很棒我想要我的@Path 和@POST、@GET 来保存我能阅读和我认为的信息
class Path(path:string):
def __init__(self, path):
self.path = path
def __call__(self, func):
func.pathAnnotation = self
return func
我读到我无法循环访问接口中的方法,但我想生成实现此接口的 http 客户端,以便任何 API 开发人员创建,它会自动创建实现。 (在 java 中,我们使用 Proxy.java 来生成一个实现)。在服务器端,控制器实现了完全相同的 API,我喜欢生成 'scaffolding',这意味着如果可能的话要调用哪个端点的 http 请求(不确定我是否可以在 nodejs 中做到这一点)。
编辑:一个想法:也许,我创建了一个抽象 class 或 class,每个方法都会抛出一个异常“使用 XXXFactory 生成此 class 的实现”。如何在 class 中循环方法?我可以创建 classes 在运行时扩展所有这些 'apis' 以便我可以注入他供所有人使用(就像 java 世界中的 Proxy.java 一样)吗?
编辑:也许我可以在 java 脚本中用原型 class 以某种方式做到这一点......生成所有方法来调用带有签名的方法
Promise<Object> invoke(String method, object[] paramsToMethod);
然后,我可以查找该方法以及该方法的@Path 和@GET/@POST 属性。原型 class 可以扩展 java 脚本中的 class 以便任何 api 定义(可能在打字稿中定义)由这个 class 实现吗?然后我让每个 api 都像我们在 java 中所做的那样,为每个微服务用相同的代码实现? (这意味着平台团队可以交换协议,开发人员不再关心 http、http2、二进制等协议)
应要求,我花了一些时间来修补反思。反射主要用于使客户端自动符合服务期望的内容(类型 parameters/return 类型),我认为 reflect-metadata
.
好的,所以我们的想法是让装饰器在映射中存储关于方法的元数据,其中键是 class,值是具有元数据的方法的集合。
然后在您获得客户端的地方,它将每个方法的所有元数据聚合到一个可以使用的函数中。
这是一个模糊的开始,但我认为它可以工作。如果我有时间,我实际上也可以把它变成一个小片段或库。
但实际上,这应该是一个静态生成的客户端,而不是动态的。因为这样验证和生成代码要容易得多。