代码之家  ›  专栏  ›  技术社区  ›  Klaus

带码头的骆驼餐厅

  •  0
  • Klaus  · 技术社区  · 12 年前

    据我所知,Camel默认使用默认的RESTLET引擎。我该如何告诉Camel使用Jetty?

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

    我做了进一步的挖掘。我举了一个骆驼的例子。然后我试着让它有RESTLET功能。它几乎奏效了。现在的问题是参数没有被传递到路由。我希望在调用此服务器时: http://x.x.x.x:8080/rs/user/?name=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 回复  |  直到 12 年前
        1
  •  1
  •   David Keen    12 年前

    看看 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 (或延伸 DefaultRestletBinding )通过使用“RestletBinding”端点查询选项在Camel注册表中指定RestletBinding对象的bean ID。如果您正在使用Spring注册一个bean,如下所示:

        <bean id="myRestletBinding" class="com.example.MyRestletBinding"/>
    
        2
  •  0
  •   Klaus    12 年前

    好的。我似乎不得不用in.header.name而不是header.name访问URL参数。我无法解释为什么header.name会在普通servlet中工作。此外,我设法使这只与POST一起工作。使用GET,参数仍然没有传递给RESTLET引擎,或者我不知道如何检索它们。相反,GET在使用纯servlet时工作得很好。解决方案对我有好处,因此我将其标记为已回答。

        3
  •  0
  •   Dipayan    12 年前

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

    语法应该是这样的:

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

    REST资源将是您的资源类。这将在jetty web服务器上运行REST web服务。

    推荐文章