我无法两次接收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。