【问题标题】:How to use PATCH method in CXF Client如何在 CXF 客户端中使用 PATCH 方法
【发布时间】:2015-11-19 15:40:32
【问题描述】:

我试图使用 CXF(版本 3.1.3)客户端通过 PATCH 方法调用 API。

尝试按照以下线程中指定的步骤但无法解决。 只获取 URLConnectionHttpConduit 而不是 AsyncHttpConduit

http://cxf.apache.org/docs/asynchronous-client-http-transport.html

How to use PATCH method in CXF

Verifying CXF HttpAsyncClient use of use.async.http.conduit contextual property

这里是sn-p的代码:

    Bus bus = BusFactory.getDefaultBus();
    // insist on the async connector to use PATCH.
    bus.setProperty(AsyncHTTPConduit.USE_ASYNC,  
AsyncHTTPConduitFactory.UseAsyncPolicy.ALWAYS);
    WebClient webClient = WebClient.create(request.getRestURL());
   WebClient.getConfig(webClient).getBus().setProperty
     (AsyncHTTPConduit.USE_ASYNC, AsyncHTTPConduitFactory.UseAsyncPolicy.ALWAYS);
   WebClient.getConfig(webClient).getRequestContext()
       .put(AsyncHTTPConduit.USE_ASYNC, AsyncHTTPConduitFactory.
       UseAsyncPolicy.ALWAYS);
    HTTPConduit conduit = (HTTPConduit)WebClient.getConfig(webClient)
                           .getConduit();
    System.out.println(conduit.getClass().getName());

    Response response = webClient.invoke(request.getMethod(), null);
    System.out.println("service response = "+ response); 

我什至尝试在 POST 请求中使用 X-HTTP-Method-Override=PATCH 标头,

其他端服务是使用 RestEasy 实现的,看起来好像不遵守 X-HTTP-Method-Override 标头。

你能帮我找到问题吗?

【问题讨论】:

  • 你使用的是正确版本的 jar 吗?发布 jar 版本并检查该类的源代码(如果有)。
  • 您是否根据帖子中引用的 SE 问题设置了属性 use.async.http.conduit 并正确添加了依赖项?
  • 是的,正如我已经提到的,我正在设置属性 AsyncHTTPConduit.USE_ASYNC (use.async.http.conduit) CXF Jar 版本 3.1.3,还添加了 hc jar 依赖项。
  • 我还尝试将属性值设置为不同的值,例如 TRUE 和 ALWAYS bus.setProperty(AsyncHTTPConduit.USE_ASYNC, AsyncHTTPConduitFactory.UseAsyncPolicy.ALWAYS);或 bus.setProperty(AsyncHTTPConduit.USE_ASYNC, Boolean.TRUE);

标签: java web-services jax-rs cxf http-patch


【解决方案1】:

当我们遇到类似问题时,我们使用了CloseableHttpAsyncClient,它工作正常。以下是示例代码供您参考:

IOReactorConfig ioReactorConfig = IOReactorConfig.custom().setIoThreadCount(10).build();
ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(ioReactorConfig);
PoolingNHttpClientConnectionManager cm = new PoolingNHttpClientConnectionManager(ioReactor);
cm.setMaxTotal(100);
cm.setDefaultMaxPerRoute(10);

RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(30000)
                .setSocketTimeout(30000).build();

CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
                .setConnectionManager(cm)
                .setConnectionManagerShared(false)
                .setDefaultRequestConfig(requestConfig)
                .build();
httpclient.start();

HttpPatch httpReq = new HttpPatch(url);
StringEntity entity = new StringEntity(json);
httpReq.setEntity(entity);

Future<HttpResponse> future = httpclient.execute(httpReq, context, null);
HttpResponse httpResponse = future.get();
HttpEntity responseEntity = httpResponse.getEntity();
String responseText = responseEntity != null ? EntityUtils.toString(responseEntity) : null;

您可以参考link了解更多详情。

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 2019-12-22
    • 2015-01-03
    • 1970-01-01
    相关资源
    最近更新 更多