我需要使用一个API,在响应中返回下一页的URL。我的代码是以一种我需要构造tapir端点来进行http调用的方式编写的。但是我没有看到一种方法可以将url字符串转换为EndpointInput。url包含查询参数,.in(string)似乎无法处理它。将包含查询参数的URL字符串转换为Tapir EndpointInput的正确方法是什么?
EndpointInput
.in(string)
iqjalb3h1#
我不认为Tapir是这样工作的。如果检查docs,您将看到以下定义
声明式、类型安全的Web端点库。
使用tapir,您可以将HTTP API端点描述为不可变的Scala值。每个端点可以包含多个输入和输出参数。为什么是貘?
*类型安全:编译时保证,开发时完成,读时信息*declarative:将端点的形状(“什么”)与服务器逻辑(“如何”)分开
使用tapir构建的端点看起来像
val endpointDefinition: Endpoint = endpoint .delete. // EndpointInput.FixedMethod .in( // EndpointInput "api" // String ==> EndpointInput.FixedPath / // EndpointInput.Pair "v1" // String ==> EndpointInput.FixedPath / // EndpointInput.Pair "noun" // String ==> EndpointInput.FixedPath / path[Int] // EndpointInput.PathCapture ) .out( // EndpointOutput stringBody // EndpointIO.Body )
字符串所有的String s都将被转换为EndpointInput.FixedPath,因为有一个隐式的def stringToPath。然后您有案例类Endpoint
String
EndpointInput.FixedPath
case class Endpoint[SECURITY_INPUT, INPUT, ERROR_OUTPUT, OUTPUT, -R]( securityInput: EndpointInput[SECURITY_INPUT], input: EndpointInput[INPUT], errorOutput: EndpointOutput[ERROR_OUTPUT], output: EndpointOutput[OUTPUT], info: EndpointInfo ) extends EndpointInputsOps with // ...
型如您所见,您有Endpoint类,它是端点的定义,具有一些包含有关输入和输出信息的属性。in方法来自于trait EndpointInputsOps,它混合在Endpoint类中,这就是为什么你可以调用这个方法。在这里,您可以使用您需要的解释器(如akka-http、zio-http、Vert.x、OpenAPI、AsyncAPI)在编译时从scala代码生成客户端、服务器和文档。你也可以使用Generate Endpoint definitions from OpenAPI,但它同样在编译时工作。你在问题中说:我需要使用一个API,在其响应中返回下一页的URL这意味着,在你的项目的某个部分会有类似的东西
Endpoint
akka-http
zio-http
Vert.x
OpenAPI
AsyncAPI
val response = service.execute(params...) val url = response.nextUrl val result = client.sendRequest(url)
型url在运行时返回,而tapir在编译时工作。如果在编译时知道URL,可以使用一些解析器(也许使用正则表达式就足够了)。解析一个已知的字符串然后生成一个端点定义,这是没有任何意义的
1条答案
按热度按时间iqjalb3h1#
我不认为Tapir是这样工作的。
如果检查docs,您将看到以下定义
貘
声明式、类型安全的Web端点库。
简介
使用tapir,您可以将HTTP API端点描述为不可变的Scala值。每个端点可以包含多个输入和输出参数。
为什么是貘?
*类型安全:编译时保证,开发时完成,读时信息
*declarative:将端点的形状(“什么”)与服务器逻辑(“如何”)分开
项目目标
使用tapir构建的端点看起来像
字符串
所有的
String
s都将被转换为EndpointInput.FixedPath
,因为有一个隐式的def stringToPath。然后您有案例类Endpoint
型
如您所见,您有
Endpoint
类,它是端点的定义,具有一些包含有关输入和输出信息的属性。in方法来自于trait EndpointInputsOps,它混合在Endpoint
类中,这就是为什么你可以调用这个方法。在这里,您可以使用您需要的解释器(如
akka-http
、zio-http
、Vert.x
、OpenAPI
、AsyncAPI
)在编译时从scala代码生成客户端、服务器和文档。你也可以使用Generate Endpoint definitions from OpenAPI,但它同样在编译时工作。
你在问题中说:
我需要使用一个API,在其响应中返回下一页的URL
这意味着,在你的项目的某个部分会有类似的东西
型
url在运行时返回,而tapir在编译时工作。
如果在编译时知道URL,可以使用一些解析器(也许使用正则表达式就足够了)。解析一个已知的字符串然后生成一个端点定义,这是没有任何意义的