加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

开发RESTful WebService

发布时间:2020-12-16 23:27:50 所属栏目:安全 来源:网络整理
导读:RESTful 风格的 webservice 越来越流行了, sun 也推出了 RESTful WebService 的官方规范: JAX-RS ,全称: Java API for RESTful WebService。该规范定义了一系列的注解 ? RESTful 简化了 web service 的设计,它不再需要 wsdl ,也不再需要 soap 协议,而

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>


客户端

所需jar



因为RESTful就是利用最原始的http协议传输数据,所以客户端其实就是一个http客户端,有以下几种实现方式

?

JAX-RS Client API--cxf3.0+

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

Apache HttpClient

WebClient

?

为了简单我使用了Proxy方式

代码如下

	public class MyClient {
	
		/** @MethodName	: main
		 * @Description	: JaxRs测试客户端
		 * @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特性。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读