Конечная точка HTTP Scalaj, для которой требуется тело в формате JSON - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь сделать POST-запрос, используя scalaj, но получаю следующую ошибку

{"code":40010000,"message":"request body format is invalid"} java.lang.Exception: HTTP ERROR: 400

Я пытаюсь получить доступ к API брокера Alpaca, чтобы сделать заказ, и мой код выглядит следующим образом

val response: HttpResponse[String] = Http(s"$endpoint/v2/orders").
  headers(Map(AlpacaInfo.key_header->key, AlpacaInfo.secret_header->secret)).
  params(Map("symbol"->symbol, "qty"->qty, "side"->side, "type"->`type`, "time_in_force"->time_in_force) ++ parameters).
  method("POST").asString

Мои запросы GET работают так, как задумано. У меня просто проблемы с POST. На обсуждении в Альпаке кто-то сказал, что это, вероятно, потому что кодировка не была JSON отформатирована. Как я могу это исправить / изменить?

PS Я новичок в вызовах API, поэтому вполне возможно, что этот вопрос не очень ясен, и я не знаю. Любая помощь приветствуется.

1 Ответ

1 голос
/ 03 мая 2020

Вместо params попробуйте postData метод, подобный этому

val body =
  s"""
     |{
     |  "symbol": "$symbol",
     |  "qty": $qty,
     |  "type": "$`type`",
     |  "time_in_force": "$time_in_force"
     |}
     |""".stripMargin


Http(...)
  .headers(...)
  .postData(body)
  .method("POST")
  .asString

Вместо использования необработанных строк для представления JSON, вы можете использовать соответствующую библиотеку JSON сериализации, например, upickle , и тогда тело может быть предоставлено так

import upickle.default._
case class MyModel(symbol: String, qty: Int, `type`: String, time_in_force: String)
implicit val configRW: ReadWriter[Config] = macroRW

Http(...)
  .postData(write(MyModel(...)))
...