2017-11-19 3 views
0

私はラクダにとって新しく、これは解決するには簡単な問題かもしれません。キャメルルートにエンコードされたURIの一部を残してください

私は、GitLab APIとやり取りするラクダコンポーネントを備えたスプリングブートアプリケーションを持っています。

私の問題は、私は、例えば、符号化されたラクダの経路でエンドポイントURIを維持する必要があることである。

from("direct:start") 
    .setHeader("PRIVATE-TOKEN",constant("myToken")) 
.to("https://gitlab.com/api/v4/projects/12345/repository/files/folder%2Ffile%2Eextension/raw?ref=master") 

経路が開始されると、メッセージが

404を返し
"https://gitlab.com/api/v4/projects/12345/repository/files/folder/file.extension/raw?ref=master" 

に送られますというのは、GitLab docで述べたように、file_pathパラメータをエンコードする必要があるからです(私はcurlからGETでうまくいっています:最初のURIでjsonが返され、2番目の404が返されます)。

URIの最後の部分をHTTP_QUERYとしましたが、この場合は "?"再び404それとURIと私が手の間:

https://gitlab.com/api/v4/projects/12345/repository/files/?folder%2Ffile%2Eextension/raw?ref=master 

私は、ヘッダーHTTP_URIでURIを追加してみました:URIが正しく到達し、この時、私はヌル体の代わりに、JSONの答えを得ます。

この問題を解決するにはどうすればよいですか?

答えて

1

すでにHTTP_URIヘッダーを使用しています。どのように設定しましたか?これを試してみてください:

from("direct:start") 
    .setHeader("PRIVATE-TOKEN", constant("myToken")) 
    .setHeader(Exchange.HTTP_URI, simple("https://gitlab.com/api/v4/projects/12345/repository/files/folder%2Ffile%2Eextension/raw?ref=master")) 
    .to("http:dummy"); 

あなたがいないエンドポイント定義では、ルートの実行中にURIを設定するこの方法です。 docsによると:

Exchange.HTTP_URI:URIを呼び出すこと。エンドポイントに直接設定された既存のURIを上書きします。このURIは、呼び出すHTTPサーバーのURIです。セキュリティーなどのエンドポイントオプションを設定できるCamelエンドポイントURIと同じではありません。このヘッダーはHTTPサーバーのURIのみをサポートしています。

依存性を忘れてはいけない:

<dependency> 
    <groupId>org.apache.camel</groupId> 
    <artifactId>camel-http</artifactId> 
</dependency> 

テスト:

@Override 
protected RoutesBuilder createRouteBuilder() throws Exception { 
    return new RouteBuilder() { 

     @Override 
     public void configure() throws Exception { 
      from("direct:start") 
       .setHeader("PRIVATE-TOKEN", constant("myToken")) 
       .setHeader(Exchange.HTTP_URI, simple("http://0.0.0.0:8080?param=folder%2Ffile%2Eextension/raw&ref=master")) 
       .to("http:dummy"); 

      from("jetty:http://0.0.0.0:8080?matchOnUriPrefix=true") 
       .setBody(constant("{ key: value }")) 
       .setHeader(Exchange.CONTENT_TYPE, constant(MediaType.APPLICATION_JSON_VALUE)) 
       .to("mock:result"); 
     } 
    }; 
} 

@Test 
public void test() throws InterruptedException { 
    getMockEndpoint("mock:result").expectedHeaderReceived(Exchange.HTTP_QUERY, "param=folder%2Ffile%2Eextension/raw&ref=master"); 

    final Exchange response = template.send("direct:start", new Processor() { 
     public void process(Exchange exchange) throws Exception { 
      // nothing 
     } 
    }); 

    assertThat(response, notNullValue()); 
    assertThat(response.getIn().getHeader(Exchange.HTTP_URI).toString(), containsString("folder%2Ffile%2")); 
    assertThat(response.getOut().getBody(String.class), containsString("{ key: value }")); 


    assertMockEndpointsSatisfied(); 
} 

私はheaderHTTP_URIでURIを追加してみました。今回URIが正しく到達したが、私はjson答えの代わりにnull bodyを得ます。

応答がOUT体で保存する必要があることに注意してください:

キャメルOUT身体上の外部サーバからのHTTP応答を格納します。 INメッセージのすべてのヘッダーはOUTメッセージにコピーされるため、ルーティング中にヘッダーは保持されます。さらに、CamelはHTTP応答ヘッダーもOUTメッセージヘッダーに追加します。

関連する問題