最近接触到SoapUI,下载了最新的版本4.0.1使用,功能相当的强大。对于一个采用了NTLM验证的Web Service服务器,使用SoapUI几乎能够对所有的Web Service进行访问,而相比较之下,自己编写的基于HttpClient的库却不行。于是只能阅读以下SoapUI中与HttpClient相关的代码,求解惑。正好网上的资料也比较少,写成文档供以后参考。
SoapUI 4.0.1使用的还是3.x版本的HttpClient,而现在HttpClient已经到4.x版本了,而且整个类结构有了非常大的变化,而且在3.x直接支持的NTLM现在必须要使用额外的JCIFS库才能调用。
从代码中来看,SoapUI使用了HttpAuthenticationRequestFilter的initRequestCreditials静态方法来给当前的submitContext添加NTLM验证的provider。接下来在DefaultEndPointStrategy类的overrideRequest方法、copyToRequest方法、complementRequest方法中会调用该静态方法添加NTLM验证机制。其中overrideRequest方法中首先会判断是否设置了wssType,如果没有,则加上身份验证的东西。
这三个函数都被同一个函数调用,applyDefaultsToWsdlRequest,该方法也是一个protect方法,被filterRequest这个public的方法调用。filterRequest方法最终被HttpClientRequestTransport的sendRequest方法调用。而sendRequest方法则是由WsdlSubmit.run方法调用。