WebService详解

来源:互联网 发布:java去掉括号内容 编辑:程序博客网 时间:2024/06/08 04:41

开发及原理:
WebService开发可以分为服务器端开发和客户端开发两个方面:
服务端开发:把公司内部系统的业务方法发布成WebService服务,供远程合作单位和个人调用。(借助一些WebService框架可以很轻松地把自己的业务对象发布成WebService服务,Java方面的典型WebService框架包括:axis,xfire,cxf等,java ee服务器通常也支持发布WebService服务,例如JBoss。)

客户端开发:调用别人发布的WebService服务,大多数人从事的开发都属于这个方面,例如,调用天气预报WebService服务。(使用厂商的WSDL2Java之类的工具生成静态调用的代理类代码;使用厂商提供的客户端编程API类;使用SUN公司早期标准的jax-rpc开发包;使用SUN公司最新标准的jax-ws开发包。当然SUN已被Oracle收购)

WebService的工作调用原理:对客户端而言,我们给这各类WebService客户端API传递wsdl文件的url地址,这些API就会创建出底层的代理类,调用这些代理,就可以访问到webservice服务。代理类把客户端的方法调用变成soap格式的请求数据再通过HTTP协议发出去,并把接收到的soap数据变成返回值返回。对服务端而言,各类WebService框架的本质就是一个大大的Servlet,当远程调用客户端给它通过http协议发送过来soap格式的请求数据时,它分析这个数据,就知道要调用哪个java类的哪个方法,于是去查找或创建这个对象,并调用其方法,再把方法返回的结果包装成soap格式的数据,通过http响应消息回给客户端。

体系架构:
Web服务的体系结构是基于Web服务提供者、Web服务请求者、Web服务中介者三个角色和发布、发现、绑定三个动作构建的。简单地说,Web服务提供者就是Web服务的拥有者,它耐心等待为其他服务和用户提供自己已有的功能;Web服务请求者就是Web服务功能的使用者,它利用SOAP消息向Web服务提供者发送请求以获得服务;Web服务中介者的作用是把一个Web服务请求者与合适的Web服务提供者联系在一起,它充当管理者的角色,一般是UDDI。这三个角色是根据逻辑关系划分的,在实际应用中,角色之间很可能有交叉:一个Web服务既可以是Web服务提供者,也可以是Web服务请求者,或者二者兼而有之。显示了Web服务角色之间的关系:其中,“发布”是为了让用户或其他服务知道某个Web服务的存在和相关信息;“查找(发现)”是为了找到合适的Web服务;“绑定”则是在提供者与请求者之间建立某种联系。

JAX-RS提供了一些标注将一个资源类,一个POJOJava类,封装为Web资源。标注包括:
@Path,注释被用来描述根资源、子资源方法或子资源的位置。
value 值可以包含文本字符、变量或具有定制正则表达式的变量。
@GET,@PUT,@POST,@DELETE,标注方法是用的HTTP请求的类型.您可以使用它们来绑定根资源或子资源内的 Java 方法与 HTTP 请求方法。
HTTP GET 请求被映射到由 @GET 注释的方法;
HTTP POST 请求被映射到由 @POST 注释的方法,以此类推。用户可能还需要通过使用 @HttpMethod 注释定义其自己的定制 HTTP 请求方法指示符。
@Produces,注释代表的是一个资源可以返回的 MIME 类型。这些注释均可在资源、资源方法、子资源方法、子资源定位器或子资源内找到。
@Consumes,注释代表的是一个资源可以接受的 MIME 类型。
@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分别标注方法的参数来自于HTTP请求的不同位置,

功能特性
CXF 包含了大量的功能特性,但是主要集中在以下几个方面:
支持 Web Services 标准:CXF 支持多种 Web Services 标准,包含 SOAP、Basic Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging
和 WS-Security。
Frontends:CXF 支持多种“Frontend”编程模型,CXF 实现了 JAX-WS API (遵循 JAX-WS 2.0 TCK 版本),它也包含一个“simple frontend”
允许客户端和 EndPoint 的创建,而不需要 Annotation 注解。CXF 既支持 WSDL 优先开发,也支持从 Java 的代码优先开发模式。
容易使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代码优先的 Services,各种 Maven 的插件也使集成更加容易,
支持 JAX-WS API ,支持 Spring 2.0 更加简化的 XML 配置方式,等等。
支持二进制和遗留协议:CXF 的设计是一种可插拨的架构,既可以支持 XML ,也可以支持非 XML 的类型绑定,比如:JSON 和 CORBA。

访问路径:项目路径+web.xml中的路径+applicationContext-wedService.xml中的路径+请求方法的路径@Path(“/associationUsers”)
传递参数示例:

列:// 查询所有未关联客户列表    请求:Customer customer = WebClient                    .create("http://localhost:9002/crm_management/services/customerService/findCustomerByTelephone/"                            + model.getTelephone())                    .accept(MediaType.APPLICATION_JSON).get(Customer.class);    @GET    @Path("/associationCustomers")    @Produces({ "application/xml", "application/json" })    public List<Customer> findNoAssociationCustomers();    // 查询已经关联的到指定定区的客户列表    @GET    @Path("/hasAssociationFixedAreaCustomers/{fixedAreaId}")    @Produces({ "application/xml", "application/json" })    @Consumes({ "application/xml", "application/json" })    public List<Customer> findHasAssociationFixedAreaCustomers(@PathParam("fixedAreaId") String fixedAreaId);    // 关联客户到指定的定区,将客户id拼接成customerIdStr字符串(1,2,3.。)    请求:WebClient.create("http://localhost:9002/crm_management/services/customerService/updateCustomerType/"                        + model.getTelephone()).put(null);    @PUT    @Path("/associationCustomersToFixedArea")    @Consumes({ "application/xml", "application/json" })    public void associationCustomersToFixedArea(@QueryParam("customerIdStr") String customerIdStr,            @QueryParam("fixedAreaId") String fixedAreaId);    // 保存用户    请求: WebClient.create("http://localhost:9002/crm_management/services/customerService/customer/")                .type(MediaType.APPLICATION_JSON).post(model);    @POST    @Path("/customer")    @Consumes({ "application/xml", "application/json" })    public void registCustomer(Customer customer);例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。spring整合相关xml配置web.xml<!-- 使用CXF -->    <servlet>        <servlet-name>CXFService</servlet-name>        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>        <load-on-startup>1</load-on-startup>    </servlet>    <servlet-mapping>        <servlet-name>CXFService</servlet-name>        <url-pattern>/services/*</url-pattern>    </servlet-mapping>applicationContext-wedService.xml<!-- 配置cxf相关文件 -->    <jaxrs:server id="customerService" address="/customerService">        <jaxrs:serviceBeans>            <bean class="cn.itcast.crm.service.impl.CustomerServiceImpl"/>        </jaxrs:serviceBeans>        <jaxrs:inInterceptors>            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>        </jaxrs:inInterceptors>        <jaxrs:outInterceptors>            <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>        </jaxrs:outInterceptors>    </jaxrs:server>
原创粉丝点击