Size: a a a

Scala User Group

2020 January 28

NV

Nikita Vilunov in Scala User Group
Renarde
всем привет! а кто-нибудь использует sttp для написания http-клиентов на Scala?
Да
источник

R

Renarde in Scala User Group
вопрос вот такой - есть вот такой клиент:

def get[O: Manifest](uri: Uri): O = {

   val response = requestWithHeaders
       .get(uri)
       .response(asJson[O])
       .send()


который получает класс и ссылку, идет на нее и декодит результат в Json
источник

R

Renarde in Scala User Group
хочется добавить обработку исключения, когда расшифровка Json не прошла (по каким-то причинам), и в лог был выброшен  raw body text
источник

R

Renarde in Scala User Group
я вот не очень понимаю как из response мне достать текст (обычным String), чтобы его в лог бросить
источник

λ

λλ in Scala User Group
Renarde
я вот не очень понимаю как из response мне достать текст (обычным String), чтобы его в лог бросить
response.body
    .leftMap(bodyError => new Throwable(s"body decoding error: $bodyError, status: ${response.code}"))
    .flatMap(decode[T])
источник

R

Renarde in Scala User Group
а мне пишет что нет метода leftMap у response.body (походу дело в том, что я использую sttp 2.0 версии?)
источник

λ

λλ in Scala User Group
Renarde
а мне пишет что нет метода leftMap у response.body (походу дело в том, что я использую sttp 2.0 версии?)
import cats.syntax.either._ну либо на ейзере фолд или матч сделай разница то
источник

R

Renarde in Scala User Group
λλ
import cats.syntax.either._ну либо на ейзере фолд или матч сделай разница то
а вот я как раз на left match хочу бросить не только эксепшен, но и исходный текст из body
источник

R

Renarde in Scala User Group
как-то так:

response.body match {
   case Left(error) => throw new Exception(s"${error.getMessage} with raw body: ${response.body.rawBody}")
}
источник

R

Renarde in Scala User Group
ну чтобы я потом понимал, что там прилетело из HTTP-response, почему парсинг не пошел
источник

R

Renarde in Scala User Group
(rawBody метода не существует, это я для примера)
источник

λ

λλ in Scala User Group
Renarde
ну чтобы я потом понимал, что там прилетело из HTTP-response, почему парсинг не пошел
у тебя слева ошибка вызова / справа твое сырое боди которое либо ты распарсишь либо нет если не распарсить то оттуда уже и пляши и пиши ошибку
источник

λ

λλ in Scala User Group
Renarde
ну чтобы я потом понимал, что там прилетело из HTTP-response, почему парсинг не пошел
response.body
    .leftMap(bodyError => new Throwable(s"body decoding error: $bodyError, status: ${response.code}"))
    .flatMap(body => decode[T](body).leftMap(error => new Throwable(error.getMessage + body)))`
источник

λ

λλ in Scala User Group
sttp тут не особо то причем
источник

R

Renarde in Scala User Group
λλ
у тебя слева ошибка вызова / справа твое сырое боди которое либо ты распарсишь либо нет если не распарсить то оттуда уже и пляши и пиши ошибку
Ага, теперь понял.
Ещё вопрос - у меня сейчас респонс обрабатывается в два шага:
Первый делает response.code match (либо 200 и все ок, либо не 200 и тогда бросаем экспешн), а затем парсим тело. Это принято в одну функцию сразу писать, или по очереди проверять?
источник

λ

λλ in Scala User Group
Renarde
Ага, теперь понял.
Ещё вопрос - у меня сейчас респонс обрабатывается в два шага:
Первый делает response.code match (либо 200 и все ок, либо не 200 и тогда бросаем экспешн), а затем парсим тело. Это принято в одну функцию сразу писать, или по очереди проверять?
Мне кажется если боди есть то итак 200
источник

λ

λλ in Scala User Group
Возможно я не прав
источник

Oℕ

Oleg ℕizhnik in Scala User Group
λλ
Возможно я не прав
не прав
источник

R

Renarde in Scala User Group
У нас иногда есть 500 с body, но на стороне клиента это все равно ошибка будет
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Renarde
Ага, теперь понял.
Ещё вопрос - у меня сейчас респонс обрабатывается в два шага:
Первый делает response.code match (либо 200 и все ок, либо не 200 и тогда бросаем экспешн), а затем парсим тело. Это принято в одну функцию сразу писать, или по очереди проверять?
лучше написать вспомогательную, которая проверит код и тип ответа
источник