Apache Camel REST DSL 405方法不允许

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache Camel REST DSL 405方法不允许相关的知识,希望对你有一定的参考价值。

我目前正在使用Apache Camel开发一个REST应用程序(使用camel-spring),并且会产生一些令人困惑的行为。我在REST DSL中定义了一组端点,一些是对另一台服务器的代理请求,另一些则传递给我为数据聚合定义的路由。 DSL看起来如下:

<rest>
  <!-- Specific DSL requests -->
  <get uri="/v1/aggregate/data" consumes="application/json" produces="application/json">
    <to uri="direct:dataEnrichment" />
  </get>
  <get uri="/v1/customer/{custId}/devices" consumes="application/json" produces="application/json">
    <to uri="direct:getCustomerDevices" />
  </get>
  <get uri="/v1/login/{custId}" consumes="application/json" produces="application/json">
    <to uri="direct:getCustomer" />
  </get>
  <get uri="/v1/status" consumes="application/json" produces="application/json">
    <to uri="direct:statusInfo" />
  </get>

  <!-- Proxy requests -->
  <post uri="/v1?matchOnUriPrefix=true&amp;chunked=false">
    <to uri="direct:proxyOut" />
  </post>
  <get uri="/v1?matchOnUriPrefix=true&amp;chunked=false">
    <to uri="direct:proxyOut" />
  </get>
  <put uri="/v1?matchOnUriPrefix=true&amp;chunked=false">
    <to uri="direct:proxyOut" />
  </put>
  <delete uri="/v1?matchOnUriPrefix=true&amp;chunked=false">
    <to uri="direct:proxyOut" />
  </delete>
</rest>

我们的想法是,任何没有完全匹配URI的请求都会被代理到另一个系统(不是Apache Camel)。这节省了我不得不为另一个系统上的每个REST API编写一个定义(有很多)。

一切都运行良好,直到我在URI中添加了{custId}的两个请求。这些请求工作正常,但每次我尝试一个应该代理的URI,我得到405方法不允许。

编辑:我还应该提到我使用Jetty作为REST组件。 Camel独立运行,使用org.apache.camel.spring.Main启动它。我现在正在和Postman一起调用它,405响应似乎来自Jetty / Camel。

REST配置如下所示(安全处理程序正在使用Jetty BasicAuthenticator):

<restConfiguration contextPath="/mobilegateway/api" scheme="http"
  host="0.0.0.0" bindingMode="off"
  enableCORS="true"
  component="jetty" port="8079">
  <endpointProperty key="handlers" value="securityHandler" />
  <endpointProperty key="sessionSupport" value="true" />
  <endpointProperty key="httpClient.idleTimeout" value="30000" />

</restConfiguration>

代理请求所有发送到direct:proxyOut路由,如下所示:

<route id="proxyOutbound">
  <description>A simple outbound route to proxy REST requests.</description>
  <from uri="direct:proxyOut" />
  <removeHeaders pattern="Authorization" />
  <to
    uri="http://{{remoteAddress}}/data/json?bridgeEndpoint=true&amp;throwExceptionOnFailure=false" />
</route>

目的是在URI中的/ v1之后的所有内容都在代理请求中传递。我已经使用Wireshark检查了,请求没有被代理。如果我在路径中删除{custId}的路由,一切正常。

我做错了什么,或者这是骆驼/骆驼春天的错误?

答案

目前尚不清楚谁回来405,是你所代理的后端,还是根本不称之为后端。

但是,当您通过Camel代理HTTP时,您可能需要删除一些可能会干扰的CamelHttp*标头。

所以尝试添加

 <removeHeaders pattern="CamelHttp*" />
另一答案

骆驼虫,其详细信息可在此处找到:

https://issues.apache.org/jira/browse/CAMEL-11951

以上是关于Apache Camel REST DSL 405方法不允许的主要内容,如果未能解决你的问题,请参考以下文章

Camel Rest XML DSL分离文件夹结果Unmarshall Exception

使用状态码 405 获取 org.apache.camel.component.http.HttpOperationFailedException

如何在apache camel DSL或camel Processor内部设置其他身份验证属性?

Apache Camel使用spring DSL比较字符串与引号,如何逃脱?

如何在apache camel DSL中获得正确的https服务器响应?

Apache Camel 的 REST 端点