150.18. 高级用法
如果您需要对 HTTP 生成者进行更多控制,则应使用 HttpComponent
,您可以在其中设置各种类来为您提供自定义行为。
150.18.1. 设置 MaxConnectionsPerHost
HTTP 组件有一个 org.apache.commons.httpclient.HttpConnectionManager
,您可以在其中为给定组件配置各种全局配置。
通过全局配置,意味着组件创建的任何端点具有相同的共享 HttpConnectionManager
。因此,如果要为每个主机的最大连接设置不同的值,则需要在 HTTP 组件中定义它,而不是在 常用的端点 URI 中定义。这里有:
首先,我们在 Spring XML 中定义 http
组件。是的,我们使用相同的方案名称 http
,因为否则 Camel 将自动发现并使用默认设置创建组件。我们需要覆盖这一点,以便我们可以设置我们的选项。在以下示例中,我们将 max 连接设置为 5,而不是默认的 2。
然后我们可以像在我们的路由中一样使用它:
150.18.2. 使用抢占身份验证
最终用户表示他在使用 HTTPS 进行身份验证时遇到问题。当发现 HTTPS 服务器没有返回所需的 HTTP 代码 401 授权时,这个问题最终会被解决。解决方案是设置以下 URI 选项: httpClient.authenticationPreemptive=true
150.18.3. 接受来自远程服务器的自签名证书
请参阅有关一些代码的邮件列表中的 这个链接,以概述了如何使用 Apache Commons HTTP API 执行此操作。
150.18.4. 为 HTTP 客户端设置 SSL
使用 JSSE 配置实用程序
自 Camel 2.8 起,HTTP4 组件通过 Camel JSSE 配置实用程序支持 SSL/TLS 配置。这个实用程序可大大减少您需要写入的组件特定代码量,并在端点和组件级别进行配置。以下示例演示了如何将 实用程序与 HTTP4 组件一起使用。
此组件中使用的 Apache HTTP 客户端版本从全局"协议" registry 中解析 SSL/TLS 信息。此组件提供 HTTP 客户端的协议套接字工厂的一个实现 org.apache.camel.component.http.SSLContextParametersSecureProtocolSocketFactory
,以支持使用 Camel JSSE 配置实用程序。以下示例演示了如何配置协议 registry 并使用路由中的注册协议信息。
KeyStoreParameters ksp = new KeyStoreParameters(); ksp.setResource("/users/home/server/keystore.jks"); ksp.setPassword("keystorePassword"); KeyManagersParameters kmp = new KeyManagersParameters(); kmp.setKeyStore(ksp); kmp.setKeyPassword("keyPassword"); SSLContextParameters scp = new SSLContextParameters(); scp.setKeyManagers(kmp); ProtocolSocketFactory factory = new SSLContextParametersSecureProtocolSocketFactory(scp); Protocol.registerProtocol("https", new Protocol( "https", factory, 443)); from("direct:start") .to("https://mail.google.com/mail/").to("mock:results");
直接配置 Apache HTTP 客户端
基本上 camel-http 组件基于 Apache HTTP 客户端构建,您可以实施自定义 org.apache.camel.component.http.HttpClientConfigurer
在 http 客户端上进行一些配置,如果您需要完全控制它。
但是,如果您只想 指定密钥存储和信任存储,您可以使用 Apache HTTP HttpClientConfigurer
来执行此操作,例如:
Protocol authhttps = new Protocol("https", new AuthSSLProtocolSocketFactory( new URL("file:my.keystore"), "mypassword", new URL("file:my.truststore"), "mypassword"), 443); Protocol.registerProtocol("https", authhttps);
然后,您需要创建一个实施 HttpClientConfigurer
的类,并注册上述示例提供密钥存储或信任存储的 https 协议。然后,在 camel route builder 类中,您可以按类似以下内容进行 hook:
HttpComponent httpComponent = getContext().getComponent("http", HttpComponent.class); httpComponent.setHttpClientConfigurer(new MyHttpClientConfigurer());
如果使用 Spring DSL 执行此操作,您可以使用 URI 指定 HttpClientConfigurer
。例如:
<bean id="myHttpClientConfigurer" class="my.https.HttpClientConfigurer"> </bean> <to uri="https://myhostname.com:443/myURL?httpClientConfigurerRef=myHttpClientConfigurer"/>
只要您实施 HttpClientConfigurer 并配置密钥存储和信任存储,它就可以正常工作。