...
Info | ||
---|---|---|
| ||
Netty is stream based, which means the input it receives is submitted to Camel as a stream. That means you will only be able to read the content of the stream once. |
Maven users will need to add the following dependency to their pom.xml
for this component:
Code Block | ||||
---|---|---|---|---|
| ||||
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-netty-http</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
|
...
The URI scheme for a netty component is as follows
Code Block |
---|
netty-http:http://localhost:8080[?options]
|
...
Wiki Markup |
---|
{div:class=confluenceTableSmall} || Name || Type || Description || | {{CamelHttpMethod}} | {{String}} | The HTTP method used, such as GET, POST, TRACE etc. | | {{CamelHttpUrl}} | {{String}} | The URL including protocol, host and port, etc: {code}http://0.0.0.0:8080/myapp{code} | | {{CamelHttpUri}} | {{String}} | The URI without protocol, host and port, etc: {code}/myapp{code} | | {{CamelHttpQuery}} | {{String}} | Any query parameters, such as {{foo=bar&beer=yes}} | | {{CamelHttpRawQuery}} | {{String}} | *Camel 2.13.0*: Any query parameters, such as {{foo=bar&beer=yes}}. Stored in the raw form, as they arrived to the consumer (i.e. before URL decoding). | | {{CamelHttpPath}} | {{String}} | Additional context-path. This value is empty if the client called the context-path {{/myapp}}. If the client calls {{/myapp/mystuff}}, then this header value is {{/mystuff}}. In other words its the value after the context-path configured on the route endpoint. | | {{CamelHttpCharacterEncoding}} | {{String}} | The charset from the content-type header. | | {{CamelHttpAuthentication}} | {{String}} | If the user was authenticated using HTTP Basic then this header is added with the value {{Basic}}. | | {{Content-Type}} | {{String}} | The content type if provided. For example: {{text/plain; charset="UTF-8"}}. | {div} |
...
This component uses the org.apache.camel.component.netty.http.NettyHttpMessage
as the message implementation on the Exchange. This allows end users to get access to the original Netty request/response instances if needed, as shown below:
Code Block |
---|
org.jboss.netty.handler.codec.http.HttpRequest request = exchange.getIn(NettyHttpMessage.class).getHttpRequest();
|
...
In the route below we use Netty HTTP as a HTTP server, which returns back a hardcoded "Bye World" message.
Code Block |
---|
from("netty-http:http://0.0.0.0:8080/foo")
.transform().constant("Bye World");
|
And we can call this HTTP server using Camel also, with the ProducerTemplate as shown below:
Code Block |
---|
String out = template.requestBody("netty-http:http://localhost:8080/foo", "Hello World", String.class);
System.out.println(out);
|
...
By default Netty HTTP will only match on exact uri's. But you can instruct Netty to match prefixes. For example
Code Block |
---|
from("netty-http:http://0.0.0.0:8123/foo").to("mock:foo");
|
...
So if you want to enable wildcard matching you do as follows:
Code Block |
---|
from("netty-http:http://0.0.0.0:8123/foo?matchOnUriPrefix=true").to("mock:foo");
|
...
To match any endpoint you can do:
Code Block |
---|
from("netty-http:http://0.0.0.0:8123?matchOnUriPrefix=true").to("mock:foo");
|
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
from("netty-http:http://0.0.0.0:{{port}}/foo")
.to("mock:foo")
.transform().constant("Bye World");
from("netty-http:http://0.0.0.0:{{port}}/bar")
.to("mock:bar")
.transform().constant("Bye Camel");
|
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
from("netty-http:http://0.0.0.0:{{port}}/foo")
.to("mock:foo")
.transform().constant("Bye World");
// we cannot have a 2nd route on same port with SSL enabled, when the 1st route is NOT
from("netty-http:http://0.0.0.0:{{port}}/bar?ssl=true")
.to("mock:bar")
.transform().constant("Bye Camel");
|
...
By configuring the common server bootstrap option in an single instance of a org.apache.camel.component.netty.NettyServerBootstrapConfiguration
type, we can use the bootstrapConfiguration
option on the Netty HTTP consumers to refer and reuse the same options across all consumers.
Code Block | ||||
---|---|---|---|---|
| ||||
<bean id="nettyHttpBootstrapOptions" class="org.apache.camel.component.netty.NettyServerBootstrapConfiguration">
<property name="backlog" value="200"/>
<property name="connectionTimeout" value="20000"/>
<property name="workerCount" value="16"/>
</bean>
|
And in the routes you refer to this option as shown below
Code Block | ||||
---|---|---|---|---|
| ||||
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/foo?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
...
</route>
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/bar?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
...
</route>
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/beer?bootstrapConfiguration=#nettyHttpBootstrapOptions"/>
...
</route>
|
...
The Netty HTTP consumer supports HTTP basic authentication by specifying the security realm name to use, as shown below
Code Block |
---|
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/foo?securityConfiguration.realm=karaf"/>
...
</route>
|
...
For example as shown below in the XML DSL, we define the constraint bean:
Code Block | ||||
---|---|---|---|---|
| ||||
<bean id="constraint" class="org.apache.camel.component.netty.http.SecurityConstraintMapping">
<!-- inclusions defines url -> roles restrictions -->
<!-- a * should be used for any role accepted (or even no roles) -->
<property name="inclusions">
<map>
<entry key="/*" value="*"/>
<entry key="/admin/*" value="admin"/>
<entry key="/guest/*" value="admin,guest"/>
</map>
</property>
<!-- exclusions is used to define public urls, which requires no authentication -->
<property name="exclusions">
<set>
<value>/public/*</value>
</set>
</property>
</bean>
|
...
To use this constraint we just need to refer to the bean id as shown below:
Code Block | ||||
---|---|---|---|---|
| ||||
<route>
<from uri="netty-http:http://0.0.0.0:{{port}}/foo?matchOnUriPrefix=true&securityConfiguration.realm=karaf&securityConfiguration.securityConstraint=#constraint"/>
...
</route>
|
Include Page | ||||
---|---|---|---|---|
|