当前位置: 首页 > 知识库问答 >
问题:

读取Vert.x http客户端响应正文时引发的IllegalStateException

梁丘扬
2023-03-14

当我试图从http客户端响应对象读取正文时,会出现以下错误。我并不总是得到异常,所以我想这是一个与完整未来相关的线程问题。你知道我做错了什么吗?我使用Vert.x3.8.1

java.lang.IllegalStateException
    at io.vertx.core.http.impl.HttpClientResponseImpl.checkEnded(HttpClientResponseImpl.java:134)
    at io.vertx.core.http.impl.HttpClientResponseImpl.endHandler(HttpClientResponseImpl.java:153)
    at io.vertx.core.http.impl.HttpClientResponseImpl.bodyHandler(HttpClientResponseImpl.java:193)
    at com.diagnostics.Response.body(Web.kt:116)
    at com.diagnostics.Response.bodyNow(Web.kt:111)
    at com.diagnostics.Response.bodyNow$default(Web.kt:110)
    at com.diagnostics.Main.postVerificationTest(Main.kt:73)
    at com.diagnostics.Main.main(Main.kt:52)
    at com.diagnostics.Main.main(Main.kt)

引发异常的代码:

val response = client.get(requestUri = "/api/info").get(3, TimeUnit.SECONDS)

val expectedStatus = 200
assertConditionOrExit(pvtLog, response.status == expectedStatus, "response status is ${response.status} expecting $expectedStatus")
val body = response.bodyNow()
assertConditionOrExit(pvtLog, body.isNotEmpty(), "body is empty expecting a non empty value")

http客户端响应对象由以下代码创建:

private fun request(
    method: HttpMethod,
    port: Int,
    host: String,
    requestUri: String
): CompletableFuture<Response> {
    val future = CompletableFuture<Response>()
    httpClient.request(method, port, host, requestUri)
        .exceptionHandler { future.completeExceptionally(it) }
        .handler { resp -> future.complete(Response(resp)) }
        .end()
    return future
}

尸体被找回...

fun bodyNow(timeout: Long = 10, unit: TimeUnit = SECONDS): String {
    return body().get(30000, SECONDS)
}

fun body(): CompletableFuture<String> {
    val future = CompletableFuture<String>()
    resp.bodyHandler { buff -> future.complete(buff.toString())}
    return future
}

共有1个答案

唐珂
2023-03-14

body()函数在request()方法调用HttpClientRequest处理程序后设置BodyHandler

因此,当主线程继续运行时,eventloop有可能接收内容并将其删除。如果内容很小,请求甚至可以在BodyHandler设置之前结束。

这就是为什么您只会时不时地看到异常

如果以后要设置BodyHandler,必须暂停HttpClientResponse:

httpClient.request(method, port, host, requestUri)
    .exceptionHandler { future.completeExceptionally(it) }
    .handler { resp -> 
        resp.pause() // Pause the response
        future.complete(Response(resp))
    }
    .end()

然后在设置BodyHandler后继续:

resp.bodyHandler { buff -> future.complete(buff.toString())}
resp.resume()
 类似资料:
  • 问题内容: 在移动应用程序和Web服务之间具有某种代理,发出发布请求时的响应使我们感到困惑。我们收到状态为200的回复:OK。但是我们找不到/提取JSON响应主体。 我们正在使用JAX-RS。有人可以提供一些提示来从服务器响应中提取JSON正文()吗? 问题答案: 试试这个: 编辑 感谢@Martin Spamer提及它仅适用于Jersey 1.x罐子。适用于Jersey 2.x

  • 只是想知道有没有办法得到spring Web-Flux的web客户端的响应时间?

  • 我正在从事RESTWeb服务项目,目前实际上在mozilla的rest客户端中(chrome://restclient/content/restclient.html)它将获取{“id”:“1234”}作为请求json,获取id的详细信息,并从数据库中提供id的所有详细信息,然后转换为json数组,最后将其存储在responsetoservice对象中。 当我点击服务url时,请求到达服务器,状态

  • 在移动应用程序和Web服务之间有某种代理,我们在发出发布请求时对响应感到困惑。我们收到状态为200: OK的响应。但是我们找不到/提取JSON响应正文。 我们正在使用JAX-RS。有人能提供一些提示,从服务器响应中提取JSON主体(

  • 问题内容: 在Java中,当HTTP结果为404范围时,此代码将引发异常: 就我而言,我碰巧知道内容是404,但无论如何我还是想阅读响应的内容。 (在我的实际情况下,响应代码为403,但是响应的主体说明了拒绝的原因,我希望向用户显示该原因。) 如何访问响应正文? 问题答案: 这是错误报告(关闭,无法修复,不是错误)。 他们的建议是这样编码:

  • 我正在尝试通过 tcp 连接远程执行程序,我想在客户端之间实时共享标准输出和标准输出 我有以下没有错误处理的测试服务器:p我知道,目前我无法执行带有参数的程序,但这很容易处理:) 你看,我尝试与 c.Write() 共享标准输出,但这不起作用。 我认为cmd.Stdin的另一个问题将与Stdout的问题相同。此时我没有实现任何标准函数。 有人能给我一个关于这个函数的提示或示例代码吗?