scala 从包含查询参数的URL字符串构造Tapir端点

9gm1akwq  于 2023-08-05  发布在  Scala
关注(0)|答案(1)|浏览(116)

我需要使用一个API,在响应中返回下一页的URL。我的代码是以一种我需要构造tapir端点来进行http调用的方式编写的。但是我没有看到一种方法可以将url字符串转换为EndpointInput。url包含查询参数,.in(string)似乎无法处理它。
将包含查询参数的URL字符串转换为Tapir EndpointInput的正确方法是什么?

iqjalb3h

iqjalb3h1#

我不认为Tapir是这样工作的。
如果检查docs,您将看到以下定义

声明式、类型安全的Web端点库。

简介

使用tapir,您可以将HTTP API端点描述为不可变的Scala值。每个端点可以包含多个输入和输出参数。
为什么是貘?

*类型安全:编译时保证,开发时完成,读时信息
*declarative:将端点的形状(“什么”)与服务器逻辑(“如何”)分开

项目目标

  • 基于case类、不可变和可重用的数据结构
  • 合理类型安全:只,和尽可能多的类型,以安全地生成服务器/客户端/文档

使用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

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-httpzio-httpVert.xOpenAPIAsyncAPI)在编译时scala代码生成客户端服务器文档
你也可以使用Generate Endpoint definitions from OpenAPI,但它同样在编译时工作。
你在问题中说:
我需要使用一个API,在其响应中返回下一页的URL
这意味着,在你的项目的某个部分会有类似的东西

val response = service.execute(params...)
val url = response.nextUrl
val result = client.sendRequest(url)


url在运行时返回,而tapir在编译时工作。
如果在编译时知道URL,可以使用一些解析器(也许使用正则表达式就足够了)。解析一个已知的字符串然后生成一个端点定义,这是没有任何意义的

相关问题