使用Jetty在Camel上进行RESTLET

时间:2013-10-02 00:54:46

标签: rest jetty apache-camel restlet restlet-2.0

据我了解,Camel默认使用默认的RESTLET引擎。我怎么能告诉Camel改用Jetty?

我知道有很多方法可以捆绑您的应用程序并将其部署在Tomcat或Jetty中。但是,如果我这样做,最大的问题就是如何与RESTLET集成。

我做了一些进一步的挖掘。我带了一个与骆驼一起来的tomcat示例。然后我尝试使其具备RESTLET功能。它几乎可以工作。现在的问题是参数没有传递给路线。我希望在调用这个服务器时:http://x.x.x.x:8080/rs/user/?name=Paul,我会得到:你好Paul你好吗?

然而,我只是得到:你好,你好吗?

我的骆驼配置是:

    <camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="restlet:/user/?restletMethods=GET,POST" />
        <transform>
            <simple>Hello ${header.name} how are you?</simple>
        </transform>
    </route>
</camelContext>
<bean id="RestletComponent" class="org.restlet.Component" />
<bean id="RestletComponentService" class="org.apache.camel.component.restlet.RestletComponent">
    <constructor-arg index="0">
        <ref bean="RestletComponent" />
    </constructor-arg>
</bean>

我的web.xml是:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:camel-config.xml</param-value>
</context-param>

<servlet>
    <servlet-name>RestletServlet</servlet-name>
    <servlet-class>org.restlet.ext.spring.SpringServerServlet</servlet-class>
    <init-param>
        <param-name>org.restlet.component</param-name>
        <param-value>RestletComponent</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>RestletServlet</servlet-name>
    <url-pattern>/rs/*</url-pattern>
</servlet-mapping>

我的调查越来越近了。似乎$ {in.body}确实会将请求的主体传递给路由。我仍在试图找出标题的内容。我甚至尝试使用生产者模板来调用标题,但它确实有效。那么,这在某种程度上暗示了在RESTLET中访问头的方式与在纯servlet中的不同?这是我的制作人模板:

 Map<String, Object> headers = new HashMap<String, Object>();
   headers.put("name","Paul");

    context.createProducerTemplate().requestBodyAndHeaders(
            "restlet:http://localhost:8080/camel-example-servlet-tomcat/rs/user/?restletMethod=post", "Halleluia",headers);

3 个答案:

答案 0 :(得分:1)

查看org.apache.camel.component.restlet.DefaultRestletBinding课程。默认情况下,表单数据仅在内容类型为“application / x-www-form-urlencoded”时绑定。此外,只有URI模板值将绑定到标头。

要获得任意查询参数,您可以执行以下操作:

Request request = exchange.getIn().getHeader(RestletConstants.RESTLET_REQUEST, Request.class);
String value = request.getResourceRef().getQueryAsForm().getFirstValue("foo");

此外,原始查询字符串将在CamelHttpQuery标题中提供。

您可以通过使用'restletBinding'端点查询选项在Camel注册表中指定RestletBinding对象的bean ID来提供实现RestletBinding(或扩展DefaultRestletBinding)的自己的类。如果您使用Spring注册这样的bean:

    <bean id="myRestletBinding" class="com.example.MyRestletBinding"/>

答案 1 :(得分:0)

行。看来我必须使用in.header.name而不是header.name来访问URL参数。我没有解释为什么header.name可以在普通的servlet中工作。此外,我设法只使用POST工作。使用GET,参数仍然没有传递给RESTLET引擎,或者我不知道如何检索它们。相反,使用纯servlet时GET工作正常。解决方案对我有好处,因此我将其标记为已回答。

答案 2 :(得分:0)

我建议你使用驼峰CXFRS组件。有一个声明所有REST注释的服务类。您可以将用户名作为路径参数或查询参数。

语法将是这样的:

from("cxfrs://http://localhost:9992/service?resourceClasses=com.xyz.web.resources.RESTresource")

REST资源将是您的资源类。这将通过jetty Web服务器运行REST Web服务。