Как передать необязательные параметры при доступе к API веб-сервиса в игровой среде? - PullRequest
0 голосов
/ 10 октября 2019

Я новичок в фреймворке и пытаюсь интегрировать микросервис. Я использую WSClient для вызова веб-службы. Чтобы вызвать 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)
  )

Поэтому при вызове API службы отдыха возле ws.url(...)post(Map("userId" -> userData, ...)) компилятор жалуется на No implicits found for parameter evidence$2: BodyWritable[Map[String, Serializable]]

1 Ответ

1 голос
/ 11 октября 2019

Проблема в том, что Map вы переходите на post. Все записи, кроме одной, - (String, String), но последняя - (String, Option[String]).

. Теперь компилятор должен выяснить, каким может быть тип этой коллекции, и перейти к иерархии типов. Лучший тип, который он может выяснить - это Map[String, Serializable]. Потому что это самый узкий объект типа String и Option.

Это определение для post:

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

Вы можете видеть, что есть ограничение типа для T, котороеозначает, что вам нужен неявный конвертер * для тела, которое передается в post на BodyWritable. Вы можете найти неявные BodyWritables в DefaultBodyWritables . И нет BodyWritable[Map[String, Serializable]]. Но есть один для Map[String, String]

Вам нужно выбрать:

  1. Измените карту, чтобы она имела тип Map[String, String], либо предоставив значение по умолчанию для address через getOrElse или не добавляйте адрес на карту, если его нет.
  2. Напишите BodyWritable для карты [String, Serializable]. (Что может быть невозможно удовлетворительным образом)

Я предлагаю вам перейти с # 1.

*, пожалуйста, поправьте меня, если это неправильный термин для такого рода последствий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...