【问题标题】:How do I conditionally set status code in Project Reactor Netty HTTP Server?如何在 Project Reactor Netty HTTP Server 中有条件地设置状态码?
【发布时间】:2019-07-26 18:24:02
【问题描述】:

我怀疑我在这里遗漏了一些非常明显的东西,但我无法弄清楚如何使用 reactor-netty 中的 HttpServer 实现一个非常简单的用例。

本质上,我想实现在响应对象不为空时使用200 OK 响应以及在响应对象为空时使用404 Not Found 响应的能力。

我正在使用 Kotlin,并向 HttpServerResponse 添加扩展函数以将对象映射到 JSON:

fun <T> HttpServerResponse.sendObjectAsJson(obj: Mono<T?>, mapper: (T) -> JsonObject): NettyOutbound {
    val jsonString = obj.map { mapper(it!!) }.map { it.toString() }
    return this
       .status(OK)
       .header(CONTENT_TYPE, "application/json")
       .sendString(jsonString)
    }
}

如果源对象为空(由于使用it!!),此代码当前会中断。我真正想要实现的是切换响应状态代码,如果源对象为空,则不发送任何字符串内容。但是,我就是不知道如何根据Mono&lt;T?&gt;的内容来切换行为。

任何帮助将不胜感激!

【问题讨论】:

  • 我不使用 Kotlin,但作为翻译的猜测,您能否将函数中的第一行切换为 val jsonString = obj.map { it?.toString() },然后使用 .status(if (jsonString == null) OK else OTHER_STATUS_CODE) 作为状态码和 @987654328 @ 表示响应正文?
  • 感谢您的想法。问题 - 我没有很好地表达 - 你不能做你的第二行代码,因为 jsonString 将是一个 Mono 而不仅仅是一个字符串?这是我困惑的根源以及为什么似乎没有明显的方法

标签: netty project-reactor reactor-netty


【解决方案1】:

我设法用下面的代码解决了类似的问题

Mono<String> valueMono = Mono.from(...).doOnSuccess(s -> {
  if (s == null) {
    response.status(HttpResponseStatus.NOT_FOUND);
  }
});
return response.sendString(valueMono);

【讨论】:

    猜你喜欢
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 2018-09-26
    • 1970-01-01
    • 2020-07-05
    相关资源
    最近更新 更多