业务场景:给一家公司的两个系统之间做部分数据做同步,A系统中进行业务操作后同步到B系统中,这样就不需要B系统再次进行操作了。
开发方案:B系统搭建WebService服务器,A系统业务操作后通过发送请求将参数传入B系统中自动执行业务操作。
第一步,搭建WebService服务,建立WebService接口及实现类:
/** * WebService接口 * @date 2018年5月25日09:09:24 * @author 拽拽很乖 */ public interface IOrderPluginWebService { /** * webService接口 * @author 拽拽很乖 * @date 2018年5月25日09:15:18 * @param type 类型 * @param pk_order 主键 * @return 是否同步成功 : * true 同步成功 * false 同步失败 */ public boolean sendDataToOrderPlugin (String type,String[] pk_order); }
/** * webService接口实现类 * @author 拽拽很乖 * @date 2018年5月25日09:27:18 */ public class OrderReportWebServiceImpl implements IOrderPluginWebService { @Override public boolean sendDataToOrderPlugin (String type,String[] pk_order) { //业务操作,逻辑处理 } }
因为本次主要说明WebService服务搭建以及连接,业务逻辑处理就不贴上来了。
第二步、创建wsdl文件及upm文件:
右键接口选择Generate WSDL以及Publish Web Service,创建好wsdl文件以及upm文件。当然也可以在接口上添加@WebService注解,没有upm自动插件一般用注解。
第三步:浏览器测试是否发布成功:
启动服务端代码,打开IE浏览器输入地址测试,成功后就可以看到刚才发布的接口,点开后或看到如下图所示的xml格式网页,表示WebService接口发布成功。
第四步:SOAPUI测试接口:
打开soapUI工具,新建测试工程,右键Projects新建一个SOAP项目,project name随意填写,WSDL写上述图所示浏览器中测试的带有"?wsdl"结尾的地址。
填写参数后就可以测试了:启动后WebService实现类就可以接到测试额参数,至此,WebService服务端搭建成功。
第五步:发送soap请求:
/** * 发送SOAP请求 * @param xmlString XML文件 * @return webService返回结果 * @throws Exception * @author 拽拽很乖 * @date 2018年5月30日10:30:21 */ private String sendPost(String xmlString) ? ?throws Exception { //HttpURLConnection 发送SOAP请求 URL url = new URL(URL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); ? ?conn.setRequestMethod("POST"); ? ?conn.setUseCaches(false); ? ?conn.setDoInput(true); ? ?conn.setDoOutput(true); ? ?conn.setConnectTimeout(30*1000); ? ?conn.setReadTimeout(30*1000); ? DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); ? ?dos.write(xmlString.getBytes("utf-8")); ? ?dos.flush(); ? ?BufferedReader reader = new BufferedReader(new InputStreamReader( conn.getInputStream(), "utf-8")); ? ?String line = null; ? ?StringBuffer strBuf = new StringBuffer(); ? ?while ((line = reader.readLine()) != null) { ?? ?s?trBuf.append(line); ? ?} ? ?dos.close(); ? ?reader.close(); ? ?return strBuf.toString(); }
其中参数XML就按照soapUI测试时的xml格式配置即可,需要传入的参数写入对应的位置即可,URL就是soapUI测试时的URL。
/** * webService URL * @author 拽拽很乖 * @date 2018年5月30日10:36:13 */ private static final String URL = "http://10.31.0.67:88/uapws/service/IOrderPluginWebService"; /** * @author 拽拽很乖 * @date 2018年5月29日17:17:21 * @param type * 打开或关闭类型 * @param pk_order * 采购订单主键 * @return soap请求XML * @throws Exception */ private String CreateOrder(String type, String pk_order) throws Exception { ? ?StringBuffer xmlString = new StringBuffer(); ? ?DocumentBuilderFactory fct = DocumentBuilderFactory.newInstance(); ? ?DocumentBuilder buil = fct.newDocumentBuilder(); ? ?Document doc = buil.newDocument(); ? ?Element ps = doc.createElement( "soapenv:Envelope"); ? ?Element billHeader = doc.createElement( "soapenv:Header"); ? ?Element billBody = doc.createElement( "soapenv:Body"); ? ?Element itemIor = doc.createElement( "ior:sendDataToOrderPlugin"); Attr soapenv = doc.createAttribute( "xmlns:soapenv"); ? ?Attr ior = doc.createAttribute("xmlns:ior"); ?? ?doc.appendChild(ps); ?? ?ps.appendChild(billHeader); ? ?ps.appendChild(billBody); ? ?ps.setAttributeNode(soapenv); ? ?ps.setAttributeNode(ior); ? ?billBody.appendChild(itemIor); ? ?Text soapenv_v = doc.createTextNode( "http://schemas.xmlsoap.org/soap/envelope/"); ? ?Text ior_v = doc.createTextNode( "http://orderreport.pu.itf.nc/IOrderPluginWebService"); ? ?soapenv.appendChild(soapenv_v); ? ?Element str_v = doc.createElement("string"); ? ?Text code_v = doc.createTextNode(type); ? ?toXML(itemIor, str_v, code_v); ? ?Element strItem_v = doc.createElement( "stringItem"); ? ?Text pk_order_v = doc.createTextNode( pk_order.toString()); ? ?toXML(itemIor, strItem_v, pk_order_v); ? ?XML_VoucherTranslator. writeXMLFormatString(xmlString, doc, -2); ? ?return xmlString.toString(); } private static void toXML(Element e, Element e1, Text text) { ? ?e.appendChild(e1); ? ?e1.appendChild(text); }
第六步:测试:
开启两端的代码,先运行WebService服务端代码,再运行客户端(请求)代码进行测试。
总结:
WebService是是独立的、可跨平台、跨语言、低耦合的非常强大的web应用程序,通过XML和SOAP更加灵活。减少了不少传统的接口开销,开发便捷。