标签: http4s-circe

带有Http4的Circe编码器和解码器

我正在尝试使用http4s,circe和http4s-circe.

下面我试图使用circe的自动派生功能.

import org.http4s.client.blaze.SimpleHttp1Client
import org.http4s.Status.ResponseClass.Successful
import io.circe.syntax._
import org.http4s._
import org.http4s.headers._
import org.http4s.circe._
import scalaz.concurrent.Task
import io.circe._

final case class Login(username: String, password: String)
final case class Token(token: String)

object JsonHelpers {
   import io.circe.generic.auto._
   implicit val loginEntityEncoder : EntityEncoder[Login] = jsonEncoderOf[Login]
   implicit val loginEntityDecoder : EntityDecoder[Login] = jsonOf[Login]
   implicit val tokenEntityEncoder: EntityEncoder[Token] = jsonEncoderOf[Token]
   implicit val tokenEntityDecoder : EntityDecoder[Token] = jsonOf[Token]
}

object Http4sTest2 extends App {
   import JsonHelpers._
   val url = "http://"
   val uri = Uri.fromString(url).valueOr(throw _)
   val …
Run Code Online (Sandbox Code Playgroud)

scala circe http4s http4s-circe

5
推荐指数
1
解决办法
2427
查看次数

Scala:http4s给予401 Unauthorized相同的请求,可以在curl/requests中使用

我尝试使用以下代码http4s v0.19.0:

import cats.effect._

def usingHttp4s(uri: String, bearerToken: String)(implicit cs: ContextShift[IO]): String = {
    import scala.concurrent.ExecutionContext
    import org.http4s.client.dsl.io._
    import org.http4s.headers._
    import org.http4s.Method._
    import org.http4s._
    import org.http4s.client._


    import org.http4s.client.middleware._

    val blockingEC = ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(5))

    val middlewares = Seq(
      RequestLogger[IO](logHeaders = true, logBody = true, redactHeadersWhen = _ => false)(_),
      FollowRedirect[IO](maxRedirects = 5)(_)
    )

    val client = middlewares.foldRight(JavaNetClientBuilder(blockingEC).create[IO])(_.apply(_))

    val req = GET(
      Uri.unsafeFromString(uri),
      Authorization(Credentials.Token(AuthScheme.Bearer, bearerToken))
    )
    client.expect[String](req).unsafeRunSync()
  }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

[error] (run-main-0) org.http4s.client.UnexpectedStatus: unexpected HTTP status: 401 Unauthorized
[error] org.http4s.client.UnexpectedStatus: unexpected HTTP …
Run Code Online (Sandbox Code Playgroud)

curl scala http4s http4s-circe cats-effect

5
推荐指数
1
解决办法
520
查看次数

Http4s Client Encode Entity as x-www-form-urlencoded Recursively

I have a request like the following

val request =
    Request[IO](
      method = POST,
      uri = Uri.uri("..."),
      headers = Headers(
        Authorization(BasicCredentials("...", "..."))
      )
    )
    .withEntity(PaymentIntentRequest2(2000, "usd"))
Run Code Online (Sandbox Code Playgroud)

我正在查看源代码,看起来它withEntity继承了嵌套的标头EntityDecoder,因此上面的代码默认为Content-Type: application/json. 好像我明确地传递UrlForm一切都很好。

不幸的是,我所点击的 API 预期数据为,x-www-form-urlencoded并且考虑到目标 API 与所有不同端点/请求的复杂性,我希望找到一种将给定案例类编码为表单的方法。最好的方法是什么?

我努力了:

  1. 显式指定Content-Type但这不起作用,因为继承类型优先

  2. Product构建从到 的隐式泛型转换UrlForm(目前是扩展方法)

implicit class UrlFormEncode[+B <: Product](val u: B) {
    def asUrlForm: UrlForm =
      u.productElementNames
        .zip(u.productIterator)
        .foldLeft(UrlForm()) { (a, b) =>
          a.combine(UrlForm(b._1 -> b._2.toString))
        }
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是 …

scala circe http4s http4s-circe

5
推荐指数
1
解决办法
1211
查看次数

将json正文添加到http4s请求

这个tut展示了如何创建一个http4s请求:https://http4s.org/v0.18/dsl/#testing-the-service

我想将此请求更改为POST方法并使用circe添加文字json正文.我尝试了以下代码:

val body = json"""{"hello":"world"}"""
val req = Request[IO](method = Method.POST, uri = Uri.uri("/"), body = body)
Run Code Online (Sandbox Code Playgroud)

这给了我一个类型不匹配的错误:

[error]  found   : io.circe.Json
[error]  required: org.http4s.EntityBody[cats.effect.IO]
[error]     (which expands to)  fs2.Stream[cats.effect.IO,Byte]
[error]     val entity: EntityBody[IO] = body
Run Code Online (Sandbox Code Playgroud)

我理解错误,但我无法弄清楚如何转换io.circe.JsonEntityBody.我见过的大多数例子都使用了一个EntityEncoder,它没有提供所需的类型.

我怎样才能转换io.circe.JsonEntityBody

scala http4s http4s-circe

4
推荐指数
2
解决办法
2458
查看次数

如何使用 Circe 解码包含 json 的数组

我的 circe 解码器如下所示。我确信我的情感解码器可以正常工作,因此下面不会包含它。

case class CryptoData(value: String, valueClassification: Sentiment)
Run Code Online (Sandbox Code Playgroud)
  implicit val decoder: Decoder[CryptoData] = Decoder.instance { json =>
    for {
      value               <- json.downField("data").get[String]("value")
      valueClassification <- json.downField("data").get[Sentiment]("value_classification")
    } yield CryptoData(value, valueClassification)
  }
Run Code Online (Sandbox Code Playgroud)

我的 Json 看起来像这样

{
  "name" : "Fear and Greed Index",
  "data" : [
    {
      "value" : "31",
      "value_classification" : "Fear",
      "timestamp" : "1631318400",
      "time_until_update" : "54330"
    }
  ],
  "metadata" : {
    "error" : null
  }
}
Run Code Online (Sandbox Code Playgroud)

我只是想要valuevalue_classification。可以看出,这些值位于一个数组中。

我怀疑 Circe 正在寻找解码 aList[data]但我不想创建 acase …

json scala circe http4s-circe circe-optics

1
推荐指数
1
解决办法
607
查看次数

需要帮助使用 Circe 解码以下 json

我正在尝试使用 Circe 库解析嵌套的 JSON 对象。我想将它映射到忽略某些字段的平面案例类。

import io.circe.generic.auto._
import io.circe.{Decoder, Encoder, HCursor, Json}

val jsonString = """{
  "parent" : {
    "name" : "title",
    "items" : [
      {
        "foo" : "",
        "attrs" : {
          "attrA" : "",
          "attrB" : ""
        }
      },
      {
        "foo" : "",
        "attrs" : {
          "attrA" : "",
          "attrB" : "",
          "attrC" : ""
        }
      }]
    }
}"""


// Notice I don't care about "attrC"
case class Item(foo: String, attrA: String, attrB: String)
case class Parent(name: String, items: …
Run Code Online (Sandbox Code Playgroud)

scala circe http4s-circe

0
推荐指数
1
解决办法
2831
查看次数

标签 统计

http4s-circe ×6

scala ×6

circe ×4

http4s ×4

cats-effect ×1

circe-optics ×1

curl ×1

json ×1