我相信JAX-RS 2.0规范中没有任何内容表明实现javax.ws.rs.client.Invocation的实例必须可执行多次,我正在寻找对此信念的确认或更正。我希望能够通过JAX-RS 2.0客户端API执行HTTP调用,并且能够在第一次调用以特定方式失败时再次调用完全相同的调用。
我注意到Bill Burke(https://books.google.com/books?id=wzkYAgAAQBAJ&pg=PA121)使用JAX-RS 2.0的RESTful Java的第121页确实说明了同一个Invocation对象可以用于多个请求。只需预先构建您的Invocation实例并根据需要重用它们。"虽然这让我有信心重用Invocation实例将与RESTEasy一起使用,但我需要确信Invocation对象可以在任何符合JAX-RS 2.0的实现中重用。
但是,查看Jersey v2.22.1的源代码,在我看来,Invocation无法可靠地重用,因为ClientRequestContext是可变的,并且不会为每次执行Invocation实例而复制;我认为这意味着它可以通过一个请求中的过滤器进行变异,然后后续执行将无法提供准确的ClientRequestContext。不过,我可能会误解这一点。
假设我不能以保证在多个JAX RS实现中工作的方式多次执行调用(通过invoke()或submit()调用)(例如,它必须在Jersey中运行,RESTEasy等等) - 那么我认为最接近的是Invocation.Builder的一个实例。不幸的是,Invocation.Builder并没有让我一路走到那里,因为它不支持将方法与可选的实体主体相关联。如果我想多次调用一个请求,我至少需要Invocation.Builder实例加上方法和可选实体。
我正在寻找一种方法,以规范支持的方式使用JAX-RS 2.0定义可重复请求,因此可以跨实现兼容 - 类似于Invocation(与Invocation.Builder不同)方法和与之相关的实体()),但可重复。
我有关于如何绕过限制的想法(假设我是正确的,它是一个),但我宁愿不必那样做。这实际上是JAX RS 2.0规范的限制吗?