2017-10-25 22 views
3

現在、Apache Camel(camel-springを使用)でRESTアプリケーションを開発していて、混乱しています。私はREST DSLで定義された一連のエンドポイントを持っていますが、いくつかは単に別のサーバーへのプロキシ要求であり、他のものはデータ集約のために定義したルートに渡されます。次のようにDSLに見える:Apache Camel REST DSL 405メソッドが許可されていません

<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のキャメルではない)別のシステムに介してプロキシを受けるということです。これにより、他のシステム上のすべてのREST APIの定義を書く必要がなくなります(多くあります)。

URIに{custId}の2つのリクエストを追加するまで、すべてうまくいっていました。これらのリクエストはうまくいきますが、プロキシを取得するURIを試行するたびに、405 Method Not Allowedが取得されます。

EDIT: 私は、JettyをRESTコンポーネントとして使用しているとも言及しておきます。 Camelはorg.apache.camel.spring.Mainを使用してスタンドアロンで実行しています。私はこの段階でPostmanと呼んでいますが、405の応答はJetty/Camelから来ているようです。

は、RESTの構成は(セキュリティハンドラは、桟橋BasicAuthenticatorはを使用している)次のようになります。

<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> 
:次のようになりますproxyOutルート、:

<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> 

プロキシはすべて、ダイレクトに送信要求します

URIの/ v1の後のすべてがプロキシされた要求に渡されることを意図しています。私はWiresharkを使って確認しましたが、リクエストはプロキシされていません。パス内の{custId}でルートを削除すると、すべて正常に動作します。

私は何か間違っているのですか、これはラクダ/ラクダスプリングのバグですか?

+0

誰もが私も言及している必要があります –

+0

を助けることができる前に、あなたの質問に詳細を追加します。私は残りのコンポーネントとしてJettyを使用しています。 Camelはorg.apache.camel.spring.Mainを使用してスタンドアロンで実行しています。 –

+0

他の情報がありますか?ありがとう。 –

答えて

0

誰が405を返すのかはっきりしません。あなたが呼び出すプロキシのバックエンドか、そのバックエンドをまったく呼び出さないのですか?

しかし、Camel経由でHTTPをプロキシするときは、妨害を受ける可能性のあるCamelHttp*ヘッダーを削除する必要があります。

ので

<removeHeaders pattern="CamelHttp*" /> 
+0

こんにちはクラウス、私に戻ってくれてありがとう。私はこれを試みましたが、それは違いはありませんでした。 405の応答は、要求がプロキシルートを通過していないため、ラクダから来ています(私はWiresharkのトレースを確認しました)。 パスに{custId}が含まれている2つの「取得」要求を削除すると、残りの要求(プロキシ要求を含む)はうまく動作します。 –

+0

ソースコードを少し見て、デバッグトレースを少し行った後、私は問題を発見したと思います。それはHttpServletResolveConsumerStrategy.resolve(30行目〜52行目、リリース2.20.0)にまでわかります。ワイルドカードURIが定義されているため、これになります。それはURIと一致しますが、要求の種類と一致するものは何も行いません。私は、同じURIを持つ複数のエンドポイントを持っていますが、要求タイプは異なります。 –

+0

私はGETリクエストを送信していますが、最初はPUT候補と一致しています。 CamelContinuationServlet.doService(111〜125行目)でこれが後でチェックされると、候補タイプと要求タイプが一致せず、405が返されます。これはバグを構成すると言いますか? –

関連する問題