为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Play 框架中访问 Web 服务 API 时传递可选参数?

如何在 Play 框架中访问 Web 服务 API 时传递可选参数?

ABOUTYOU 2023-10-13 15:07:30
我是框架新手,正在尝试集成微服务。我正在使用 WSClient 来调用 Web 服务。为了调用 POST Rest API,我传递了请求正文,其中包含一些必需参数和一些可选参数。我的问题是如何在这里传递可选参数?我的代码示例是def add = Action.async { implicit request =>    UserDataForm.bindFromRequest.fold(      profileForm => {        val response = profileForm.errorsAsJson        Future(BadRequest(response).as("application/json"))      },      userData => try {        ws.url("http://localhost:9000/" + "api/profile")          .post(            Map("userId" -> userData.userId, "firstName" -> userData.firstName, "lastName" -> userData.lastName, "country" -> userData.country, "address" -> userData.address)).map { response =>          OutputWithErrors(response.body, response.status)        }      } catch {        case e: Exception =>          Future(BadRequest(Message(false, e.getMessage).toJson.prettyPrint).as("application/json"))      })  }所以这里address是可选参数。userData并在此处形成数据case class UserForm(userId: String, firstName: String, lastName: String, country: String, address: Option[String])  val UserDataForm = Form(    mapping(      "userId" -> nonEmptyText,      "firstName" -> nonEmptyText,      "lastName" -> nonEmptyText,      "country" -> nonEmptyText,      "address" -> optional(text)    )(UserForm.apply)(UserForm.unapply)  )因此,在ws.url(...)post(Map("userId" -> userData, ...))编译器附近调用休息服务 API 时会抱怨No implicits found for parameter evidence$2: BodyWritable[Map[String, Serializable]]
查看完整描述

1 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

这里的问题是Map你要传递给post. 除一项外,所有项均为(String, String),但最后一项为(String, Option[String])

编译器现在必须弄清楚该集合的类型可能是什么,并沿着类型层次结构向上移动。它能找出的最佳类型是Map[String, Serializable]. 因为这是最窄的超类型 String 和 Option 实现。

这是帖子的定义:

def post[T: BodyWritable](body: T): Future[Response]

您可以看到 T 上存在类型约束,这意味着您需要一个隐式转换器*来用于传递到 post to 的主体BodyWritable。您可以在DefaultBodyWritables中找到隐式 BodyWritables 。并且没有BodyWritable[Map[String, Serializable]]。但有一个是为了Map[String, String]

你必须选择:

  1. 更改 Map,使其具有 的类型,可以通过为viaMap[String, String]提供默认值,或者如果地址为 None,则不向地图添加地址。addressgetOrElse

  2. 为 Map[String, Serialized] 编写一个 BodyWritable。(这可能无法以令人满意的方式实现)

我建议你选择#1。

* 如果这不是此类隐式的正确术语,请纠正我。


查看完整回答
反对 回复 2023-10-13
  • 1 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信