WebService接口开发教程

一、前言:

工作中,接触到很多系统要互相对接,因为大多数公司(项目)所用的平台不同,要想一方提供数据信息供对方提取,首先想到的就是开放出一个WebService接口调用文档和WebService地址,这样对方就能根据文档地址编程去调用。于是便在网上搜罗相关资料,尝试写一个WebService接口,非科班出身,仅供大家参考、指教。

二、WebService优点:

  • 可远程调用(WebService可以向全世界提供信息,或提供某项功能,只要有网就OK)。
  • 跨平台调用(WebService可以在Windows上调用linux上的WebService服务,反之同理)。
  • 跨语言调用(WebService可以在Java语言中调用asp.net语言提供的WebService服务,反之其他编程语言同理)
  • ......

三、详细开发步骤:

1)使用JDK开发WebService

WebService服务端

1.1首先我们先创建一个java项目,目录及Util工具类和所应用的包:

 这里我用的是 C3p0 JDBC连接池方式我给大家提供MySql和oracle工具类,代码如下:

MySql:

package Util;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCUtil2 {
    static ComboPooledDataSource dataSource = null;
    static{
        dataSource = new ComboPooledDataSource();
    }
    
    public static DataSource getDataSource(){
        return dataSource;
    }
    
    /**
     * 获取连接对象
     * @return
     * @throws SQLException 
     */
    public static Connection getConn() throws SQLException{
        return dataSource.getConnection();
    }
    
    /**
     * 释放资源
     * @param conn
     * @param st
     * @param rs
     */
    public static void release(Connection conn , Statement st , ResultSet rs){
        closeRs(rs);
        closeSt(st);
        closeConn(conn);
    }
    public static void release(Connection conn , Statement st){
        closeSt(st);
        closeConn(conn);
    }

    
    private static void closeRs(ResultSet rs){
        try {
            if(rs != null){
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            rs = null;
        }
    }
    
    private static void closeSt(Statement st){
        try {
            if(st != null){
                st.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            st = null;
        }
    }
    
    private static void closeConn(Connection conn){
        try {
            if(conn != null){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            conn = null;
        }
    }    
    
    public static void main(String[] args) throws Exception{
        System.out.println(getConn());
        System.out.println("---------------------------南清风工具类测试-------------------------------");
        System.out.println("+++++++++++++++++++MySql Connection Successful!+++++++++++++++++++++");
        System.out.println("---------------------------------------------------------------------");
    }
}

Oracle:

package Util;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JDBCUtil {

    private static ComboPooledDataSource ds = new ComboPooledDataSource();
    private static ThreadLocal<Connection> tl=new ThreadLocal<>();
    
    /**
     * 从线程中获取连接
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        //从线程中获取conneciton
        Connection conn = tl.get();
        if(conn==null){
            conn=ds.getConnection();
            //和当前线程绑定
            tl.set(conn);
        }
        return conn;
    }

    // 获取数据源
    public static DataSource getDataSource() {
        return ds;
    }

    // 释放资源
    public static void closeResource( Statement st, ResultSet rs) {
        closeResultSet(rs);
        closeStatement(st);
    }
    
    // 释放资源
    public static void closeResource(Connection conn, Statement st, ResultSet rs) {
        closeResource(st, rs);
        closeConn(conn);
    }

    // 释放 connection
    public static void closeConn(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
                //和线程解绑
                tl.remove();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }

    // 释放 statement ctrl + shift + f 格式化代码
    public static void closeStatement(Statement st) {
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            st = null;
        }
    }

    // 释放结果集
    public static void closeResultSet(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
    }
    
    
    //开启事务
    public static void startTransaction() throws SQLException{
        getConnection().setAutoCommit(false);
    }
    
    /**
     * 事务提交且释放连接
     */
    public static void commitAndClose(){
        Connection conn = null;
        try {
            conn=getConnection();
            //事务提交
            conn.commit();
            //关闭资源
            conn.close();
            //解除版定
            tl.remove();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 事务回滚且释放资源
     */
    public static void rollbackAndClose(){
        Connection conn = null;
        try {
            conn=getConnection();
            //事务回滚
            conn.rollback();
            //关闭资源
            conn.close();
            //解除版定
            tl.remove();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws Exception{
        System.out.println(getConnection());
        System.out.println("---------------------------南清风工具类测试-------------------------------");
        System.out.println("+++++++++++++++++++Oracle Connection Successful!+++++++++++++++++++++");
        System.out.println("---------------------------------------------------------------------");
    }
}

 1.2我们现在需要写一个接口类、封装对象类、实现类和拦截器,代码如下:

接口类:

package Dao;

import java.sql.SQLException;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService
public interface fwsyq {
    @WebMethod()
    String Get_fwsyq(
            @WebParam(name="cxtj",targetNamespace = "http://Dao.Get_fwsyq_impl.Get_fwsyq")String cxtj,
            @WebParam(name="cxnr",targetNamespace = "http://Dao.Get_fwsyq_impl.Get_fwsyq")String cxnr) throws SQLException;
}

Bean封装类:

package Bean;

public class fwsyq_table2 {
    private int id;         
    private String SLID;    
    private String DJYY;    
    private String DYH;  
    private String QLR; 
    private String BH;  
    private String ZH;   
    private float JZMJ;      
    private String FDZL;     
    private String XZ;     
    private String DJSJ;     
    private String djbzt;
    
    public fwsyq_table2() {
        super();
        
    }

    public fwsyq_table2(int id, String sLID, String dJYY, String dYH, String qLR, String bH, String zH, float jZMJ,
            String fDZL, String xZ, String dJSJ, String djbzt) {
        this.id = id;
        SLID = sLID;
        DJYY = dJYY;
        DYH = dYH;
        QLR = qLR;
        BH = bH;
        ZH = zH;
        JZMJ = jZMJ;
        FDZL = fDZL;
        XZ = xZ;
        DJSJ = dJSJ;
        this.djbzt = djbzt;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getSLID() {
        return SLID;
    }

    public void setSLID(String sLID) {
        SLID = sLID;
    }

    public String getDJYY() {
        return DJYY;
    }

    public void setDJYY(String dJYY) {
        DJYY = dJYY;
    }

    public String getDYH() {
        return DYH;
    }

    public void setDYH(String dYH) {
        DYH = dYH;
    }

    public String getQLR() {
        return QLR;
    }

    public void setQLR(String qLR) {
        QLR = qLR;
    }

    public String getBH() {
        return BH;
    }

    public void setBH(String bH) {
        BH = bH;
    }

    public String getZH() {
        return ZH;
    }

    public void setZH(String zH) {
        ZH = zH;
    }

    public float getJZMJ() {
        return JZMJ;
    }

    public void setJZMJ(float jZMJ) {
        JZMJ = jZMJ;
    }

    public String getFDZL() {
        return FDZL;
    }

    public void setFDZL(String fDZL) {
        FDZL = fDZL;
    }

    public String getXZ() {
        return XZ;
    }

    public void setXZ(String xZ) {
        XZ = xZ;
    }

    public String getDJSJ() {
        return DJSJ;
    }

    public void setDJSJ(String dJSJ) {
        DJSJ = dJSJ;
    }

    public String getDjbzt() {
        return djbzt;
    }

    public void setDjbzt(String djbzt) {
        this.djbzt = djbzt;
    }

    @Override
    public String toString() {
        return "fwsyq_table2 [id=" + id + ", SLID=" + SLID + ", DJYY=" + DJYY + ", DYH=" + DYH + ", QLR=" + QLR
                + ", BH=" + BH + ", ZH=" + ZH + ", JZMJ=" + JZMJ + ", FDZL=" + FDZL + ", XZ=" + XZ + ", DJSJ=" + DJSJ
                + ", djbzt=" + djbzt + "]";
    }    
}

接口实现类:

package Dao;

import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import Bean.fwsyq_table;
import Util.JDBCUtil2;
import net.sf.json.JSONArray;

public class Get_fwsyq_impl implements fwsyq {

    @Override
    public String Get_fwsyq(String cxtj, String cxnr) {
        try {
            QueryRunner qr = new QueryRunner(JDBCUtil2.getDataSource());if(cxtj!=null && cxnr!=null){
                String sql="select id,slid,djyy,dyh,qlr,bh,zh,jzmj,fdzl,xz,djsj,djbzt from bqh_fq1 where "+cxtj+"="+"'"+cxnr+"'" +"order by id";
                String sql1="select count(*) from bqh_fq1 where "+cxtj+"="+"'"+cxnr+"'";
                              
                List<fwsyq_table> data = qr.query(sql, new BeanListHandler<fwsyq_table>(fwsyq_table.class));
                Long total=(Long) qr.query(sql1, new ScalarHandler());  //统计查询总数
                System.out.println("来自客户端接口访问:查询成功!");
                
                int count=total.intValue();
                int code=0;
                String msg="\"查询成功\"";
                
                String json1="{\"code\":"+code+",\"msg\":"+msg+",\"count\":"+count+",\"data\":"+JSONArray.fromObject(data).toString()+"}";
                System.out.println(json1);
                return json1;
                    
            }else {
                List<fwsyq_table> data =null;
                System.out.println("来自客户端接口访问:查询失败!");
                int code=4;
                int count=0;
                String msg="\"查询失败\"";
                String json1="{\"code\":"+code+",\"msg\":"+msg+",\"count\":"+count+",\"data\":"+JSONArray.fromObject(data).toString()+"}";

                return json1;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;    
    }
}

1.3使用Endpoint类发布WebService

package Publish_interface;

import javax.xml.ws.Endpoint;

import Dao.Get_fwsyq_impl;

public class Get_FWSYQ { 
    public static void main(String[] args){
        //发布接口地址
        String address="http://192.168.0.188:9999/BDBDCDJ/Get_fwsyq"; 
        //jdk方法实现
        Endpoint.publish(address, new Get_fwsyq_impl());
        System.out.println("Published successfully!");
    }
}

1.4启动main方法运行这个类,打印出结果Published successfully,表示服务发布成功:

1.5打开浏览器,访问我们发布的地址(注意后面得加?wsdl),大家可以看到这样的效果:

WSDL结构描述: 

1.6我们可以用SoaoUI工具来测试一下接口:

 

 OK,这样一个简单的WebService接口就OK了。

2)使用CXF开发WebService

cxf是java开发webService的一种实现框架技术。目前,cxf是主流的webService实现框架。

2.1使用cxf开发需引入cxf开发jar包

Jetty是一个内嵌的web服务器,使用JaxWsServerFactoryBean类创建工厂设置接口地址、接口类、接口实现类,创建即可发布。所以我们得引入jetty包,作为WebService发布的Server。

 2.2增加一个拦截器:

package Interceptor;

import java.util.List;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;

public class MyInterceptor extends AbstractPhaseInterceptor<SoapMessage>{
     
    public MyInterceptor(){
        // 在调用方法之前调用拦截器
        super(Phase.PRE_INVOKE);
    }
    /**
     * 拦截获取消息
     */
    public void handleMessage(SoapMessage message) throws Fault {
        Object obj = message.getContent(List.class).get(0);
        System.out.println("参数1:"+obj);
        
        Object obj1 = message.getContent(List.class).get(1);
        System.out.println("参数2:"+obj1);
        
        if(!obj.equals("slid") || obj1==null){
            throw new Fault(new IllegalArgumentException("参数1错误,请求失败"));
        }
        if(obj1==null || obj1.equals("")){
            throw new Fault(new IllegalArgumentException("参数2为空,请求失败"));
        }
    }
}

2.3使用jaws发布WebService

package Publish_interface;

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

import Dao.Get_fwsyq_impl;
import Dao.fwsyq;
import Interceptor.MyInterceptor;

public class CXF_Get_FWSYQ {
    public static void main(String[] args) {
        //1.使用jaws发布webservice
        JaxWsServerFactoryBean jsfb=new JaxWsServerFactoryBean();
        //2.设置发布服务的地址
        jsfb.setAddress("http://192.168.0.188:9999/BDBDCDJ/Get_fwsyq");
        //3.设置接口服务
        jsfb.setServiceClass(fwsyq.class);
        //4.设置服务的实现对象
        jsfb.setServiceBean(new Get_fwsyq_impl());
        jsfb.getInInterceptors().add(new LoggingInInterceptor()); // 添加in拦截器 日志拦截器
        jsfb.getOutInterceptors().add(new LoggingOutInterceptor()); // 添加out拦截器
        
        //添加自定义拦截器
        jsfb.getInInterceptors().add(new MyInterceptor());
        //5.通过工厂创建服务
        jsfb.create();
        System.out.println("Published successfully!");    
    }
}

2.4启动main方法运行这个类,打印出结果Cxfweb service published successfully,表示服务发布成功:

2.5打开浏览器,访问我们发布的地址(注意后面得加?wsdl),大家可以看到这样的效果:

 2.6我们可以用Postman工具来测试一下接口:

上边验证拦截器是否生效,下边正常填写参数,成功返回查询结果:

四、客户端调用接口:

3.1 新建一个客户端java web项目

3.2 java自带wsimport命令生成webservice客户端代码及服务调用

通过wsimport命令生成客户端代码(通过cmd进入到当前项目的src路径下,wsimport.exe命令在jdk的bin目录下)

  • 第一种方式【远程地址】wsimport -s . 接口地址(加?wsdl)
  • 第二种方式【xml文件】wsimport -s . 文件路径(文件路径后面不需要加?wsdl)

wsimport -s . http://192.168.0.188:9999/BDBDCDJ/Get_fwsyq?wsdl

 我们在看一下客户端项目:刷新一下如下:

 3.3新建一个测试类,调用一下接口方法:

package Test_client;

import dao.Fwsyq;
import dao.FwsyqService;

public class Test_class {
    public static void main(String[] args) throws Exception {
        //构建服务视图对象(从service标签name属性获取)
        FwsyqService service=new FwsyqService();
        //获取服务的实现类(从portType的name属性获取
        Fwsyq prot=service.getPort(Fwsyq.class);
        //调用方法(portType下的operation属性获取
        String info=prot.getFwsyq("slid", "202106070001");
        System.out.println("调用服务端接口方法结果是:"+info);
    }
}

3.4运行测试类结果如下:

Client console:

server console::

 OK!一个基本的接口开发过程到此结束。

参考地址:

WebService几个常见的异常

CXF报安全性错误 Cannot create a secure XMLInputFactory

WebService-JDK的wsimport命令和cxf的wsdl2java命令的区别和使用

原文地址:https://blog.csdn.net/u013163551/article/details/119491398

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

相关推荐


1.使用ajax调用varxhr;functioninvoke(){if(window.ActiveXObject){xhr=newActiveXObject("Microsoft.XMLHTTP");}else{xhr=newXMLHttpRequest();}//指定请求地址varurl="http://127.0.0.1:7777/hello?wsdl";//
               好不容易把WebService服务器端搭建起来,我们还需要客户端程序也同样跑起来才能够进行和服务器端程序的通信: 在这篇文章里面,我会先自己写代码去实现调用WebService服务器端程序,接下来,通过IDEA配置的方式来调用WebService服务端: 首先,我写了一个W
1新建一个工程项目用来做服务端增加一个MyService1类文件packagecom.zns.ws;importjavax.jws.WebMethod;importjavax.jws.WebService;importjavax.xml.ws.Endpoint;@WebServicepublicclassMyService1{publicstaticvoidmain(String[]args){
packagecom.transsion.util;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.URL;importjava.net.URLConnection;importcom.alibaba.druid.util.Base64;importcom.tra
再生产wsdl文件时重写描述文件1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Linq;4usingSystem.Web;5usingSystem.Web.Services.Description;67namespaceStrongSoftManage.Web.App8{9publicclassSoapExtens:SoapExtensi
一般情况下,使用eclipse自带的jax-ws生成webservice会自动生成2个类:ContractConnector.java packagecom.wonders.webservice.contract;importjava.text.DecimalFormat;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Date;i
一、WebService概述1.1什么是WebService 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 一个跨语言、跨平台的规范(抽象)所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务
一、什么是CXF?    ApacheCXF=Celtix+Xfire,开始叫ApacheCeltiXfire,后来更名为ApacheCXF了,以下简称为CXF。ApacheCXF是一个开源的webServices框架,CXF帮助您构建和开发webServices,它支持多种协议,比如:SOAP1.1,1,2 XML/HTTP、RESTful或者CORBA。  
工具IDEA一、构建项目1、选择SpringInitializr2、填写项目信息3、勾选webService4、勾选Thymeleaf5、项目建立完成,启动类自动生成二、写个Controller启动服务。浏览器访问/hello接口。 
1.环境win764位,vs20102.新建一个asp.netweb应用程序(同上一篇)3.添加一个web引用,引用上一篇创建的服务。注意不是服务引用。如下图 
WebService之WSDL文件讲解   恩,我想说的是,是不是经常有人在开发的时候,特别是和第三方有接口的时候,走的是SOAP协议,然后用户给你一个WSDL文件,说按照上面的进行适配,嘿嘿,这个时候,要是你以前没有开发过,肯定会傻眼,那如果你想学习的话,就认真的看下面的讲解咯:一、WSDL概述  
在websrvice发布文件的webconfig中加入<httpRuntimemaxRequestLength="102400"/> <webServices>     <protocols>       <addname="HttpPost"/>       <addname="HttpGet"/>     </protocols>   
 代码比较简单,按照如下来操作即可,只是jar包有很多问题,比如找不到classnotFondspring、以及找不到xfile.xml、以及xfile.xml中的一个参数问题,以及2.0 spring。jar和spring1.6.2冲突问题,总之这个小demo报了一堆错误,其实都是jar的问题,为了让大家减少这方面的错误,所以我提供
 一、soapUI简介SOAP:   WebService通过Http协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息头的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用WebService。 
参考,感谢https://blog.csdn.net/hj7jay/article/details/727224381.环境:win764位,jdk1.8.0_201 EclipseJavaEEIDEforWebDevelopers.Version:Mars.1Release(4.5.1)2.创建一个普通的java项目,名字是TheService在src目录下创建一个com.hyan.service包,在此包下创建
CXF实现RestfulWebService基础示例一、写在前面IDE:IDEA14JDK:1.7CXF:2.6.2示例来源:%CXF_HOME%\samples\jax_rs\basic发布方式:JAXRSServerFactoryBean的create()方法调用方式:URL的openStream()方法、HttpClient的executeMethod()方法二、服务端(Java项目)1.准备Jar包
封装helper类:classWebServiceHelper{///<summary>///1.get请求http方法///</summary>///<paramname="url">基础url</param>///<paramname="method">请求方法</param>///<paramnam
.net客户端调用java或.netwebservice进行soapheader验证最近项目中有业务需要跨平台调用web服务,客户端和服务器之间采用非对称加密来保证数据的安全性,webservice的安全验证基于soapheader。借此机会,顺便整理一下调用.netwebservice和javawebservice的验证方式,记录下来。
Node.jshttps://www.cnblogs.com/goldlong/p/8027997.htmlQQ音乐apihttps://juejin.im/post/5a35228e51882506a463b172#heading-11?tdsourcetag=s_pcqq_aiomsgGit把本地仓库上传到GitHbubhttps://blog.csdn.net/zamamiro/article/details/70172900git删除本地仓库https://blog.cs
转载自:孤傲苍狼 WebService学习总结(三)——使用JDK开发WebService一、WebService的开发手段使用Java开发WebService时可以使用以下两种开发手段1、 使用JDK开发(1.6及以上版本)-->详见:本文2、使用CXF框架开发-->详见:其他文章二、使用JDK开发WebServi