将部分URI编码为驼峰路由

时间:2017-11-19 01:19:48

标签: apache-camel

我是骆驼的新手,所以这可能是一个很难解决的问题。

我有一个带有驼峰组件的spring-boot应用程序,它与GitLab API交互。

我的问题是我需要将端点URI保存在编码的camel路由中,例如:

p1 = first_pwd.get()

路线开始时,信息将发送至

 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,因为必须对参数file_path进行编码,如GitLab doc中所述(我已经从curl中获取了GET:第一个URI返回了json,第二个404)

我尝试将URI的最后一部分传递为"https://gitlab.com/api/v4/projects/12345/repository/files/folder/file.extension/raw?ref=master" ,但在这种情况下,存在“?”在它和URI之间,我再次获得404:

HTTP_QUERY

我尝试使用标头https://gitlab.com/api/v4/projects/12345/repository/files/?folder%2Ffile%2Eextension/raw?ref=master 添加URI:这次正确地达到了URI,但是我得到了null body而不是json的答案。

有什么想法解决这个问题?

1 个答案:

答案 0 :(得分: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,而不是在端点定义中设置URI。根据{{​​3}}:

  

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,但是我得到了null body而不是json的答案。

请注意,响应应存储在 OUT 正文中:

  

Camel将在外部服务器上存储来自外部服务器的HTTP响应。 IN消息中的所有标头都将被复制到OUT消息,因此在路由期间会保留标头。此外,Camel还会将HTTP响应标头添加到OUT消息标头中。