WebService(二)--Restful的编程风格

Restful的编程风格


Restful的概述

1. 概述
    * 一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。
    * 它主要用于客户端和服务器交互类的软件。
    * 基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

2. JaxRs的WebService服务发布方式就是采用的Restful的风格。

使用JaxRs规范发布Restful风格的WebService服务

1. 创建Maven工程,导入如下坐标依赖
    <dependencies>
      <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-frontend-jaxrs</artifactId>
                <version>3.0.1</version>
            </dependency>

            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-transports-http-jetty</artifactId>
                <version>3.0.1</version>
            </dependency>

            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.12</version>
            </dependency>

            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-rs-client</artifactId>
                <version>3.0.1</version>
            </dependency>

            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-rs-extension-providers</artifactId>
                <version>3.0.1</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.jettison</groupId>
                <artifactId>jettison</artifactId>
                <version>1.3.7</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.10</version>
                <scope>test</scope>
            </dependency>
      </dependencies>

2. 从资料中导入User和Car的类(强调:从jaxrs的素材中导入)
    * @XmlRootElement(name = "Car"),以后把User类转换成XML格式的数据时候,Car作为根节点,例如
        <Car>
            <id>1</id>
        </Car>

3. 从资料中导入service接口和serviceImpl实现类(强调:从jaxrs的素材中导入)
    * @Path("/userService")                                     -- 请求的路径
    * @Produces("*/*")                                          -- 响应的MIME类型
    * @POST                                                     -- 请求方式,适合于新增
    * @PUT                                                      -- 请求方式,适合于修改
    * @GET                                                      -- 请求方式,适合于查询
    * @DELETE                                                   -- 请求方式,适合于删除
    * @Path("/user/{id}")                                       -- 查询id为xxx的对象,例如:/user/1   查询id为1的用户
    * @Consumes({ "application/xml", "application/json" })      -- 客户端发送的参数类型

4. 编写服务端发布WebService
    /**
     * 发布服务
     * @author Administrator
     */
    public class Server {

        public static void main(String[] args) {
            // 创建服务器工厂对象
            JAXRSServerFactoryBean bean = new JAXRSServerFactoryBean();
            // 设置实体类,可以帮助转换json字符串
            bean.setResourceClasses(User.class,Car.class);
            // 设置请求地址
            bean.setAddress("http://localhost:12345");
            // 设置实现类
            bean.setServiceBean(new UserServiceImpl());
            // 开启服务
            bean.create();
        }
    }

5. 客户端的程序
    @Test
    public void run1(){
        User user = new User();
        user.setId(1);
        user.setUsername("aaa");
        WebClient.create("http://localhost:12345/userService/user").type(MediaType.APPLICATION_XML).post(user);
    }

Spring整合JaxRs规范的WebService


Spring整合JaxRs

1. 创建Maven项目,导入坐标依赖
    <dependencies>
        <!-- cxf 进行rs开发 必须导入 -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
            <version>3.0.1</version>
        </dependency>
        <!-- 日志引入 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.12</version>
        </dependency>

        <!-- 客户端 -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-client</artifactId>
            <version>3.0.1</version>
        </dependency>

        <!-- 扩展json提供者 -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-extension-providers</artifactId>
            <version>3.0.1</version>
        </dependency>

        <!-- 转换json工具包,被extension providers 依赖 -->
        <dependency>
            <groupId>org.codehaus.jettison</groupId>
            <artifactId>jettison</artifactId>
            <version>1.3.7</version>
        </dependency>

        <!-- spring 核心 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <!-- spring web集成 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <!-- spring 整合junit -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <!-- junit 开发包 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

2. 导入相关的domain和service
3. 把 UserService接口的 @Path("/userService") 注释掉,因为准备使用配置文件来描述路径
4. 编写配置文件
    <bean id="userService" class="cn.itcast.service.UserServiceImpl"/>
    <jaxrs:server address="/userService">
        <jaxrs:serviceBeans>
            <ref bean="userService"/>
        </jaxrs:serviceBeans>
    </jaxrs:server>

5. 在web.xml配置文件配置Spring的监听器,服务器启动,就加载applicationContext.xml配置文件
    * 加载Spring配置文件的监听器
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext-cxf.xml</param-value>
        </context-param>

    * 配置CXF的Servlet程序
        <servlet>
            <servlet-name>cxf</servlet-name>
            <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>cxf</servlet-name>
            <url-pattern>/ws/*</url-pattern>
        </servlet-mapping>

6. 编写客户端的代码
    @Test
    public void run1(){
        User user = new User();
        user.setId(1);
        user.setUsername("aaa");
        // WebClient.create("http://localhost:8080/demo1/ws/userService/user").type(MediaType.APPLICATION_XML).post(user);
        // WebClient.create("http://localhost:8080/demo1/ws/userService/user").type(MediaType.APPLICATION_XML).put(user);

        User u = WebClient.create("http://localhost:8080/demo1/ws/userService/user/1").accept(MediaType.APPLICATION_XML).get(User.class);
        System.out.println(u);
    }

猜你喜欢

转载自blog.csdn.net/wuqianjing/article/details/80439715