当我试图从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
}
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的问题相同。此时我没有实现任何标准函数。 有人能给我一个关于这个函数的提示或示例代码吗?