Настройка файлов cookie с помощью клиента Http4s

Я использую библиотеку Http4s для выполнения HTTP-вызовов к веб-службе REST. остальная веб-служба требует, чтобы я установил файл cookie аутентификации.

Я написал следующий код, чтобы установить этот файл cookie.

val client = PooledHttp1Client()
val uri = Uri.uri("http://localhost/restService")
val req = Request(GET, uri)
req.headers.put(`Content-Type`(MediaType.`application/json`))
val cookie = org.http4s.Cookie("foo_session", getLoginSessionId, domain = Some("localhost"), path=Some("/"))
req.headers.put(org.http4s.headers.Cookie(cookie))    
val task = client.expect[Response](req)
val list = task.run
list.response.foreach(println)
client.shutdownNow()

Когда я запускаю этот код, я получаю ошибку 401, означающую, что веб-служба не распознает, что файл cookie был установлен.

Теперь, если я пишу тот же код, используя Apache HTTP-клиент. тогда все работает нормально. Код ниже делает то же самое, что и выше.

  val get = new HttpGet(s"http://localhost/restService")
  get.setHeader("Content-type", "application/json")
  val client = new DefaultHttpClient()
  val respHandler = new BasicResponseHandler
  val cookieStore = new BasicCookieStore()
  val cookie1 = new BasicClientCookie("foo_session", getLoginSessionId)
  cookie1.setDomain("localhost")
  cookie1.setPath("/")
  cookieStore.addCookie(cookie1)
  val localContext = new BasicHttpContext()
  localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore)
  localContext
  val responseString = client.execute(get, respHandler, cookieContext)
  val list = parse(responseString).extract[Response]
  list.response.foreach(println)
  list.response

2 ответа

Похоже, ваш cookie не используется в ответе. Вы пробовали использовать следующий подход:

val cookie = org.http4s.ResponseCookie("token", su.token.getOrElse("No token"), httpOnly = true, secure = true)
Ok("resp").map(_.addCookie(cookie))

если вы хотите прикрепить сервер cookie, отправленный вашему клиенту, вы можете попробовать Cookie Jar. https://github.com/http4s/http4s/blob/main/client/src/main/scala/org/http4s/client/middleware/CookieJar.scala

Http4 строго проверяет cookie с сервера, поэтому есть вероятность, что на некоторые записи cookie не отвечают. если это так, вы можете попробовать это:https://github.com/chenharryhua/nanjin/blob/master/http/src/main/scala/com/github/chenharryhua/nanjin/http/client/middleware/CookieBox.scala

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