当前位置 : 主页 > 网页制作 > Nodejs >

cxf 解析调用外部soap类型的webservice

来源:互联网 收集:自由互联 发布时间:2021-06-24
一、可用的请求wsdl的webservice路径 服务器提供一个外部可调用的webservice的wsdl路径,在浏览器中可直接反问道wsdl文件,在soapUI中可测试每个请求的有效的路径(该webservice是已发布可工外

一、可用的请求wsdl的webservice路径

服务器提供一个外部可调用的webservice的wsdl路径,在浏览器中可直接反问道wsdl文件,在soapUI中可测试每个请求的有效的路径(该webservice是已发布可工外部调用的有效请求)


二、下载配置Apache CXF提供的生成Client的工具

1.下载:

 http://cxf.apache.org/download.html官网 下载apache-cxf-3.0.10.zip(或者别的压缩包,建议使用较新的工具包),将下载到的zip解压到本地某个文件下,如我解压到D盘的tool文件夹下

2.配置环境变量:

将cxf所在路径配置到环境变量中,如CXF_HOME=D:\tools\apache-cxf-3.0.10,在Path变量中添加;%CXF_HOME%\bin(讲cxf的bin目录配置到path中)。

运行cmd dos命令,输入wsdl2java -v,输出为wsdl2java - Apache CXF 3.0.10这种版本信息表示安装配置成功,否则则可能安装失败


三、使用wsdl2java的命令生成客户端代码

1,简单使用命令生成代码到某目录下:

可在本地手动切换到需要生成代码的目录下,在路径中输入cmd回车即转到该目录下——》wsdl2java  -p '包名'  -encoding UTF-8 https://XXX.XX.XXXService?wsdl 回车即可生成

-p 生成代码放置的包,命令中建议加上,方便直接放到项目目录下,默认的包可能不符java包的命名规则(如可能生成以java、org等包)

-encoding 建议加上,不指定编码可能导致生成的文件产生编码冲突的错误而无法直接使用

-autoNameResolution当有两个或者多个wsdl需要生成到同一个目录下时,再次运行命令行需加入此参数,否则会提示“具有相同名称 "DemandBeginResponse" 的类/接口已在使用。请使用类定制设置来解决此冲突。”,无法正常生成

四、使用难点

cxf所依赖的包比较坑爹,包引用的版本不对会出现非常多的问题

(ws的插件可以使用比较新的版本)

<plugin>
                <groupId>org.jvnet.jax-ws-commons</groupId>
                <artifactId>jaxws-maven-plugin</artifactId>
                <version>2.3.1-b03</version>
                <dependencies>
                    <dependency>
                        <groupId>javax.xml</groupId>
                        <artifactId>webservices-api</artifactId>
                        <version>2.0</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
                    <xnocompile>true</xnocompile>
                    <verbose>true</verbose>
                    <extension>true</extension>
                    <catalog>${basedir}/src/jax-ws-catalog.xml</catalog>
                </configuration>

            </plugin>

cxf的jar包依赖的版本如果出现问题会导致各种奇怪的报错:(因为cxf2.3.3所依赖的cxf-rt-frontend-jaxws、cxf-rt-transports-http-jetty都是2.2以上,如果这两个包是2.1hi报错)

 <cxf.version>2.2.3</cxf.version>

 <!--cxf -->     
        <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf</artifactId>
            <version>2.3.3</version>
            <type>pom</type>
        </dependency>

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <!-- Jetty is needed if you're are not using the CXFServlet -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>${cxf.version}</version>
        </dependency>

jaxb-api使用的版本也不可过高

 <!-- jaxb-api -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.2.12</version>
        </dependency>


五、成功案例

通过三生成的service可直接调用(XXXservice的注解为@WebServiceClient,注释中各种需要的参数都是已经生成的)

XXXService service=new XXXService(XXX.Service.WSDL_LOCATION);//WSDL_LOCATION是生成的类中已经赋值的路径http://XXX.XXX.XXService?wsdl

XXXPortType port=service.getXXXEndpoint();

//如果请求的wsdl有Bisic Authentication的认证,需要加下面这段

((BindingProvider) port).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "username");
((BindingProvider) port).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "password");
//然后直接调用port中的方法,即可拿到数据

port.getCaptcha().getImagePath().getValue();


---------------------wso2

忘记密码:
getUserList("
http://wso2.org/claims/mobile",18666666666,null)
有用户名,验证验证码
VerificationBean ver = user.verifyUser(userName, null);
VerificationBean ver2 = user.sendRecoveryNotification(userName, ver.key, "");
VerificationBean ver3 = user.verifyConfirmationCode(userName, ver2.notificationData.notificationCode, null);
VerificationBean ver4 = user.updatePassword(userName, ver3.key, password);

修改密码: 

updateCredential 

网友评论