https4s, как сделать POST-вызов веб-службы REST

Я пытаюсь использовать библиотеку http4s. Я пытаюсь сделать POST-запрос к веб-сервису REST с некоторой полезной нагрузкой json.

когда я читаю документацию http://http4s.org/docs/0.15/ я вижу только пример метода GET.

Кто-нибудь знает, как сделать POST?

3 ответа

Решение

Похоже, get/getAs методы, упомянутые в примере, являются просто удобными обертками для fetch метод. См. https://github.com/http4s/http4s/blob/a4b52b042338ab35d89d260e0bcb39ccec1f1947/client/src/main/scala/org/http4s/client/Client.scala

Использовать Request конструктор и пас Method.POST как method,

fetch(Request(Method.POST, uri))

Версия https4s: 0.14.11

Сложная часть заключается в том, как установить тело сообщения. Когда вы погрузитесь в код, вы можете найти type EntityBody = Process[Task, ByteVector], Но что это такое? Однако, если вы еще не готовы погрузиться в скаляр, просто используйте withBody,

object Client extends App {
  val client = PooledHttp1Client()
  val httpize = Uri.uri("http://httpize.herokuapp.com")

  def post() = {
    val req = Request(method = Method.POST, uri = httpize / "post").withBody("hello")
    val task = client.expect[String](req)
    val x = task.unsafePerformSync
    println(x)
  }

  post()
  client.shutdownNow()
}

PS мой полезный пост о клиенте http4s (просто пропустите китайский и прочтите код scala): http://sadhen.com/blog/2016/11/27/http4s-client-intro.html

import org.http4s.circe._
import org.http4s.dsl._
import io.circe.generic.auto._      

case class Name(name: String)

  implicit val nameDecoder: EntityDecoder[Name] = jsonOf[Name]

  def routes: PartialFunction[Request, Task[Response]] = {
     case req @ POST -> Root / "hello" =>
     req.decode[Name] { name =>
     Ok(s"Hello, ${name.name}")
  }

Надеюсь это поможет.

Другие вопросы по тегам