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}")
}
Надеюсь это поможет.