我是骆驼的新手,所以这可能是一个很难解决的问题。
我有一个带有驼峰组件的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的答案。
有什么想法解决这个问题?
答案 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消息标头中。