精华内容
下载资源
问答
  • 2018-07-20 14:37:30

    1.在web.xml文件中加入这段代码:

    <!-- webservice服务配置 -->
    <servlet>
        <servlet-name>cxf</servlet-name> 
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/xinbo_hip/bm_Services/*</url-pattern>
    </servlet-mapping> 
      
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/dorado-home/webService.xml</param-value>
    </context-param>
    <!-- webservice服务配置 -->

    2.maven的pom文件中加入:

    <dependency>
        <groupId>org.apache.cxf</groupId>
    	<artifactId>cxf-rt-frontend-jaxws</artifactId>
    	<version>2.5.1</version>
    	<exclusions>
    	    <exclusion>
    		    <artifactId>jaxb-impl</artifactId>
    			<groupId>com.sun.xml.bind</groupId>
    		</exclusion>
    	</exclusions>
    </dependency>
    <dependency>
    	<groupId>com.sun.xml.bind</groupId>
    	<artifactId>jaxb-xjc</artifactId>
    	<version>2.1</version>
    </dependency>

    3.配置文件中webService.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:jaxws="http://cxf.apache.org/jaxws"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://cxf.apache.org/jaxws
            http://cxf.apache.org/schemas/jaxws.xsd">
       <import resource="classpath:META-INF/cxf/cxf.xml"/>
       <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/> 
       <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> 
    
        <bean id="dataWebServiceProvider" class="com.xinbo.ws.Impl.DataWebServiceProviderImpl"/>
     
         <bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
         
        <bean id="outLoggingInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
    <!--     注意下面的address,这里的address的名称就是访问的WebService的name -->
        
        <jaxws:server id="iDataWebServiceProvider" serviceClass="com.xinbo.ws.IDataWebServiceProvider" address="/wsDataServiceProvider">
            <jaxws:serviceBean>
                <ref bean="dataWebServiceProvider"/>
            </jaxws:serviceBean>
            <jaxws:inInterceptors>
                <ref bean="inMessageInterceptor"/>
            </jaxws:inInterceptors>
            <jaxws:outInterceptors>
                <ref bean="outLoggingInterceptor"/>
            </jaxws:outInterceptors>
        </jaxws:server>  
    </beans>

    jaxws:server   个人理解就是在配置文件中实例化一个JaxWsServerFactoryBean对象。这个类是发布服务的作用。上面的配置意思相当于:

    public static void main(String[] args) {
        JaxWsServerFactoryBean jsfb = new JaxWsServerFactoryBean();
        //1.服务提供者实现的接口
        jsfb.setServiceClass(IDataWebServiceProvider.class);
        //2.指定访问路径
        jsfb.setAddress("http://localhost:8083/xinbo_hip/bm_Services/wsDataServiceProvider");
        //3.指定服务实现类
        jsfb.setServiceBean(new DataWebServiceProviderImpl());
        jsfb.getInInterceptors().add(new LoggingInInterceptor());
        jsfb.getOutInterceptors().add(new LoggingOutInterceptor());
        //4.发布
        jsfb.create();
        System.out.println("发布成功...");
    }

    4.load-on-startup什么意思?

    1. load-on-startup 元素标记容器是否应该在web应用程序启动的时候就加载这个servlet,(实例化并调用其init()方法)。
    2. 它的值必须是一个整数,表示servlet被加载的先后顺序。
    3. 如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载。
    4. 如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。

    5.@WebParam(name="request")作用?

    接口在被编译为class文件的时候不能保存参数名 ,所以需要这个标签保留名字,自己在开发中吃过这个亏,记录一下,不要再犯了。所以如果没有加注解,参数将被命名为arg0。

    6.webservice接口

    @WebService(targetNamespace="http://ws.xinbo.com/",name = "dataWebServiceProvider", serviceName = "DataWebServiceProvider")
    public interface IDataWebServiceProvider {
        @WebResult(name="return",targetNamespace="http://ws.xinbo.com/")   
        @WebMethod
        public String refund(@WebParam(name="request") String request);
        @WebMethod
    	public String getMedicationRecord(@WebParam(name="request") String request);
        @WebMethod
    	public String sendWxMsg(@WebParam String code, @WebParam String paramJson);
    }

    7.webservice实现类

    @Component
    public class DataWebServiceProviderImpl implements IDataWebServiceProvider{
       
        /**
         * 发送消息
         */
    
        @Override
        public String getMedicationRecord(String request) {
           String result="调用失败";
        	MobileSyshealthOrgInfo mobileSyshealthOrgInfo=systemService.getMbInfo("400686566");
    		if(mobileSyshealthOrgInfo!=null)		{
    			RequestBean requestBean=new RequestBean();
    		    requestBean.setAddress(mobileSyshealthOrgInfo.getWsurl());
    			requestBean.setId("getMedicationRecord");
    			requestBean.setXml(request);
    			ResponseBean responseBean = SendConnect.sendXmlMethod(requestBean);
    			result=responseBean.getResult();
    		}
        	
           	
           return result;
           
        }
    
    
    	@Override
    	public String sendWxMsg(String code, String paramJson) {
    		Gson gson = new Gson();
    		Map<String, Object> map = null;
    		try{
    			map = gson.fromJson(paramJson, new TypeToken<Map<String, Object>>() {}.getType());
    		}catch(Exception e){
    			return "参数解析失败";
    		}
    		String content = StringUtil.parseString(map.get("content"));
    		String Id_No = StringUtil.parseString(map.get("Id_No"));
    		TPatientUser user = mobileDbService.getTPatientUserByParams(null,null,Id_No,null);
    		if(user==null){
    			return "根据身份证号查无此人";
    		}
    		WxMpKefuMessage message=new WxMpKefuMessage();
    		message.setMsgType(WxConsts.KefuMsgType.TEXT);
    		message.setContent(content);
    		message.setToUser(user.getWxId());
    		wxMpService.setWxMpConfigStorage(WeiXinMpInit.defaultStorage);
    		try {
    			wxMpService.getKefuService().sendKefuMessage(message);
    		} catch (WxErrorException e) {
    			return "微信错误代码:"+e.getError().getErrorCode()+";微信错误描述:"+e.getError().getErrorMsg();
    		}
    		return "发送成功";
    	}
        
    }

    8.用soupUI测试接口。

    在摸索中前进。。。。。

     

    更多相关内容
  • WebServiceServer和Client(可运行),代码完整,直接编译运行。如需了解webService的,这对于你很有帮助
  • 因为工作关系需要从事Webservice的开发工作,公司的webserivce是由Apache的AXIS来实现的,以前对这了解不算多,不过经过几天的研究,特奉上小小的心得篇。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&...
    阅读更多

           因为工作关系需要从事Webservice的开发工作,公司的webserivce是由Apache的AXIS来实现的,以前对这个了解不算多,不过经过几天的研究,特奉上小小的心得一篇。

            先介绍下本人开发环境吧。 JDK 1.4.2 + Myeclipse 6.0(实在经不起诱惑,尝尝鲜) + Tomcat 5.0.28 + AXIS 1.4。 AXIS 1.4包可以在http://ws.apache.org/axis/ 找到。 假设所有的环境你已经搭好,并且AXIS包也已经下好了。OK, Here we go~

             解压axis-bin-1_4.zip这个包可以看到webapps目录,双击进入把里面的AXIS文件夹拷到 %TOMCAT_HOME%\webapps目录下,之后拷贝activation.jar、mail.jar、tools.jar到%TOMCAT_HOME%\webapps\axis\WEB-INF\lib目录下。启动tomcat,访问http://localhost:8080/axis/happyaxis.jsp  如果访问成功,恭喜你!基本的配置你已经做完了。

    PS:此处的%TOMCAT_HOME%指的是Tomcat的安装目录,至于那另外的三个jar包,J2EE 1.4库里就能找的到。

            现在来说一下最关键的Webservice的发布。AXIS提供了两种发布方式,一种是即时发布(Instant Deployment),另外一种是定制发布(Custom Deployment)。即时发布提供了一种非常简单的webservice的发布方式,但是其中限制太多,因此在实际的开发中定制发布才是首选。这里也将会以定制发布为重点来介绍。

         1.即时发布 JWS (Java Web Service) Files - Instant Deployment     

        即时发布提供了一种非常简单发布方式,发布者只要有Java源代码(也就是.java文件),然后把其后缀名改成jws(也就是 java web service的缩写)拷贝到%TOMCAT_HOME%\webapps\axis目录下即完成了所有的发布工作。AXIS的编译引擎会处理接下来的所有事情。下面是一段示例代码:

    java 代码
    1. public   class  HelloAXIS {   
    2.        
    3.      public  String Hello(String name){   
    4.          return   "AXIS say hello to "  + name;   
    5.     }   
    6. }  

            把 HelloAXIS.java 文件改成 HelloAXIS.jws 然后拷贝到%TOMCAT_HOME%\webapps\axis目录下,启动Tomcat之后访问 http://localhost:8080/axis/HelloAXIS.jws  如果能看到 Click to see the WSDL这个超链接就说明已经发布成功了,点击进去就可以看到这个Webservice的WSDL描述文件。server端的发布已经完成了,接下来就是编写Client端测试代码了。

    java 代码
    1. package  com.chnic.test;   
    2.   
    3. import  java.net.URL;   
    4.   
    5. import  javax.xml.namespace.QName;   
    6.   
    7. import  org.apache.axis.client.Call;   
    8. import  org.apache.axis.client.Service;   
    9.   
    10. public   class  Test {   
    11.        
    12.      public   static   void  main(String[] args)  throws  Exception{   
    13.         String targetEendPoint =  "http://localhost:8080/axis/HelloAXIS.jws" ;   
    14.         Service service =  new  Service();   
    15.         Call call = (Call) service.createCall();               
    16.         call.setOperationName( new  QName(targetEendPoint,  "Hello" ));   
    17.         call.setTargetEndpointAddress( new  URL(targetEendPoint));   
    18.         String result = (String) call.invoke( new  Object[]{ "Robert" });   
    19.         System.out.println(result);   
    20.     }   
    21. }   

           测试代码很简单,如果熟悉java反射机制的朋友不用两分钟就能看明白。运行后客户端控制台出现 AXIS say hello Robert。测试成功。果然很简单吧。不过在这简单背后却是以牺牲灵活性为代价的。假如你现在手里只有.class 或者一个jar包,jws就不再能满足你的需求了,最要命的就是即时发布不支持带包的类,这点AXIS的用户手册上写的也很明白。

     Important: JWS web services are intended for simple web services. You cannot use packages in the pages, and as the code is compiled at run time you can not find out about errors until after deployment. Production quality web services should use Java classes with custom deployment.

     

          2.定制发布 Custom Deployment - Introducing WSDD

          比起即时发布定制发布更加烦琐也更复杂,但是换来的却是更大的灵活性,因此在实际项目中定制发布还是不二的选择。定制发布需要你自己编写一个WSDD(Web Service Deployment Descriptor)文件,这个东东类似与XML稍后会做出介绍。废话不多说,我们来看代码:

     

    java 代码
    1. package  com.chnic.webservice;   
    2.   
    3. public   class  HelloWorld {   
    4.        
    5.      public  HelloWorld(){   
    6.            
    7.     }   
    8.        
    9.      public  String hello(String str){   
    10.          return   "Hello "  + str;   
    11.     }   
    12.        
    13.      public   int  add( int  a,  int  b){   
    14.          return  a + b;   
    15.     }   
    16.        
    17. }   

            一个带包的很简单的类,在eclipse下编译后按照包名拷到 %TOMCAT_HOME%\webapps\axis\WEB-INF\classes 目录下。以这个类为例,拷贝完之后这个HelloWorld.class的路径就是 %TOMCAT_HOME%\webapps\axis\WEB-INF\classes\com\chnic\webservice。PS: 如果嫌这样太麻烦,可以另外建一个Java Web工程用myeclipse的发布工具发布到Tomcat之后,整体一次性拷贝到websericve的工程中。

           接下来就需要编写发布文件deploy.wsdd。到%TOMCAT_HOME%\webapps\axis\WEB-INF 目录下建立这个文件并在其中添加如下内容:

    xml 代码
    1. < deployment   xmlns = http://xml.apache.org/axis/wsdd/  
    2.             xmlns:java = "http://xml.apache.org/axis/wsdd/providers/java" >   
    3.        
    4.      < service   name = "HelloWorld"   provider = "java:RPC" >   
    5.          < parameter   name = "className"   value = "com.chnic.webservice.HelloWorld" />   
    6.          < parameter   name = "allowedMethods"   value = "*" />        
    7.     </ service >   
    8. </ deployment >   

           简单的介绍下各个节点的含义,"HelloWorld"当然是这个webservice的名字,后面紧跟的java:RPC指的是服务类型。这里一共有有4种类型,分别是:RPC, Document, Wrapped 和 Message。有兴趣可以看下 org.apache.axis.providers这个包和子包下面的类的API文档。之后的parameter节点第一个当然是指出具体的类,第二个从字面上也很好理解:允许调用的方法。这里的配置告诉引擎可以调用所有的public方法,当然你也可以自己指定。

         编写完配置发布文件之后,cmd打开windows的控制台,进入%TOMCAT_HOME%\webapps\axis\WEB-INF目录下键入如下命令  

    1. java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd  

           之后控制台返回Processing file deploy.wsdd 和 Done processing 这两段话即说明发布成功。(此时会在同级目录生成一个server-config.wsdd文件 )在这里的AdminClient是AXIS提供的一个客户端管理工具。至于java.ext.dirs的含义可以去了解一下classloader和JVM类装载机制方面的知识,在这里就不多解释。 还有一点要注意的是在发布的时候Tomcat服务必须处于启动状态,否则就会抛出一堆无法连接的异常信息。发布成功之后你可以通过访问 http://localhost:8080/axis/servlet/AxisServlet 来查看你所有的定制发布的服务。

    客户端测试代码
    1. String targetEendPoint =  "http://localhost:8080/axis/services/HelloWorld" ;   
    2. Service service =  new  Service();   
    3. Call call = (Call) service.createCall();   
    4. call.setTargetEndpointAddress( new  URL(targetEendPoint));   
    5.   
    6. call.setOperationName( new  QName(targetEendPoint,  "hello" ));        
    7. String result = (String) call.invoke( new  Object[]{ "Robert" });   
    8. System.out.println(result);   
    9.   
    10. call.setOperationName( new  QName(targetEendPoint,  "add" ));   
    11. Integer res = (Integer) call.invoke( new  Object[]{ new  Integer( 1 ),  new  Integer( 2 )});   
    12. System.out.println( "The result is: "  + res);  

           运行测试代码,控制台显示 Hello Robert 和 The result is: 3 这两句话,说明发布成功。仔细观察下发现其实除了那个targetEndpoint 之外,即时发布和定制发布的客户端调用代码基本上都是一样的。定制发布的URL可以在WSDL文件里找到。  其实定制发布还有一些高级特性,这个就留到下一篇再说吧。

    原文地址:https://chnic.iteye.com/blog/127343

    展开全文
  • WebService技术详解 ()

    2020-08-11 17:47:38
    WebService WebService简介 Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、...

    转载:https://blog.csdn.net/c99463904/article/details/76018436

    WebService简介

    Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。

    简单的说,WebService就是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然。跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 远程调用,就是一台计算机的应用可以调用其他计算机上的应用。例如:支付宝,支付宝并没有银行卡等数据,它只是去调用银行提供的接口来获得数据。还有天气预报等,也是气象局把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。

    WebService原理

    XML,SOAP和WSDL就是构成WebService平台的三大技术 。

    • WebService采用Http协议来在客户端和服务端之间传输数据。WebService使用XML来封装数据,XML主要的优点在于它是跨平台的。

    • WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议规定的。

    • WebService服务器端首先要通过一个WSDL文件来说明自己有什么服务可以对外调用。简单的说,WSDL就像是一个说明书,用于描述WebService及其方法、参数和返回值。 WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。

    WebService交互的过程就是,WebService遵循SOAP协议通过XML封装数据,然后由Http协议来传输数据。

    JAVA WebService规范

    Java 中共有三种WebService 规范,分别是JAXM&SAAJ、JAX-WS(JAX-RPC)、JAX-RS。

    (1)JAX-WS:

    JAX-WS(Java API For XML-WebService)。早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(java API For XML-Remote Procedure Call)目前已经被JAX-WS 规范取代,JAX-WS 是JAX-RPC 的演进版本,但JAX-WS 并不完全向后兼容JAX-RPC,二者最大的区别就是RPC/encoded 样式的WSDL,JAX-WS 已经不提供这种支持。JAX-RPC 的API 从JAVA EE5 开始已经移除,如果你使用J2EE1.4,其API 位于javax.xml.rpc.包。JAX-WS(JSR 224)规范的API 位于javax.xml.ws.包,其中大部分都是注解,提供API 操作Web 服务(通常在客户端使用的较多,由于客户端可以借助SDK 生成,因此这个包中的API 我们较少会直接使用)。

    (2)JAXM&SAAJ:

    JAXM(JAVA API For XML Message)主要定义了包含了发送和接收消息所需的API,相当于Web 服务的服务器端,其API 位于javax.messaging.*包,它是Java EE 的可选包,因此你需要单独下载。

    SAAJ(SOAP With Attachment API For Java,JSR 67)是与JAXM 搭配使用的API,为构建SOAP 包和解析SOAP 包提供了重要的支持,支持附件传输,它在服务器端、客户端都需要使用。这里还要提到的是SAAJ 规范,其API 位于javax.xml.soap.*包。

    JAXM&SAAJ 与JAX-WS 都是基于SOAP 的Web 服务,相比之下JAXM&SAAJ 暴漏了SOAP更多的底层细节,编码比较麻烦,而JAX-WS 更加抽象,隐藏了更多的细节,更加面向对象,实现起来你基本上不需要关心SOAP 的任何细节。那么如果你想控制SOAP 消息的更多细节,可以使用JAXM&SAAJ。

    (3)JAX-RS:

    JAX-RS 是JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行。

    WebService入门案例

    服务端的实现

    我们来实现一个天气系统的案例,客户端发送城市名称,服务器端回应相应的天气。

    1.  编写SEI(Service Endpoint Interface),SEI在webservice中称为portType,在java中就是普通接口 
    
    public interface WeatherInterface {
        public String queryWeather(String cityName);
    }
    
     
    2.  编写SEI实现类,此类作为webservice提供服务类 
    
    @WebService     //@WebService表示该类是一个服务类,需要发布其中的public的方法
    public class WeatherInterfaceImpl implements WeatherInterface {
    
        @Override
        public String queryWeather(String cityName) {
            System.out.println("获取城市名"+cityName);
            String weather="暴雨";    
            return weather;
        }
    
    }
     
    3.  第三步:发布服务,Endpoint类发布服务,publish方法,两个参数:1.服务地址;2.服务实现类 
    
    public class WeatherServer {
        public static void main(String[] args) {
            Endpoint.publish("http://127.0.0.1:12345/weather", new WeatherInterfaceImpl());
        }
    }
    
     
    4. 测试服务是否发布成功,通过阅读wsdl,确定客户端调用的接口、方法、参数和返回值存在,证明服务发布成功
    
    //我们在浏览器输入 http://127.0.0.1:12345/weather?wsdl 来获取wsdl文件进行阅读
    
    //wsdl,是以XML文件形式来描述WebService的”说明书”,有了说明书,我们才可以知道如何使用或是调用这个服务.
    
    //现在我们还不知道怎么去阅读,后面我们会详解,只要能获取到,就能确定WebService服务发布成功 
     

    这里写图片描述

    客户端的实现

    //客户端调用服务有很多种方法,我们先用工具生成客户端代码,后面会详解  
    
    //wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码。
    
    1.创建一个客户端空项目,cmd命令行进入此项目的src目录
      使用以下命令生成客户端代码  
    
        wsimport -s . http://127.0.0.1:12345/weather?wsdl
    
        -s是指编译出源代码文件,后面的.(点)指將代码放到当前目录下.
         最后面的http….是指获取wsdl说明书的地址
    
     

    这里写图片描述

    2.编写客户端
    public class WeatherClient {
    
        public static void main(String[] args) {
            //创建服务视图,视图是从wsdl文件的service标签的name属性获取
            WeatherInterfaceImplService weatherInterfaceImplService=new WeatherInterfaceImplService();  
    
            //获取服务实现类,实现类从wsdl文件的portType的name属性获取
            WeatherInterfaceImpl weatherInterfaceImpl=weatherInterfaceImplService.getPort(WeatherInterfaceImpl.class); 
            //获取查询方法,从portType的operation标签获取
            String weather=weatherInterfaceImpl.queryWeather("北京");
            System.out.println(weather);
    
        }
    
    }
    
     

    至此,我们的客户端就可以获取远程服务端的数据,接下来我们来详解一下各个部分。

    WSDL

    WSDL(Web Services Description Language), web服务描述语言,他是webservice服务端使用说明书,说明服务端接口、方法、参数和返回值,WSDL是随服务发布成功,自动生成,无需编写。

    文档结构

    这里写图片描述

    Service:相关端口的集合,包括其关联的接口、操作、消息等。

    Binding:特定端口类型的具体协议和数据格式规范

    portType: 服务端点,描述 web service可被执行的操作方法,以及相关的消息,通过binding指向portType

    message: 定义一个操作(方法)的数据参数

    types: 定义 web service 使用的全部数据类型

    阅读方式

    WSDL文档应该从下往上阅读。

    1.先看service标签,看相应port的binding属性,然后通过值查找上面的binding标签。

    2.通过binding标签可以获得具体协议等信息,然后查看binding的type属性

    3.通过binding的type属性,查找对应的portType,可以获得可操作的方法和参数、返回值等。

    4.通过portType下的operation标签的message属性,可以向上查找message获取具体的数据参数信息。

    SOAP

    SOAP即简单对象访问协议,他是使用http发送的XML格式的数据,它可以跨平台,跨防火墙,SOAP不是webservice的专有协议。

    SOAP=http+xml

    SOAP结构

    必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
    可选的 Header 元素,包含头部信息
    必需的 Body 元素,包含所有的调用和响应信息
    可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
    
     

    这里写图片描述

    我们来看一下我们上面天气程序发送的数据的格式,这需要一个工具TCP/IP Monitor ,Eclipse自带的Debug工具之一,用于捕获Http、TCP/IP协议包。原理是一个代理服务,客户端先把数据发送到代理服务,然后代理服务再把数据发送到服务器,这样就能获取请求数据和响应数据。

    第一步:打开这个工具,选择other,然后输入TCP/IP Monitor

    这里写图片描述

    第二步:设置要代理的服务器

    这里写图片描述

    第三步:详细设置

    第一个参数是代理服务器端口,我们设置为54321
    第二个参数是被代理服务器的地址,第三个参数是被代理服务器的端口
    第四个参数要选择为TCP/IP
    
     

    这里写图片描述

    第四步:检测是否设置成功,我们访问代理服务器来获得wsdl文件

    这里写图片描述

    第五步:设置成功后,我们需要改一下客户端要连接的服务器,改成代理服务器的端口

    将WeatherInterfaceImplService里的所有原来地址的端口改为54321
    
     

    这里写图片描述

    第六步:我们启动我们的客户端,获取请求数据和响应数据

    
    请求 
    
    //先发送get请求,去获得wsdl文件,然后获得方法、参数等信息
    GET /weather?wsdl HTTP/1.1
    User-Agent: Java/1.8.0_111
    Host: 127.0.0.1:54321
    Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
    Connection: keep-alive
    
    //发送数据
    POST /weather HTTP/1.1
    Accept: text/xml, multipart/related
    Content-Type: text/xml; charset=utf-8
    SOAPAction: "http://ws.cad.com/WeatherInterfaceImpl/queryWeatherRequest"
    User-Agent: JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e
    Host: 127.0.0.1:54321
    Connection: keep-alive
    Content-Length: 203
    
    <?xml version="1.0" ?>
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
    <ns2:queryWeather xmlns:ns2="http://ws.cad.com/">
    <arg0>北京</arg0>
    </ns2:queryWeather>
    </S:Body>
    </S:Envelope>
     
    
    响应数据 
    
    HTTP/1.1 200 OK
    Date: Tue, 25 Jul 2017 05:05:58 GMT
    Transfer-encoding: chunked
    Content-type: text/xml;charset=utf-8
    
    //响应wsdl内容,来获得方法、参数等信息
    899
    <?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --><!-- Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --><definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.cad.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ws.cad.com/" name="WeatherInterfaceImplService">
    <types>
    <xsd:schema>
    <xsd:import namespace="http://ws.cad.com/" schemaLocation="http://127.0.0.1:54321/weather?xsd=1"></xsd:import>
    </xsd:schema>
    </types>
    <message name="queryWeather">
    <part name="parameters" element="tns:queryWeather"></part>
    </message>
    <message name="queryWeatherResponse">
    <part name="parameters" element="tns:queryWeatherResponse"></part>
    </message>
    <portType name="WeatherInterfaceImpl">
    <operation name="queryWeather">
    <input wsam:Action="http://ws.cad.com/WeatherInterfaceImpl/queryWeatherRequest" message="tns:queryWeather"></input>
    <output wsam:Action="http://ws.cad.com/WeatherInterfaceImpl/queryWeatherResponse" message="tns:queryWeatherResponse"></output>
    </operation>
    </portType>
    <binding name="WeatherInterfaceImplPortBinding" type="tns:WeatherInterfaceImpl">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding>
    <operation name="queryWeather">
    <soap:operation soapAction=""></soap:operation>
    <input>
    <soap:body use="literal"></soap:body>
    </input>
    <output>
    <soap:body use="literal"></soap:body>
    </output>
    </operation>
    </binding>
    <service name="WeatherInterfaceImplService">
    <port name="WeatherInterfaceImplPort" binding="tns:WeatherInterfaceImplPortBinding">
    <soap:address location="http://127.0.0.1:54321/weather"></soap:address>
    </port>
    </service>
    </definitions>
    0
    
    //响应数据
    HTTP/1.1 200 OK
    Date: Tue, 25 Jul 2017 05:05:59 GMT
    Transfer-encoding: chunked
    Content-type: text/xml; charset=utf-8
    
    df
    <?xml version="1.0" ?>
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:queryWeatherResponse xmlns:ns2="http://ws.cad.com/">
        <return>暴雨</return> 
        </ns2:queryWeatherResponse> 
    </S:Body>
    </S:Envelope>
    0
    
     

    UDDI

    UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。
    如果我们要使用一种服务,但是不知道地址(wsdl等),我们就可以在UDDI中查找。
    大部分情况下,我们都是知道服务地址的。

    Webservice的客户端调用方式

    一:生成客户端调用方式

    wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).
    wsimport.exe位于JAVA_HOME\bin目录下 
    常用参数为:
            -d<目录>  - 将生成.class文件。默认参数。
            -s<目录> - 将生成.java文件。
            -p<生成的新包名> -将生成的类,放于指定的包下
    
     

    调用公网的手机归属地查询服务

    公网服务地址 (里面提供了很多免费调用的服务)
    http://www.webxml.com.cn/zh_cn/index.aspx

    第一步:wsimport生成客户端代码 
    
    wsimport -p cn.cad.mobile -s . http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
    
    会出现一些警告,是因为服务端提供的一些方法是SOAP1.2标准的,这个工具没有实现SOAP1.2标准的生成方式。    
    
     

    这里写图片描述

    第二步:查看wsdl文件,获取我们需要的信息 
     

    这里写图片描述

    第三步:根据获取到的服务名等信息来创建我们的客户端  
    
    public class MobileClient {
    
        public static void main(String[] args) {
            //创建服务视图
            MobileCodeWS mobileCodeWS=new MobileCodeWS();
            //获取服务实现类
            MobileCodeWSSoap mobileCodeWSSoap= mobileCodeWS.getPort(MobileCodeWSSoap.class);
            //调用查询方法
            String message=mobileCodeWSSoap.getMobileCodeInfo("xxxxxxxx", null);
            System.out.println(message);
    
        }
    }
    
     
    第四步:获取到信息 
     

    这里写图片描述

    还有天气等服务,自己可以去实现一下。

    该种方式使用简单,但一些关键的元素在代码生成时写死在生成代码中,不方便维护,所以仅用于测试。

    二:service编程调用方式

    public class MobileClient2 {
    
        public static void main(String[] args) throws IOException {
            //创建WSDL文件的URL
            URL wsdlDocumentLocation=new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"); 
            //创建服务名称
            //1.namespaceURI - 命名空间地址
            //2.localPart - 服务视图名
            QName serviceName=new QName("http://WebXml.com.cn/","MobileCodeWS");
            Service service=Service.create(wsdlDocumentLocation, serviceName);
    
            //获取服务实现类
            MobileCodeWSSoap mobileCodeWSSoap= service.getPort(MobileCodeWSSoap.class);
            //调用方法
            String message=mobileCodeWSSoap.getMobileCodeInfo("XXXXXXX", null);
            System.out.println(message);
    
        }
    
    }
     

    该种方式可以自定义命名空间,服务视图名等元素,方便以后维护,是一种标准的开发方式 。

    三:HttpURLConnection调用方式

    这种方式是由自己编写客户端,不再由工具生成,比较麻烦。

    开发步骤: 
    
            第一步:创建服务地址
    
            第二步:打开一个通向服务地址的连接
    
            第三步:设置参数
    
            第四步:组织SOAP数据,发送请求
    
            第五步:接收服务端响应 
    
     
    public class MobileClient2 {
    
        public static void main(String[] args) throws IOException {
                    //第一步:创建服务地址,不是WSDL地址
                    URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx");
                    //第二步:打开一个通向服务地址的连接
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    //第三步:设置参数
                    //3.1发送方式设置:POST必须大写
                    connection.setRequestMethod("POST");
                    //3.2设置数据格式:content-type
                    connection.setRequestProperty("content-type", "text/xml;charset=UTF-8");
                    //3.3设置输入输出,因为默认新创建的connection没有读写权限,
                    connection.setDoInput(true);
                    connection.setDoOutput(true);
    
                    //第四步:组织SOAP数据,发送请求
                    String soapXML = getXML("XXXXXXX");
                    OutputStream os = connection.getOutputStream();
                    os.write(soapXML.getBytes());
                    //第五步:接收服务端响应,打印
                    int responseCode = connection.getResponseCode();
                    if(200 == responseCode){//表示服务端响应成功
                        InputStream is = connection.getInputStream();
                        //将字节流转换为字符流
                        InputStreamReader isr = new InputStreamReader(is,"utf-8");
                        //使用缓存区
                        BufferedReader br = new BufferedReader(isr);
    
                        StringBuilder sb = new StringBuilder();
                        String temp = null;
                        while(null != (temp = br.readLine())){
                            sb.append(temp);
                        }
                        System.out.println(sb.toString());
    
                        is.close();
                        isr.close();
                        br.close();
                    }
    
                    os.close();
                }
    
        //组织数据,将数据拼接一下
        public static String getXML(String phoneNum){
            String soapXML = "<?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>"
                +"<getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">"
                    +"<mobileCode>"+phoneNum+"</mobileCode>"
                  +"<userID></userID>"
                +"</getMobileCodeInfo>"
              +"</soap:Body>"
            +"</soap:Envelope>";
            return soapXML;
        }
    }
     

    这里写图片描述

    使用注解修改WSDL内容

    作用:
    通过注解,可以更加形像的描述Web服务。对自动生成的wsdl文档进行修改,为使用者提供一个更加清晰的wsdl文档

    WebService的注解都位于javax.jws包下: 
    
    @WebService-定义服务,在类上边
        targetNamespace:指定命名空间
        name:portType的名称
        portName:port的名称
        serviceName:服务名称
        endpointInterface:SEI接口地址,如果一个服务类实现了多个接口,只需要发布一个接口的方法,可通过此注解指定要发布服务的接口。 
    
    @WebMethod-定义方法,在公开方法上边
        operationName:方法名
        exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法,默认是false 
    
    @WebResult-定义返回值,在方法返回值前边
        name:返回结果值的名称 
    
    @WebParam-定义参数,在方法参数前边
        name:指定参数的名称
    
     
    //以我们前面做的天气案例为例子
    
    @WebService(
            targetNamespace="http://service.cad.com",
            portName="WeatherSOAPPort",
            serviceName="WeatherWSS",
            name="WeatherSOAP"  
    )
    public class WeatherInterfaceImpl implements WeatherInterface {
    
        @WebMethod(
                operationName="getWeather",
                exclude=false
        )
        public @WebResult(name="result")String queryWeather(@WebParam(name="cityName")String cityName) {
            System.out.println("获取城市名"+cityName);
            String weather="暴雨";    
            return weather;
        }
    
    }
     
    然后重新发布服务,我们再访问wsdl文件,就可以看到我们改变的内容 
     

    这里写图片描述

    展开全文
  • 这是一个cxf的webservice接口。 简单,可以直接用。 当时自己搭框架的时候,出现了各种问题,最后自己处理了一个。感觉还可以。 这是一个xml的处理项目。 可伸展性强
  • webservice是一种基于XML的跨平台的远程调用服务技术,同时他也能跨编程语言,即不同编程语言的客户端与服务端能够实现远程连接,为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。 1.Webservice...

    webservice是一种基于XML的跨平台的远程调用服务技术,同时他也能跨编程语言,即不同编程语言的客户端与服务端能够实现远程连接,为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

    1.Webservice服务端的搭造

    1)new一个web端项目
    new一个项目:
    在这里插入图片描述
    选择web项目中的ASP.NET.Web应用程序
    在这里插入图片描述
    选择空的web模板
    在这里插入图片描述
    2)右键项目,添加web服务
    在这里插入图片描述
    输入服务项的名称,这里使用默认的Webservice1
    在这里插入图片描述
    生成的cs文件如下图所示,这里已经包含了一个方法HelloWorld
    在这里插入图片描述
    3)new一个新方法:Add
    与C#new一般的new一个方法一样,只是在方法上面得加上【WebMethod】
    在这里插入图片描述
    在WebMethod后面可以加上描述语言(Description=“XXX”)
    4)debug可以得到webservice的web页面
    在这里插入图片描述
    如图可以看到CS文件中的两个方法以及方法的描述
    5)打开控制面板-管理工具-Internet Information Services (IIS)管理器
    在这里插入图片描述
    在这里插入图片描述
    如果没有的话,打开控制面板-启动或关闭Windows功能,勾选Internet Information Services
    在这里插入图片描述
    6)new一个网站
    在这里插入图片描述
    输入网站名称,物理路径选择Webservice1.asmx文件所在目录,端口最好为80以外的值
    在这里插入图片描述
    默认文档添加Webservice1.asmx
    在这里插入图片描述
    在这里插入图片描述
    浏览网址能看到与之前调试时一样的界面
    在这里插入图片描述

    2.调用web服务

    1)new一个client端项目
    new一个项目
    在这里插入图片描述
    选择Visual C#-控制台程序(WPF等也行)
    在这里插入图片描述
    2)项目添加服务引用
    在这里插入图片描述
    高级-添加Web引用-输入刚才浏览网址弹出来的网站网址,输入Web引用名-添加引用
    在这里插入图片描述
    3)调用引用的Web服务
    new一个实例,调用写好的Method
    在这里插入图片描述
    debug结果如下:
    在这里插入图片描述
    Δ:这是一种静态的Webservice调用,比较实用灵活的是动态调用,后续再补全

    展开全文
  • WebService

    2020-04-16 20:45:02
    1 前言 1.1 Web Service应用 webservice是开发中比较常用的技术。 由于企业中的开发平台,或平台下...Web services 把 Web 应用程序提升到了另外一个层面: Web Service平台需支持XML + HTTP,HTTP协议是最常用的因...
  • 一个ssm框架,连接的是mysql,把doc里面的sql执行后可以直接运行。项目里面配置了easyui,weiservice,websocket,shiro验证,拦截器,定时器等等(用户名:admin或1,密码:admin或1)
  • python 开发webService

    2020-11-29 08:07:23
    最近在学习用python 开发webservice,费了半天时间把环境好,记录下具体过程,以备后用。首先系统上要有python。其次要用python进行webservice开发,还需要一些库:1、lxml :命令行下 easy_install lxml 就能安装...
  • 先介绍下本人开发环境吧。 JDK 1.4.2 + Myeclipse 6.0(实在经不起诱惑,尝尝鲜) + Tomcat 5.0.28 + AXIS 1.4。 AXIS 1.4包可以在http://ws.apache.org/axis/ ... 假设所有的环境你已经好,并且AXIS包也已经下...
  • Java WebService开发详解

    2021-02-12 10:28:41
    WebService分为两种:1. 基于HTTP协议,REST方式的WebService。2. 基于SOAP协议(HTTP协议之上),RPC方式的WebService。通常所说的WebService是指RPC方式的WebService。Java中有三种WebService规范: JAX-WS(JAX-RPC)...
  • JWS实现WebService

    2020-07-03 12:52:18
        WebService估计大家都有听过或者使用过。Java有几种常用的方式实现webservice,本文主要是讨论JWS实现。 什么是webservice     简单而言,webservice就是通过SOAP协议在Web上提供的服务,使用WSDL文件...
  • C# WebClient调用WebService

    2021-04-06 20:21:23
    WebClient调用WebService (文末下载完整代码) 先上代码: object[] inObjects = new[] { "14630, 14631" }; HttpWebClient wc = new HttpWebClient(2300); var result1 = WebServiceClientHelper....
  • .webservice webservice种跨操作系统和跨语言的数据调用,数据交换的种服务技术。 所谓跨编程语言和跨操作平台,就是说服务端程序...还有天气预报等,也是气象局把自己的系统服务以webservice服务的形式暴
  • webservice 搭建(

    千次阅读 2017-02-26 11:07:04
    远程调用和本地调用区别1.2.Web serviceweb service 是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些...
  • 调用webService的几种方式

    千次阅读 2020-12-18 23:43:09
    http://blog.csdn.net/u011165335/article/details/51345224、概览方式1:HttpClient:可以用来调用webservie服务,也可以抓取网页数据版本1:HttpClient3.0.x版本2:HttpClient4.x.x(目前最新4.5.2)这2版本的...
  • webservice接口

    2019-03-27 16:58:00
     大家或多或少都听过 WebService(Web服务),有段时间很多计算机期刊、书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成 分。但是不得不承认的是WebService真的是一门新兴和有前途的...
  • WebService服务端简单搭建webService依赖包webService服务端总入口测试webService webService依赖包 <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-...
  • 4 JAX-WS 4.1 Webservice案例 提供一个天气的WebService服务器接口 创建一个SEI(Service Endpoint Interface)接口,本质就是一个Weather接口 package com.tzb.weather; public interface WeeatherInterface { ...
  • 后面提供 一个独立的webservice不依赖其他框架的自动扫描注册 1.InitWebService package com.ld.admin.listener; import java.util.HashMap; import java.util.Map; import javax.jws.WebServic...
  • JAVA 三种WebService 规范

    2021-03-09 03:43:21
    JAVA 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC)、JAXM&SAAJ、JAX-RS。1. Jaxws(掌握)JAX-WS 的全称为 Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(Java API ...
  • webService基本概念

    2020-06-13 17:24:36
    1)webService即web服务,它是种跨编译语言和跨操作系统平台的远程调用技术。 2)java中共有三种WebService规范,分别是JAX-WS(JAX-RPC)、JAXM&SAAJ、JAX-RS。 3)webService的三要素:soap、wsdl、uddi。...
  • webservice 基本概念

    2020-02-10 11:15:00
    webservice 基本概念 1.1 什么是web服务 这里列举一些常见的web服务: 手机淘宝、京东…. 天气预报 手机号归属地 股票查询 ...(1) webservice 即web服务,它是种跨编程语言和跨操作系统平...
  • WebService:是一个独立的平台,具有低耦合和自包含的特性,是基于可编程的Web应用程序,可使用开放的SML标准描述、发布、发现、协调和配置相关应用程序,用于开发各种数据交换的应用程序或接口。 XML:可扩展标记...
  • webservice

    2020-12-09 16:42:21
    webservice天什么是webservice案例使用Socket做远程方法调用 什么是webservice 服务:部署在服务器中为我们提供请求响应的程序 案例使用Socket做远程方法调用 service服务代码 public class PersonService ...
  • webservice初识

    2020-05-05 11:10:36
    1、webservice简介 2、webservice相关术语 2.1、AX-WS(JAX-RPC) 2.2、JAXM&SAAJ 2.3、JAX-RS 2.4、SOAP 2.5、WSDL 2.6、UDDI 3、webservice应用场景 4、webservice优缺点 4.1、优点 4.2、缺点 5、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,083
精华内容 833
关键字:

自己搭一个webservice