• 开发RESTful WebService


    RESTful风格的webservice越来越流行了,sun也推出了RESTful WebService的官方规范:JAX-RS。全称:Java API for RESTful WebService。该规范定义了一系列的注解

     

    RESTful简化了web service的设计。它不再须要wsdl。也不再须要soap协议,而是通过最简单的http协议数据传输(包含xmljson)。既简化了设计,也降低了网络传输量(由于仅仅传输代表数据的xmljson,没有额外的xml包装)

     

    以下为大家介绍使用cxf开发RESTful WebService

     

    Cxf2.7实现了大部分的jax-rs规范。从cxf3.0開始实现jax-rs的全套规范

     

    服务端


    Spring3+cxf开发RESTfulweb service

     


    服务端jar


    上面的jettison jar包是用来将jaxb扩展为为json支持的jar

     

    实体类

    package com.tgb.cxf.server;
    
    import javax.xml.bind.annotation.XmlRootElement;
    
    //一定要使用XmlRootElement注解进行标注
    @XmlRootElement(name="user")
    public class User {
    	
    	private String id;
    	private String name;
    	
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    }
    

    WebService接口

    @Path("/userservice/")
    public interface IMyService {
    	
    	@Path("/addUser/")
    	@POST
    	Response addUser(User user);
    	
    	@Path("/delUser/{id}/")
    	@DELETE
    	Response delUser(@PathParam("id") String id);
    	
    	@Path("/updateUser/")
    	@PUT
    	Response updateUser(User user);
    	
    	@Path("/getUserById/{id}/")
    	@GET
    	@Produces("application/json")//返回json数据格式
    	User getUserById(@PathParam("id") String id);
    	
    	@Path("/")
    	@GET
    	@Produces("application/json")//返回json数据格式
    	List<User> findAllUsers();
    }
    

    WebService实现类

    public class MyServiceImpl implements IMyService {
    
    	private HashMap<String, User> users = new HashMap<String,User>();
    	
    	public MyServiceImpl(){
    		init();
    	}
    	
    	public Response addUser(User user) {
    
    		users.put(user.getId(), user);
    		System.out.println("加入用户成功");
    		System.out.println(users.size());
    		System.out.println(users.get("2").getName());
    		return Response.ok().build();
    	}
    
    
    	public Response delUser(String id) {
    		users.remove(id);
    		System.out.println(users.size());
    		return Response.ok().build();
    	}
    
    
    	public Response updateUser(User user) {
    		users.put(user.getId(), user);
    		System.out.println(users.get("1").getName());
    		return Response.ok().build();
    	}
    
    
    	public User getUserById(String id) {
    		return users.get(id);
    	}
    	
    	
    	
    	private void init(){
    		User user = new User();
    		user.setId("1");
    		user.setName("温欢");
    		users.put(user.getId(), user);
    	}
    
    	
    	public List<User> findAllUsers() {
    		List<User> userlist = new ArrayList<User>();
    		userlist.add(users.get("1"));
    		return userlist;
    	}
    
    }
    

    spring-cxf.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    	xmlns:jaxrs="http://cxf.apache.org/jaxrs"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    	 http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
    	
    	<!-- 
    			
    			注意这里的jaxrs命名空间须要大家手动加入 
    			
    	-->
    	
    	<!-- 公布webservice -->
    	<bean id="serviceBean" class="com.tgb.cxf.server.MyServiceImpl"/>
    	<jaxrs:server id="userService"  address="/myservice">
    		<jaxrs:serviceBeans>
    			<ref bean="serviceBean"/>
    		</jaxrs:serviceBeans>
    	</jaxrs:server>
    	
    </beans>
    

    web.xml文件配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      
      <!-- 配置spring -->
      <context-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>classpath:config/spring-cxf.xml</param-value>
      </context-param>
      
      <listener>
    	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      
      <!-- 配置cxf servlet -->
      <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>/services/*</url-pattern>
        </servlet-mapping>
    
    </web-app>


    client

    所需jar



    由于RESTful就是利用最原始的http协议数据传输。所以client事实上就是一个httpclient。有下面几种实现方式

     

    JAX-RS Client API--cxf3.0+

    Proxy【使用起来简单。代理封装通信细节】

    Apache HttpClient

    WebClient

     

    为了简单我使用了Proxy方式

    代码例如以下

    	public class MyClient {
    	
    		/** @MethodName	: main
    		 * @Description	: JaxRs測试client
    		 * @param args
    		 */
    		public static void main(String[] args) {
    			IMyService myService = JAXRSClientFactory.create("http://localhost:8096/cxf02/services/myservice",IMyService.class);
    			
    			User user = myService.getUserById("1");
    			System.out.println(user.getName());
    			
    			User user = new User();
    			user.setId("2");
    			user.setName("委座");
    			myService.addUser(user);
    			
    			/*User user = new User();
    			user.setId("1");
    			user.setName("123");
    			myService.updateUser(user);*/
    			
    			
    			myService.delUser("1");
    			
    			System.out.println(myService.findAllUsers().get(0).getName());
    		}
    	
    	}
    

    大家能够使用TCPMON这个工具监控下面。能够看到http body中仅仅是简单的json串,没有像soap协议那样的“信封”包装

     

    使用RESTful设计风格+传输json数据格式 能够大大的简化web service的设计 并提高传输效率


    事实上springMVC也採用了RESTful的设计风格。只是它使用的是spring自己的注解,这些注解和jax-rs中的注解惊奇的类似。假设大家有兴趣能够研究一下springMVC的RESTful特性。


  • 相关阅读:
    bootstrap class sr-only 什么意思?
    PHP 中的文本截取分析之效率
    FastAdmin 升级后出现 is already in use
    FastAdmin 环境变量 env 配置
    Nginx 服务器伪静态配置不当造成 Access denied
    笔记:明确认识
    进程通信(socket)
    进程间通信(了解)
    c++ 继承,组合
    c++ 类初始化
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5134498.html
Copyright © 2020-2023  润新知