RestletPage edited by Claus IbsenRestlet ComponentThe Restlet component provides Restlet based endpoints for consuming and producing RESTful resources. URI format
restlet:restletUrl[?options]
Format of restletUrl:
protocol://hostname[:port][/resourcePattern]
Restlet promotes decoupling of protocol and application concerns. The reference implementation of Restlet Engine supports a number of protocols. However, we have tested the HTTP protocol only. The default port is port 80. We do not automatically switch default port based on the protocol yet. Options
Message HeadersCamel 1.x
Camel 2.0
Message BodyCamel will store the Restlet response from the external server on the OUT body. All headers from the IN message will be copied to the OUT message so headers is preserved during routing. SamplesRestlet Endpoint with AuthenticationThis sample starts a Restlet consumer endpoint that listens POST requests on http://localhost:8080. The route looks like follow. The consumer invokes a processor that creates a response to echo the request body and the value of header "id".
from("restlet:http://localhost:9080/securedOrders?restletMethod=post&restletRealm=#realm").process(new Processor() {
public void process(Exchange exchange) throws Exception {
exchange.getOut().setBody(
"received [" + exchange.getIn().getBody()
+ "] as an order id = "
+ exchange.getIn().getHeader("id"));
}
});
The restletRealmRef (in 2.x, use the # notation. i.e. restletRealm=#refName)in URI query is an option to lookup a Realm Map in the registry. If this option is specified, the Restlet consumer will use the information to authenticate user logins. Only authenticated requests can access the resources. In this sample, we create a Spring application context that serves as a registry. The bean ID of the Realm Map should match the restletRealmRef.
<util:map id="realm">
<entry key="admin" value="foo" />
<entry key="bar" value="foo" />
</util:map>
The sample starts a direct endpoint that sends requests to the server on http://localhost:8080 (i.e. our Restlet consumer endpoint).
// Note: restletMethod and restletRealmRef are stripped
// from the query before a request is sent as they are
// only processed by Camel.
from("direct:start-auth").to("restlet:http://localhost:9080/securedOrders?restletMethod=post");
That is all we need. We are ready to send a request and try out the Restlet component. The sample client sends a request to "direct:start-auth" endpoint with the following headers. Notice that org.apache.camel.restlet.auth.login and org.apache.camel.restlet.auth.password will not be propagated as Restlet header.
final String id = "89531";
Map<String, Object> headers = new HashMap<String, Object>();
headers.put(RestletConstants.RESTLET_LOGIN, "admin");
headers.put(RestletConstants.RESTLET_PASSWORD, "foo");
headers.put("id", id);
String response = (String) template.requestBodyAndHeaders("direct:start-auth",
"<order foo='1'/>", headers);
The sample client will get a response:
received [<order foo='1'/>] as an order id = 89531
Single Restlet endpoint to service multiple methods and URI templates (2.0 or later)It is possible to create a single route to service multiple HTTP methods using the restletMethods option. This snippet also shows how to retrieve the request method from the header.
from("restlet:http://localhost:9080/users/{username}?restletMethods=post,get")
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
// echo the method
exchange.getOut().setBody(exchange.getIn().getHeader(Exchange.HTTP_METHOD,
String.class));
}
});
In addition to service multiple methods, the next snippet shows how to create an endpoint to support multiple URI templates by using the restletUriPatterns option. The request URI is available in the header of the IN message as well. If an URI pattern has been defined in the endpoint URI (which is not the case in this sample), both the URI pattern defined in endpoint and the restletUriPatterns option will be honored.
from("restlet:http://localhost:9080?restletMethods=post,get&restletUriPatterns=#uriTemplates")
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
// echo the method
String uri = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class);
String out = exchange.getIn().getHeader(Exchange.HTTP_METHOD, String.class);
if ("http://localhost:9080/users/homer".equals(uri)) {
exchange.getOut().setBody(out + " " + exchange.getIn().getHeader("username", String.class));
} else if ("http://localhost:9080/atom/collection/foo/component/bar".equals(uri)) {
exchange.getOut().setBody(out + " " + exchange.getIn().getHeader("id", String.class)
+ " " + exchange.getIn().getHeader("cid", String.class));
}
}
});
The restletUriPatterns=#uriTemplates option references to the List bean (of String) defined in the Spring configuration.
<bean id="uriTemplates">
<list>
<value>/users/{username}</value>
<value>/atom/collection/{id}/component/{cid}</value>
</list>
</bean>
Change Notification Preferences
View Online
|
View Change
|
Add Comment
|
- [CONF] Apache Camel > Restlet confluence
- [CONF] Apache Camel > Restlet confluence