WebService
demo:https://www.cnblogs.com/fengwenzhee/p/6915606.html
4种客户端实现方式:http://blog.csdn.net/csdn_gia/article/details/54863549
soapUI工具:webservice服务端配置好,可通过soapUI工具模拟发送soap消息体,各种测试,总之很方便的一工具
soapUtils工具类:通过HttpConnection来访问webservice服务(soap1.1,soap1.2),其中还有工具的使用方式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package tools.perkinelmer.utls; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; /** * soap工具 * @author wangj01052 * */ public class SoapUtil { /** * * @param endpoint * @param action 有值soap1.1;无值soap1.2协议 * @param soapXml soap1.1;soap1.2 文本不一样注意改变 * @return * @throws IOException */ public static String invokeSrvSoap1(String endpoint,String action, String soapXml) throws IOException{ String result =""; //第一步:创建服务地址,不是WSDL地址 URL url = new URL("http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx"); //第二步:打开一个通向服务地址的连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //第三步:设置参数 //3.1发送方式设置:POST必须大写 connection.setRequestMethod("POST"); if(action==null||"".equals(action)){//soap1.2协议 //3.2设置数据格式:content-type connection.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8"); }else{//soap1.1协议 //3.2设置数据格式:content-type connection.setRequestProperty("Content-Type", "text/xml;charset=utf-8"); connection.setRequestProperty("SOAPAction", action); } //3.3设置输入输出,因为默认新创建的connection没有读写权限, connection.setDoInput(true); connection.setDoOutput(true); //第四步:组织SOAP数据,发送请求 OutputStream os = connection.getOutputStream(); os.write(soapXml.getBytes(StandardCharsets.UTF_8)); //第五步:接收服务端响应,打印 int responseCode = connection.getResponseCode(); if(200 == responseCode){//表示服务端响应成功 InputStream is = connection.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); String temp = null; while(null != (temp = br.readLine())){ sb.append(temp); } result = sb.toString(); is.close(); isr.close(); br.close(); } os.close(); return result; } //工具调用方式类似,这里不能直接用 public static void main(String[] args) throws Exception { //soap1.1协议 String soapXML1 = "<?xml version=\"1.0\" ?><S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\"><S:Body><getCountryCityByIp xmlns=\"http://WebXml.com.cn/\"><theIpAddress>127.0.0.1</theIpAddress></getCountryCityByIp></S:Body></S:Envelope>"; String endPoint1 = "http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx"; String soapAction1 ="http://WebXml.com.cn/getCountryCityByIp"; System.out.println(invokeSrvSoap1(endPoint1, soapAction1, soapXML1)); //soap1.2协议 String soapXML2 = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\"><soap12:Body><getCountryCityByIp xmlns=\"http://WebXml.com.cn/\"><theIpAddress>127.0.0.1</theIpAddress></getCountryCityByIp></soap12:Body></soap12:Envelope>"; String endPoint2 = "http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx"; System.out.println(invokeSrvSoap1(endPoint2,null, soapXML2)); } }
客户端改变目标地址:
String endpointURL = "http://127.0.0.1:8181/WS_Server/WebService"; BindingProvider bp = (BindingProvider)wsImpl; bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package client; import javax.xml.ws.BindingProvider; import tools.perkinelmer.service.serviceimpl.WebServiceImpl; import tools.perkinelmer.service.serviceimpl.WebServiceImplService; /** * webservice调用服务的方式一:通过java工具Wsimport * 该种方式使用简单,但一些关键的元素在代码生成时写死到生成代码中,不方便维护,所以仅用于测试。 * @author wangj01052 * */ public class WSClient { public static void main(String[] args){ WebServiceImplService factory = new WebServiceImplService(); WebServiceImpl wsImpl =factory.getWebServiceImplPort(); //4.1改变目标地址 String endpointURL = "http://127.0.0.1:8181/WS_Server/WebService"; BindingProvider bp = (BindingProvider)wsImpl; bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL); String resResult =wsImpl.sayHello("xiaoping"); System.out.println("调用WebService的sayHello方法返回结果:"+resResult); } }
可能会遇到的问题:
1)springboot+mybatis+webservice 依赖注入@Autowired不起作用
在项目config文件下新建两个文件,WebApplicationContextLocator.java,SpringBootBeanAutowiringSupport.java
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package tools.perkinelmer.config; import org.apache.ibatis.logging.Log; import org.apache.ibatis.logging.LogFactory; import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.web.context.WebApplicationContext; public abstract class SpringBootBeanAutowiringSupport { private static final Log logger = LogFactory.getLog(SpringBootBeanAutowiringSupport.class); /** * This constructor performs injection on this instance, * based on the current web application context. * <p>Intended for use as a base class. * @see #processInjectionBasedOnCurrentContext */ public SpringBootBeanAutowiringSupport() { System.out.println("SpringBootBeanAutowiringSupport.SpringBootBeanAutowiringSupport"); processInjectionBasedOnCurrentContext(this); } /** * Process {@code @Autowired} injection for the given target object, * based on the current web application context. * <p>Intended for use as a delegate. * @param target the target object to process * @see org.springframework.web.context.ContextLoader#getCurrentWebApplicationContext() */ public static void processInjectionBasedOnCurrentContext(Object target) { Assert.notNull(target, "Target object must not be null"); WebApplicationContext cc = WebApplicationContextLocator.getCurrentWebApplicationContext(); if (cc != null) { AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); bpp.setBeanFactory(cc.getAutowireCapableBeanFactory()); bpp.processInjection(target); } else { if (logger.isDebugEnabled()) { logger.debug("Current WebApplicationContext is not available for processing of " + ClassUtils.getShortName(target.getClass()) + ": " + "Make sure this class gets constructed in a Spring web application. Proceeding without injection."); } } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package tools.perkinelmer.config; import javax.servlet.ServletContext; import javax.servlet.ServletException; import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; @Configuration public class WebApplicationContextLocator implements ServletContextInitializer { private static WebApplicationContext webApplicationContext; public static WebApplicationContext getCurrentWebApplicationContext() { return webApplicationContext; } /** * 在启动时将servletContext 获取出来,后面再读取二次使用。 * @param servletContext * @throws ServletException */ @Override public void onStartup(ServletContext servletContext) throws ServletException { webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext); } }
之后在websevice实现类上继承SpringBootBeanAutowiringSupport即可,可参考
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package tools.perkinelmer.service.serviceImpl; import java.util.List; import java.util.Map; import javax.jws.WebService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import tools.perkinelmer.config.SpringBootBeanAutowiringSupport; import tools.perkinelmer.mapper.CommMapper; import tools.perkinelmer.service.IPKISignalWS; @WebService @Service public class PKISignalWSImpl extends SpringBootBeanAutowiringSupport implements IPKISignalWS { @Autowired(required=true) private CommMapper commMapper; @Override public String getPatientNameByBLH(String BLH) { String sql = "exec usp_GetPatientNameByBLH @BLH = '"+BLH+"'"; List<Map<String,Object>> result= commMapper.commSelectSql(sql); return result.get(0).toString(); } }
这样操作后就能@Autowired就能生效了
参考:https://www.jianshu.com/p/125258ada53b
1.介绍
webservice主要解决两个系统两个应用程序间的远程调用,它提供了webapi方式访问,跨语言跨平台
2.原理
webservice的客户端与服务端进行交互的时候使用xml来传递数据,
soap协议,即简单对象访问协议,它是webservice的客户端与服务端进行交互的时候遵守的一个协议
3.方式
通过jdk自带工具wsimport,根据服务说明书生成本地java代码,之后通过这个本地代码访问webservice
wsimport -s . -p webservice http://127.0.0.1:8080/helloService?wsdl
webservice:java文件下载到本地的文件夹位置(相对cmd命令位置)
/helloService:提供调用的类文件名
4.例子
1)服务端
1.1 IMyServer
package test; import javax.jws.WebService; @WebService public interface IMyServer { public int add(int a,int b); public int minus(int a,int b); }
1.2 MyServerImpl 实现类
package test; import javax.jws.WebService; @WebService(endpointInterface="test.IMyServer") public class MyServerImpl implements IMyServer{ @Override public int add(int a, int b) { System.out.println(a+"+"+b+"="+(a+b)); return a+b; } @Override public int minus(int a, int b) { System.out.println(a+"-"+b+"="+(a-b)); return a-b; } }
3.主程序发布代码
package test; import javax.xml.ws.Endpoint; public class test { public static void main(String[] args){ String address = "http://localhost:9999/ns"; Endpoint.publish(address, new MyServerImpl()); } }
2)客户端
先使用wximport方式下载分享类及其关联类,在将java文件都复制到新客户端项目中
调用
import testwebservice.IMyServer; import testwebservice.MyServerImplService; public class application { public static void main(String[] args){ IMyServer myserver =new MyServerImplService().getMyServerImplPort(); Integer result = myserver.add(2, 2); System.out.println(result); } }
5. 网络上很多wsdl资源可以获取别人资源
http://www.webxml.com.cn/zh_cn/web_services.aspx
获得手机归属地webservce:
wsimport -s . -p lenve.test.phone http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl