当前位置: 代码网 > it编程>编程语言>Java > springboot实现webservice接口自定义返回值通过postman测试

springboot实现webservice接口自定义返回值通过postman测试

2024年08月06日 Java 我要评论
springboot实现webservice接口自定义返回值通过postman测试

震惊~~都2023年了竟然还有人用webservice!

1、springboot集成webservice

maven添加依赖

        <!--通过cxf实现webservice-->
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-web-services</artifactid>
        </dependency>
        <dependency>
            <groupid>org.apache.cxf</groupid>
            <artifactid>cxf-rt-frontend-jaxws</artifactid>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupid>org.apache.cxf</groupid>
            <artifactid>cxf-rt-transports-http</artifactid>
            <version>3.5.1</version>
        </dependency>
        <!--解析xml-->
        <dependency>
            <groupid>org.dom4j</groupid>
            <artifactid>dom4j</artifactid>
            <version>2.1.3</version>
        </dependency>

添加配置文件

@configuration
public class cxfconfig {

    //自定义拦截器 用于处理返回数据格式
    @autowired
    private cxfoutterceptor cxfoutterceptor;

    @bean
    public servletregistrationbean disservlet() {
        servletregistrationbean servletregistrationbean = new servletregistrationbean(new cxfservlet(), "/webservice/*");
        return servletregistrationbean;
    }

    @bean(name = bus.default_bus_id)
    public springbus springbus() {
        return new springbus();
    }

    @bean
    public endpoint endpoint() {
        endpointimpl endpoint = new endpointimpl(springbus(), new accountserviceimpl());
        //发布一个名为accountservice的webservice服务,可以多个
        endpoint.publish("/accountservice");
        endpoint.getoutinterceptors().add(cxfoutterceptor);
        return endpoint;
    }


}

自定义拦截器

@component
public class cxfoutterceptor extends abstractphaseinterceptor<message> {

    public cxfoutterceptor() {
        super(phase.pre_stream);
    }

    public cxfoutterceptor(string phase) {
        super(phase);
    }

    @override
    public void handlemessage(message message) throws fault {
        try {
            outputstream os = message.getcontent(outputstream.class);
            cachedstream cs = new cachedstream();
            message.setcontent(outputstream.class, cs);
            message.getinterceptorchain().dointercept(message);
            cachedoutputstream csnew = (cachedoutputstream) message.getcontent(outputstream.class);
            inputstream in = csnew.getinputstream();
            string xml = ioutils.tostring(in);

            stringbuffer stringbuffer = new stringbuffer();

            //去掉外层包装
            document document = documenthelper.parsetext(xml);
            element rootelement = document.getrootelement();
            list<element> elements1 = rootelement.elements();
            if(elements1!=null && elements1.size()>0){
                element element = elements1.get(0);
                list<element> elements = element.elements();
                if(elements!=null && elements.size()>0){
                    element areturn = elements.get(0).element("return");
                    string name = areturn.getname();
                    string adata = areturn.getdata().tostring();

                    stringbuffer = new stringbuffer(adata);

                }
            }

            //这里对xml做处理,处理完后同理,写回流中
            ioutils.copy(new bytearrayinputstream(stringbuffer.tostring().getbytes()), os);

            cs.close();
            os.flush();

            message.setcontent(outputstream.class, os);

        } catch (exception e) {
            e.printstacktrace();
        }
    }

    private class cachedstream extends cachedoutputstream {

        public cachedstream() {

            super();

        }

        protected void doflush() {

            //currentstream.flush();

        }

        protected void doclose(){

        }

        protected void onwrite(){

        }

    }

}

通过cxf实现wenservice服务返回结果是有一层固定包装的,类似下图,return标签里才是结果,如何完全自定义返回的结果数据呢?就需要上面的拦截器去掉外层的包装。

service类

@webservice(name = "accountservice",
        targetnamespace = "http://server.webservice.kaka.com"
)
public interface accountservice {

    @webmethod
    public string sendmessage(@webparam(name = "username",targetnamespace="http://server.webservice.kaka.com") string username);

    @webmethod
    public boolean getflag(@webparam(name = "username",targetnamespace="http://server.webservice.kaka.com") string username);

    @webmethod
    public string queryusers();

}

实现类

@webservice(servicename = "accountservice",
        //名命空间可任意写 要跟service里的保持一致
        targetnamespace = "http://server.webservice.kaka.com",
        //接口类的全路径
        endpointinterface = "com.kaka.webservice.accountservice"
)
@component
@slf4j
public class accountserviceimpl implements accountservice {

    @override
    public string sendmessage(string username) {
        return "=====hello! " + username + "=====";
    }

    @override
    public boolean getflag(string username) {
        return false;
    }

}

接下来启动服务,浏览器访问ip:端口/webservice/accountservice?wsdl

即可看到wsdl信息

2、postman测试

headers添加

key:content-type

value:text/xml;charset=utf-8

然后body选择raw,xml

<?xml version="1.0" encoding="utf-8"?>
<soap:envelope xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:body>
        <sendmessage xmlns="http://server.kaka.com">
            <username>测试啊</username>
    </sendmessage>
    </soap:body>
</soap:envelope>

如果使用了上面的自定义拦截器,则调用的返回结果为:

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com