You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2014/08/07 08:58:59 UTC
[2/4] git commit: CAMEL-7620: Rest DSL. Enlist rest services in
RestRegistry and JMX.
CAMEL-7620: Rest DSL. Enlist rest services in RestRegistry and JMX.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/7ff40206
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/7ff40206
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/7ff40206
Branch: refs/heads/master
Commit: 7ff40206553e5d920ae72fc1c087f89880071125
Parents: e239c0f
Author: Claus Ibsen <da...@apache.org>
Authored: Wed Aug 6 14:02:57 2014 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Wed Aug 6 14:42:23 2014 +0200
----------------------------------------------------------------------
...JettyRestServletResolveConsumerStrategy.java | 79 +++++++++++++++---
.../jetty/rest/RestPathMatchingTest.java | 84 +++++++++++++-------
...rvletRestServletResolveConsumerStrategy.java | 81 ++++++++++++++++---
.../camel/example/rest/UserRouteBuilder.java | 10 +--
.../src/main/resources/camel-config-xml.xml | 14 ++--
.../src/main/webapp/index.html | 18 ++---
6 files changed, 215 insertions(+), 71 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/7ff40206/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyRestServletResolveConsumerStrategy.java
----------------------------------------------------------------------
diff --git a/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyRestServletResolveConsumerStrategy.java b/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyRestServletResolveConsumerStrategy.java
index 34f8ce2..1a7e05a 100644
--- a/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyRestServletResolveConsumerStrategy.java
+++ b/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyRestServletResolveConsumerStrategy.java
@@ -16,12 +16,15 @@
*/
package org.apache.camel.component.jetty;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.camel.component.http.HttpConsumer;
import org.apache.camel.component.http.HttpServletResolveConsumerStrategy;
-import org.apache.camel.util.ObjectHelper;
/**
* A {@link org.apache.camel.component.http.HttpServletResolveConsumerStrategy} that supports the Rest DSL.
@@ -30,24 +33,61 @@ public class JettyRestServletResolveConsumerStrategy extends HttpServletResolveC
@Override
public HttpConsumer resolve(HttpServletRequest request, Map<String, HttpConsumer> consumers) {
+ HttpConsumer answer = null;
+
String path = request.getPathInfo();
if (path == null) {
return null;
}
+ String method = request.getMethod();
+ if (method == null) {
+ return null;
+ }
- for (String key : consumers.keySet()) {
- if (useRestMatching(key) && matchRestPath(path, key)) {
- return consumers.get(key);
+ List<HttpConsumer> candidates = new ArrayList<HttpConsumer>();
+
+ // first match by http method
+ for (Map.Entry<String, HttpConsumer> entry : consumers.entrySet()) {
+ String restrict = entry.getValue().getEndpoint().getHttpMethodRestrict();
+ if (matchRestMethod(method, restrict)) {
+ candidates.add(entry.getValue());
}
}
- // fallback to default
- return super.resolve(request, consumers);
- }
+ // then see if we got a direct match
+ Iterator<HttpConsumer> it = candidates.iterator();
+ while (it.hasNext()) {
+ HttpConsumer consumer = it.next();
+ String consumerPath = consumer.getPath();
+ if (matchRestPath(path, consumerPath, false)) {
+ answer = consumer;
+ break;
+ }
+ }
+
+ // then match by non wildcard path
+ if (answer == null) {
+ it = candidates.iterator();
+ while (it.hasNext()) {
+ HttpConsumer consumer = it.next();
+ String consumerPath = consumer.getPath();
+ if (!matchRestPath(path, consumerPath, true)) {
+ it.remove();
+ }
+ }
+
+ // there should only be one
+ if (candidates.size() == 1) {
+ answer = candidates.get(0);
+ }
+ }
+
+ if (answer == null) {
+ // fallback to default
+ answer = super.resolve(request, consumers);
+ }
- private boolean useRestMatching(String path) {
- // only need to do rest matching if using { } placeholders
- return path.indexOf('{') > -1;
+ return answer;
}
/**
@@ -57,7 +97,7 @@ public class JettyRestServletResolveConsumerStrategy extends HttpServletResolveC
* @param consumerPath the consumer path which may use { } tokens
* @return <tt>true</tt> if matched, <tt>false</tt> otherwise
*/
- public boolean matchRestPath(String requestPath, String consumerPath) {
+ public boolean matchRestPath(String requestPath, String consumerPath, boolean wildcard) {
// remove starting/ending slashes
if (requestPath.startsWith("/")) {
requestPath = requestPath.substring(1);
@@ -86,7 +126,7 @@ public class JettyRestServletResolveConsumerStrategy extends HttpServletResolveC
String p1 = requestPaths[i];
String p2 = consumerPaths[i];
- if (p2.startsWith("{") && p2.endsWith("}")) {
+ if (wildcard && p2.startsWith("{") && p2.endsWith("}")) {
// always matches
continue;
}
@@ -100,4 +140,19 @@ public class JettyRestServletResolveConsumerStrategy extends HttpServletResolveC
return true;
}
+ /**
+ * Matches the given request HTTP method with the configured HTTP method of the consumer
+ *
+ * @param method the request HTTP method
+ * @param restrict the consumer configured HTTP restrict method
+ * @return <tt>true</tt> if matched, <tt>false</tt> otherwise
+ */
+ public boolean matchRestMethod(String method, String restrict) {
+ if (restrict == null) {
+ return true;
+ }
+
+ return method.toLowerCase(Locale.US).endsWith(restrict.toLowerCase(Locale.US));
+ }
+
}
http://git-wip-us.apache.org/repos/asf/camel/blob/7ff40206/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/RestPathMatchingTest.java
----------------------------------------------------------------------
diff --git a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/RestPathMatchingTest.java b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/RestPathMatchingTest.java
index df66449..5e0d726 100644
--- a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/RestPathMatchingTest.java
+++ b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/RestPathMatchingTest.java
@@ -24,32 +24,62 @@ public class RestPathMatchingTest extends TestCase {
private JettyRestServletResolveConsumerStrategy matcher = new JettyRestServletResolveConsumerStrategy();
public void testRestPathMatcher() throws Exception {
- assertTrue(matcher.matchRestPath("/foo/", "/foo/"));
- assertTrue(matcher.matchRestPath("/foo/", "foo/"));
- assertTrue(matcher.matchRestPath("/foo/", "foo"));
- assertTrue(matcher.matchRestPath("foo/", "foo"));
- assertTrue(matcher.matchRestPath("foo", "foo"));
- assertTrue(matcher.matchRestPath("foo/", "foo"));
- assertTrue(matcher.matchRestPath("/foo/", "foo"));
-
- assertTrue(matcher.matchRestPath("/foo/1234/list/2014", "/foo/1234/list/2014"));
- assertTrue(matcher.matchRestPath("/foo/1234/list/2014/", "/foo/1234/list/2014"));
- assertTrue(matcher.matchRestPath("/foo/1234/list/2014", "/foo/1234/list/2014/"));
- assertTrue(matcher.matchRestPath("/foo/1234/list/2014/", "/foo/1234/list/2014/"));
- assertTrue(matcher.matchRestPath("/foo/1234/list/2014", "/foo/{user}/list/{year}"));
-
- assertFalse(matcher.matchRestPath("/foo/", "/bar/"));
- assertFalse(matcher.matchRestPath("/foo/1234/list/2014", "/foo/1234/list/2015"));
- assertFalse(matcher.matchRestPath("/foo/1234/list/2014/", "/foo/1234/list/2015"));
- assertFalse(matcher.matchRestPath("/foo/1234/list/2014", "/foo/1234/list/2015/"));
- assertFalse(matcher.matchRestPath("/foo/1234/list/2014/", "/foo/1234/list/2015/"));
- assertFalse(matcher.matchRestPath("/foo/1234/list/2014", "/foo/{user}/list/"));
-
- assertTrue(matcher.matchRestPath("/foo/1/list/2", "/foo/{user}/list/{year}"));
- assertTrue(matcher.matchRestPath("/foo/1234567890/list/2", "/foo/{user}/list/{year}"));
- assertTrue(matcher.matchRestPath("/foo/1234567890/list/1234567890", "/foo/{user}/list/{year}"));
-
- assertTrue(matcher.matchRestPath("/123/list/2014", "/{user}/list/{year}"));
- assertTrue(matcher.matchRestPath("/1234567890/list/2014", "/{user}/list/{year}"));
+ assertTrue(matcher.matchRestPath("/foo/", "/foo/", true));
+ assertTrue(matcher.matchRestPath("/foo/", "foo/", true));
+ assertTrue(matcher.matchRestPath("/foo/", "foo", true));
+ assertTrue(matcher.matchRestPath("foo/", "foo", true));
+ assertTrue(matcher.matchRestPath("foo", "foo", true));
+ assertTrue(matcher.matchRestPath("foo/", "foo", true));
+ assertTrue(matcher.matchRestPath("/foo/", "foo", true));
+
+ assertTrue(matcher.matchRestPath("/foo/1234/list/2014", "/foo/1234/list/2014", true));
+ assertTrue(matcher.matchRestPath("/foo/1234/list/2014/", "/foo/1234/list/2014", true));
+ assertTrue(matcher.matchRestPath("/foo/1234/list/2014", "/foo/1234/list/2014/", true));
+ assertTrue(matcher.matchRestPath("/foo/1234/list/2014/", "/foo/1234/list/2014/", true));
+ assertTrue(matcher.matchRestPath("/foo/1234/list/2014", "/foo/{user}/list/{year}", true));
+
+ assertFalse(matcher.matchRestPath("/foo/", "/bar/", true));
+ assertFalse(matcher.matchRestPath("/foo/1234/list/2014", "/foo/1234/list/2015", true));
+ assertFalse(matcher.matchRestPath("/foo/1234/list/2014/", "/foo/1234/list/2015", true));
+ assertFalse(matcher.matchRestPath("/foo/1234/list/2014", "/foo/1234/list/2015/", true));
+ assertFalse(matcher.matchRestPath("/foo/1234/list/2014/", "/foo/1234/list/2015/", true));
+ assertFalse(matcher.matchRestPath("/foo/1234/list/2014", "/foo/{user}/list/", true));
+
+ assertTrue(matcher.matchRestPath("/foo/1/list/2", "/foo/{user}/list/{year}", true));
+ assertTrue(matcher.matchRestPath("/foo/1234567890/list/2", "/foo/{user}/list/{year}", true));
+ assertTrue(matcher.matchRestPath("/foo/1234567890/list/1234567890", "/foo/{user}/list/{year}", true));
+
+ assertTrue(matcher.matchRestPath("/123/list/2014", "/{user}/list/{year}", true));
+ assertTrue(matcher.matchRestPath("/1234567890/list/2014", "/{user}/list/{year}", true));
+ }
+
+ public void testRestPathMatcherNoWildcard() throws Exception {
+ assertTrue(matcher.matchRestPath("/foo/", "/foo/", false));
+ assertTrue(matcher.matchRestPath("/foo/", "foo/", false));
+ assertTrue(matcher.matchRestPath("/foo/", "foo", false));
+ assertTrue(matcher.matchRestPath("foo/", "foo", false));
+ assertTrue(matcher.matchRestPath("foo", "foo", false));
+ assertTrue(matcher.matchRestPath("foo/", "foo", false));
+ assertTrue(matcher.matchRestPath("/foo/", "foo", false));
+
+ assertTrue(matcher.matchRestPath("/foo/1234/list/2014", "/foo/1234/list/2014", false));
+ assertTrue(matcher.matchRestPath("/foo/1234/list/2014/", "/foo/1234/list/2014", false));
+ assertTrue(matcher.matchRestPath("/foo/1234/list/2014", "/foo/1234/list/2014/", false));
+ assertTrue(matcher.matchRestPath("/foo/1234/list/2014/", "/foo/1234/list/2014/", false));
+ assertTrue(matcher.matchRestPath("/foo/1234/list/2014", "/foo/{user}/list/{year}", true));
+
+ assertFalse(matcher.matchRestPath("/foo/", "/bar/", false));
+ assertFalse(matcher.matchRestPath("/foo/1234/list/2014", "/foo/1234/list/2015", false));
+ assertFalse(matcher.matchRestPath("/foo/1234/list/2014/", "/foo/1234/list/2015", false));
+ assertFalse(matcher.matchRestPath("/foo/1234/list/2014", "/foo/1234/list/2015/", false));
+ assertFalse(matcher.matchRestPath("/foo/1234/list/2014/", "/foo/1234/list/2015/", false));
+ assertFalse(matcher.matchRestPath("/foo/1234/list/2014", "/foo/{user}/list/", false));
+
+ assertFalse(matcher.matchRestPath("/foo/1/list/2", "/foo/{user}/list/{year}", false));
+ assertFalse(matcher.matchRestPath("/foo/1234567890/list/2", "/foo/{user}/list/{year}", false));
+ assertFalse(matcher.matchRestPath("/foo/1234567890/list/1234567890", "/foo/{user}/list/{year}", false));
+
+ assertFalse(matcher.matchRestPath("/123/list/2014", "/{user}/list/{year}", false));
+ assertFalse(matcher.matchRestPath("/1234567890/list/2014", "/{user}/list/{year}", false));
}
}
http://git-wip-us.apache.org/repos/asf/camel/blob/7ff40206/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletRestServletResolveConsumerStrategy.java
----------------------------------------------------------------------
diff --git a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletRestServletResolveConsumerStrategy.java b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletRestServletResolveConsumerStrategy.java
index 7a5a57b..ac24ef0 100644
--- a/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletRestServletResolveConsumerStrategy.java
+++ b/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/ServletRestServletResolveConsumerStrategy.java
@@ -16,9 +16,16 @@
*/
package org.apache.camel.component.servlet;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
+import org.apache.camel.component.bean.MethodInfo;
import org.apache.camel.component.http.HttpConsumer;
import org.apache.camel.component.http.HttpServletResolveConsumerStrategy;
@@ -29,24 +36,61 @@ public class ServletRestServletResolveConsumerStrategy extends HttpServletResolv
@Override
public HttpConsumer resolve(HttpServletRequest request, Map<String, HttpConsumer> consumers) {
+ HttpConsumer answer = null;
+
String path = request.getPathInfo();
if (path == null) {
return null;
}
+ String method = request.getMethod();
+ if (method == null) {
+ return null;
+ }
- for (String key : consumers.keySet()) {
- if (useRestMatching(key) && matchRestPath(path, key)) {
- return consumers.get(key);
+ List<HttpConsumer> candidates = new ArrayList<HttpConsumer>();
+
+ // first match by http method
+ for (Map.Entry<String, HttpConsumer> entry : consumers.entrySet()) {
+ String restrict = entry.getValue().getEndpoint().getHttpMethodRestrict();
+ if (matchRestMethod(method, restrict)) {
+ candidates.add(entry.getValue());
}
}
- // fallback to default
- return super.resolve(request, consumers);
- }
+ // then see if we got a direct match
+ Iterator<HttpConsumer> it = candidates.iterator();
+ while (it.hasNext()) {
+ HttpConsumer consumer = it.next();
+ String consumerPath = consumer.getPath();
+ if (matchRestPath(path, consumerPath, false)) {
+ answer = consumer;
+ break;
+ }
+ }
+
+ // then match by non wildcard path
+ if (answer == null) {
+ it = candidates.iterator();
+ while (it.hasNext()) {
+ HttpConsumer consumer = it.next();
+ String consumerPath = consumer.getPath();
+ if (!matchRestPath(path, consumerPath, true)) {
+ it.remove();
+ }
+ }
+
+ // there should only be one
+ if (candidates.size() == 1) {
+ answer = candidates.get(0);
+ }
+ }
+
+ if (answer == null) {
+ // fallback to default
+ answer = super.resolve(request, consumers);
+ }
- private boolean useRestMatching(String path) {
- // only need to do rest matching if using { } placeholders
- return path.indexOf('{') > -1;
+ return answer;
}
/**
@@ -56,7 +100,7 @@ public class ServletRestServletResolveConsumerStrategy extends HttpServletResolv
* @param consumerPath the consumer path which may use { } tokens
* @return <tt>true</tt> if matched, <tt>false</tt> otherwise
*/
- public boolean matchRestPath(String requestPath, String consumerPath) {
+ public boolean matchRestPath(String requestPath, String consumerPath, boolean wildcard) {
// remove starting/ending slashes
if (requestPath.startsWith("/")) {
requestPath = requestPath.substring(1);
@@ -85,7 +129,7 @@ public class ServletRestServletResolveConsumerStrategy extends HttpServletResolv
String p1 = requestPaths[i];
String p2 = consumerPaths[i];
- if (p2.startsWith("{") && p2.endsWith("}")) {
+ if (wildcard && p2.startsWith("{") && p2.endsWith("}")) {
// always matches
continue;
}
@@ -99,4 +143,19 @@ public class ServletRestServletResolveConsumerStrategy extends HttpServletResolv
return true;
}
+ /**
+ * Matches the given request HTTP method with the configured HTTP method of the consumer
+ *
+ * @param method the request HTTP method
+ * @param restrict the consumer configured HTTP restrict method
+ * @return <tt>true</tt> if matched, <tt>false</tt> otherwise
+ */
+ public boolean matchRestMethod(String method, String restrict) {
+ if (restrict == null) {
+ return true;
+ }
+
+ return method.toLowerCase(Locale.US).endsWith(restrict.toLowerCase(Locale.US));
+ }
+
}
http://git-wip-us.apache.org/repos/asf/camel/blob/7ff40206/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserRouteBuilder.java
----------------------------------------------------------------------
diff --git a/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserRouteBuilder.java b/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserRouteBuilder.java
index 46280cd..7b4729a 100644
--- a/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserRouteBuilder.java
+++ b/examples/camel-example-servlet-rest-tomcat/src/main/java/org/apache/camel/example/rest/UserRouteBuilder.java
@@ -36,14 +36,14 @@ public class UserRouteBuilder extends RouteBuilder {
// this user REST service is json only
rest("/user").consumes("application/json").produces("application/json")
- .get("/view/{id}").outType(User.class)
+ .get("/{id}").outType(User.class)
.to("bean:userService?method=getUser(${header.id})")
- .get("/list").outTypeList(User.class)
- .to("bean:userService?method=listUsers")
+ .put().type(User.class).outType(User.class)
+ .to("bean:userService?method=updateUser")
- .put("/update").type(User.class).outType(User.class)
- .to("bean:userService?method=updateUser");
+ .get("/findAll").outTypeList(User.class)
+ .to("bean:userService?method=listUsers");
}
}
http://git-wip-us.apache.org/repos/asf/camel/blob/7ff40206/examples/camel-example-servlet-rest-tomcat/src/main/resources/camel-config-xml.xml
----------------------------------------------------------------------
diff --git a/examples/camel-example-servlet-rest-tomcat/src/main/resources/camel-config-xml.xml b/examples/camel-example-servlet-rest-tomcat/src/main/resources/camel-config-xml.xml
index ccb9a15..0ef2fcc 100755
--- a/examples/camel-example-servlet-rest-tomcat/src/main/resources/camel-config-xml.xml
+++ b/examples/camel-example-servlet-rest-tomcat/src/main/resources/camel-config-xml.xml
@@ -38,20 +38,20 @@
<rest uri="/user" consumes="application/json" produces="application/json">
<!-- this is a rest GET to view an user by the given id -->
- <get uri="/view/{id}" outType="org.apache.camel.example.rest.User">
+ <get uri="/{id}" outType="org.apache.camel.example.rest.User">
<to uri="bean:userService?method=getUser(${header.id})"/>
</get>
- <!-- this is a rest GET to view all users -->
- <get uri="/list" outList="true" outType="org.apache.camel.example.rest.User">
- <to uri="bean:userService?method=listUsers"/>
- </get>
-
<!-- this is a rest PUT to create/update an user -->
- <put uri="/update" type="org.apache.camel.example.rest.User" outType="org.apache.camel.example.rest.User">
+ <put type="org.apache.camel.example.rest.User" outType="org.apache.camel.example.rest.User">
<to uri="bean:userService?method=updateUser"/>
</put>
+ <!-- this is a rest GET to find all users -->
+ <get uri="/findAll" outList="true" outType="org.apache.camel.example.rest.User">
+ <to uri="bean:userService?method=listUsers"/>
+ </get>
+
</rest>
</camelContext>
http://git-wip-us.apache.org/repos/asf/camel/blob/7ff40206/examples/camel-example-servlet-rest-tomcat/src/main/webapp/index.html
----------------------------------------------------------------------
diff --git a/examples/camel-example-servlet-rest-tomcat/src/main/webapp/index.html b/examples/camel-example-servlet-rest-tomcat/src/main/webapp/index.html
index beccdc1..e48aed4 100644
--- a/examples/camel-example-servlet-rest-tomcat/src/main/webapp/index.html
+++ b/examples/camel-example-servlet-rest-tomcat/src/main/webapp/index.html
@@ -33,25 +33,25 @@ And for XML DSL the routes are define in XML code, in the <tt>src/main/resources
<p/>
There is a <i>user</i> REST service that supports the following operations
<ul>
- <li>view/<i>id</i> - to view a user with the given id </li>
- <li>list - to view all users</li>
- <li>update - to update/create an user</li>
+ <li>GET /user/{id} - to view a user with the given id </li>
+ <li>GET /user/final - to view all users</li>
+ <li>PUT /user - to update/create an user</li>
</ul>
-The view and list operations are HTTP GET, and update is using HTTP PUT.
+The view operations are HTTP GET, and update is using HTTP PUT.
From a web browser you can access the first two services using the following links
<ul>
- <li><a href="rest/user/view/123">user/view/123</a> - to view the user with id 123</li>
- <li><a href="rest/user/list">user/list</a> - to list all users</li>
+ <li><a href="rest/user/123">user/123</a> - to view the user with id 123</li>
+ <li><a href="rest/user/findAll">user/findAll</a> - to list all users</li>
</ul>
From the command shell you can use curl to access the service as shown below:
<pre>
- curl -X GET -H "Accept: application/json" http://localhost:8080/camel-example-servlet-rest-tomcat-{version}/rest/user/view/123
- curl -X GET -H "Accept: application/json" http://localhost:8080/camel-example-servlet-rest-tomcat-{version}/rest/user/list
- curl -X PUT -d "{ \"id\": 666, \"name\": \"The devil\"}" -H "Accept: application/json" http://localhost:8080/camel-example-servlet-rest-tomcat-{version}/rest/user/update
+ curl -X GET -H "Accept: application/json" http://localhost:8080/camel-example-servlet-rest-tomcat-{version}/rest/user/123
+ curl -X GET -H "Accept: application/json" http://localhost:8080/camel-example-servlet-rest-tomcat-{version}/rest/user/findAll
+ curl -X PUT -d "{ \"id\": 666, \"name\": \"The devil\"}" -H "Accept: application/json" http://localhost:8080/camel-example-servlet-rest-tomcat-{version}/rest/user
</pre>
This assume you installed the example by copying the .war as <tt>camel-example-servlet-rest-tomcat-VERSION.war</tt>