Java 使用Apache Camel访问正确URL时的响应代码302
我使用ApacheCamel访问web服务,在调用.NETWeb服务时遇到了奇怪的问题 这是骆驼发送的POST请求:Java 使用Apache Camel访问正确URL时的响应代码302,java,web-services,post,apache-camel,http-status-code-302,Java,Web Services,Post,Apache Camel,Http Status Code 302,我使用ApacheCamel访问web服务,在调用.NETWeb服务时遇到了奇怪的问题 这是骆驼发送的POST请求: ID: 1 Address: http://<domainName>/<pathToService>.asmx Encoding: UTF-8 Http-Method: POST Content-Type: text/xml Headers: {Accept=[*/*], breadcrumbId=[ID-someId-1449849054155-0-1]
ID: 1
Address: http://<domainName>/<pathToService>.asmx
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], breadcrumbId=[ID-someId-1449849054155-0-1], SOAPAction=["http://<someNamespace>/<SoapActionName>"]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body>/soap:Body></soap:Envelope>
POST /<pathToService>.asmx HTTP/1.1
Content-Type: text/xml; charset=UTF-8
Accept: */*
SOAPAction:<someNamespace>/<SoapActionName>
User-Agent: Apache CXF 3.1.4
Cache-Control: no-cache
Pragma: no-cache
Host: localhost:8013
Connection: keep-alive
Content-Length: 269
Authorization: NTLM <Token>
当然,这也是正确的行为
我认为我需要对Camel进行调优,使其能够使用.NETWeb服务
但是怎么做呢
驼峰配置(全部在Spring DSL中):
我尝试在Apache HttpClient上使用不带Camel的请求web服务:
DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.getAuthSchemes().register(AuthPolicy.NTLM,new JCIFSNTLMSchemeFactory());
httpClient.getAuthSchemes().register(AuthPolicy.SPNEGO,new JCIFSNTLMSchemeFactory());
CredentialsProvider credsProvider = new BasicCredentialsProvider();
NTCredentials ntCredentials = new NTCredentials(USERNAME, PASSWORD,
InetAddress.getLocalHost().getHostName(), DOMAIN);
HttpHost target = new HttpHost(HOST,80,"http");
credsProvider.setCredentials(new AuthScope(target.getHostName(), target.getPort(),
AuthScope.ANY_REALM, "NTLM"), ntCredentials);
httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY, ntCredentials);
HttpPost post = new HttpPost(URL);
post.addHeader("SOAPAction", SOAP_ACTION);
post.addHeader("Content-Type",CONTENT_TYPE);
post.addHeader("Accept-Encoding",ACCEPT_ENCODING);
HttpEntity httpEntity = new StringEntity(getShortText());
post.setEntity(httpEntity);
HttpResponse response = httpClient.execute(post);
POST /<pathToService>.asmx HTTP/1.1
Content-Type: text/xml; charset=utf-8
Accept-Encoding: gzip,deflate
SOAPAction:<someNamespace>/<SoapActionName>
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Host: localhost:8013
Connection: Keep-Alive
Content-Length: 269
Authorization: NTLM <Token>
Camel创建了最后一个(3个NTLM请求中的3个)POST请求:
ID: 1
Address: http://<domainName>/<pathToService>.asmx
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], breadcrumbId=[ID-someId-1449849054155-0-1], SOAPAction=["http://<someNamespace>/<SoapActionName>"]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body>/soap:Body></soap:Envelope>
POST /<pathToService>.asmx HTTP/1.1
Content-Type: text/xml; charset=UTF-8
Accept: */*
SOAPAction:<someNamespace>/<SoapActionName>
User-Agent: Apache CXF 3.1.4
Cache-Control: no-cache
Pragma: no-cache
Host: localhost:8013
Connection: keep-alive
Content-Length: 269
Authorization: NTLM <Token>
POST/.asmx HTTP/1.1
内容类型:text/xml;字符集=UTF-8
接受:*/*
SOAPAction:/
用户代理:Apache CXF 3.1.4
缓存控制:没有缓存
Pragma:没有缓存
主机:localhost:8013
连接:保持活力
内容长度:269
授权:NTLM
Apache HttpClient使用上述代码创建了最后一个(3个NTLM请求中的3个)POST请求:
DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.getAuthSchemes().register(AuthPolicy.NTLM,new JCIFSNTLMSchemeFactory());
httpClient.getAuthSchemes().register(AuthPolicy.SPNEGO,new JCIFSNTLMSchemeFactory());
CredentialsProvider credsProvider = new BasicCredentialsProvider();
NTCredentials ntCredentials = new NTCredentials(USERNAME, PASSWORD,
InetAddress.getLocalHost().getHostName(), DOMAIN);
HttpHost target = new HttpHost(HOST,80,"http");
credsProvider.setCredentials(new AuthScope(target.getHostName(), target.getPort(),
AuthScope.ANY_REALM, "NTLM"), ntCredentials);
httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY, ntCredentials);
HttpPost post = new HttpPost(URL);
post.addHeader("SOAPAction", SOAP_ACTION);
post.addHeader("Content-Type",CONTENT_TYPE);
post.addHeader("Accept-Encoding",ACCEPT_ENCODING);
HttpEntity httpEntity = new StringEntity(getShortText());
post.setEntity(httpEntity);
HttpResponse response = httpClient.execute(post);
POST /<pathToService>.asmx HTTP/1.1
Content-Type: text/xml; charset=utf-8
Accept-Encoding: gzip,deflate
SOAPAction:<someNamespace>/<SoapActionName>
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Host: localhost:8013
Connection: Keep-Alive
Content-Length: 269
Authorization: NTLM <Token>
POST/.asmx HTTP/1.1
内容类型:text/xml;字符集=utf-8
接受编码:gzip,deflate
SOAPAction:/
用户代理:Apache HttpClient/4.1.1(java 1.5)
主机:localhost:8013
连接:保持活力
内容长度:269
授权:NTLM
这两个请求看起来都与我相同,但Camel请求的IIS响应是HTTP 302,Apache HttpCLient的IIS响应是HTTP 200
主机是localhost:8013,因为我使用侦听器分析HTTP流量,所以该侦听器将所有请求转发到远程服务器。因为您的浏览器可以从位置标头执行302重定向
您得到的响应是HTTP 302,它是基于位置头的重定向。因此,您需要告诉Camel遵循302并从位置标头获取URI。因为您的浏览器可以从位置标头遵循302重定向 您得到的响应是HTTP 302,它是基于位置头的重定向。因此,您需要告诉Camel遵循302并从location头获取URI。解决方案:
元素添加到
中。我的例子是:
<http:conduit name="*.http-conduit">
<http:client
AllowChunking="false"
MaxRetransmits="11"
Connection="Keep-Alive"
ReceiveTimeout="30000"
CacheControl="No-Cache"
/>
<http:authorization>
<sec:UserName>domain\username</sec:UserName>
<sec:Password>password</sec:Password>
<sec:AuthorizationType>NTLM</sec:AuthorizationType>
</http:authorization>
</http:conduit>
2.2在任何CXF bean之前将bean添加到应用程序上下文:
<bean id = "NTLMCallbackHelper" class="my.package.NTLMCallbackHelper"/>
使用此解决方案,我从IIS获得了HTTP 200响应代码。解决方案:
元素添加到
中。我的例子是:
<http:conduit name="*.http-conduit">
<http:client
AllowChunking="false"
MaxRetransmits="11"
Connection="Keep-Alive"
ReceiveTimeout="30000"
CacheControl="No-Cache"
/>
<http:authorization>
<sec:UserName>domain\username</sec:UserName>
<sec:Password>password</sec:Password>
<sec:AuthorizationType>NTLM</sec:AuthorizationType>
</http:authorization>
</http:conduit>
2.2在任何CXF bean之前将bean添加到应用程序上下文:
<bean id = "NTLMCallbackHelper" class="my.package.NTLMCallbackHelper"/>
使用此解决方案,我从IIS获得了HTTP 200响应代码。感谢您的响应。问题是我使用了正确的位置。我在问题中添加了新信息,请查看。问题已更新,我添加了Camel代码和有关如何调用它的信息。我找到了原因,Camel使用错误的用户凭据发送请求-这是运行Camel的用户,而不是Camel配置中指定的凭据。如果用户无权调用web服务,IIS将发送HTTP 302响应。现在的任务是使Camel在发送请求时使用正确的用户。感谢您的回复。问题是我使用了正确的位置。我在问题中添加了新信息,请查看。问题已更新,我添加了Camel代码和有关如何调用它的信息。我找到了原因,Camel使用错误的用户凭据发送请求-这是运行Camel的用户,而不是Camel配置中指定的凭据。如果用户无权调用web服务,IIS将发送HTTP 302响应。现在的任务是使Camel在请求发送中使用正确的用户。