Java 使用Apache Camel访问正确URL时的响应代码302

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]

我使用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], 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在请求发送中使用正确的用户。