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

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

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

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


person Knows Not Much    schedule 28.07.2016    source источник


Ответы (3)


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

Используйте конструктор Request и передайте Method.POST как method.

fetch(Request(Method.POST, uri))
person Dylan    schedule 28.07.2016
comment
Я узнал то же самое. Возможно, вам нужно выяснить, какая реализация запроса используется и как вы можете изменить тело для добавления данных. - person sascha10000; 28.07.2016

Версия https4s: 0.14.11

Трудная часть заключается в том, как установить тело сообщения. Когда вы погрузитесь в код, вы можете найти type EntityBody = Process[Task, ByteVector]. Но что это такое? Однако, если вы не готовы погрузиться в scalaz, просто используйте 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()
}

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

person sadhen    schedule 25.11.2016

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}")
  }

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

person Bharath    schedule 22.09.2016
comment
Разве это не серверный код? в приведенном выше коде вы принимаете запрос POST и читаете объект Name из запроса, а затем создаете ответ с именем Hello. Но мой вопрос на стороне клиента. - person Knows Not Much; 22.09.2016