ktor两次收到json正文

时间:2019-12-16 19:44:41

标签: exception microservices ktor

我无法两次接收ktor HttpClient的json正文。 对于服务器,它具有DoubleReceive功能,但我看不到在进行客户呼叫时如何使用此功能。

我想调用其他微服务,该微服务要么返回一些json,要么在发生错误时返回例如状态500和错误说明json负载。

所以我尝试使用HttpResponseValidator,并且只允许使用此代码的readBytes

HttpResponseValidator {
validateResponse { response ->
  val statusCode = response.status.value
  val originCall = response.call

  if (statusCode < 300 || originCall.attributes.contains(ValidateMark)) return@validateResponse
  response.use {
    val exceptionCall = originCall.save().apply {
      attributes.put(ValidateMark, Unit)
    }
    //try parse error from json payload which other microservice usually send
    exceptionCall.response.receiveError()?.also { throw mapErrors(response, it) }
    //default ktor exception mapping
    when (statusCode) {
      in 300..399 -> throw RedirectResponseException(response)
      in 400..499 -> throw ClientRequestException(response)
      in 500..599 -> throw ServerResponseException(response)
    }
    if (statusCode >= 600) {
      throw ResponseException(response)
    }
  }
}

}

receiveError可以用作JacksonConfig.defaultMapper.readValue<ServiceErrorResponse>(this.readBytes()),但是如果您仅调用response.receive<ServiceErrorResponse>()则会抛出DoubleReceivException 原因是接收函数首先检查received atomicBoolean

TL; DR 现在,我想知道是否对如何处理错误有效载荷有任何想法,还是只是不使用它们?我是微服务新手,因此必须添加它们。 Ktor是一个新成员。您如何在服务之间传达错误信息?

还有一种方法可以在客户端中使用DoubleReceive功能。因为HttpClient(){install(DoubleReceive)}不起作用,因为它不是ApplicationFeature也不是ClientFeature。

0 个答案:

没有答案