开发RESTful WebService

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

RESTful简化了web service的设计,它不再需要wsdl,也不再需要soap协议,而是通过最简单的http协议传输数据(包括xml或json)。既简化了设计,也减少了网络传输量(因为只传输代表数据的xml或json,没有额外的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特性。

开发RESTful WebService,布布扣,bubuko.com

时间: 2024-12-26 19:42:37

开发RESTful WebService的相关文章

开发基于CXF的 RESTful WebService web 项目 webservice发布

配置步骤 开发基于CXF的 RESTful WebService 1.创建Web项目并导入CXF的jar 2.在Web.xml中配置 CXFServlet <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-

SOAP webserivce 和 RESTful webservice 对比及区别

简单对象访问协议(Simple Object Access Protocol,SOAP)是一种基于 XML 的协议,可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME),基于"通用"传输协议是 SOAP的一个优点.它还支持从消息系统到远程过程调用(Remote Procedure Call,RPC)等大量的应用程序.SOAP提供了一系列的标准,如WSRM(WS-Reliable Messaging)形

SOAP Webservice和RESTful Webservice

REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.REST提出设计概念和准则为: 1.网络上的所有事物都可以被抽象为资源(resource)2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识3.所有的操作都是无状态的 REST简化开发,其架构遵循CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建,获取,更新和删除就可以完成相关的操作和处理.您可以通过

RESTful Webservice (一) 概念

Representational State Transfer(表述性状态转移) RSET是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性. REST的设计概念和准则为: 网络上的所有事物都可以被抽象为资源 每一个资源都有唯一的字元标识,对资源的操作不会改变这些标识 所有的操作都是无状态的 REST架构风格最重要的架构约束: 1. 客户-服务器 通信只能由客户端单方面发起,表现为请求-响应的形式 2. 无状态 通信的会话状态(ses

restful webservice SOAP webservice

为了说明这个问题,必须的纠正一下我们对HTTP的认识. 首先回顾一下OSI七层模型 OSI(Open System Interconnection,开放系统互连)七层模型 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 HTTP并不是一种传输层的"传输协议"(第四层),而是一种应用层的"转移协议"(最高层). SOAP类型的WebService就是最好的例子,SOAP消息完全就是将Http协议作为消息承载, 以至于对于Http

Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice

浅谈SOAP Webservice和RESTful Webservice REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.REST提出设计概念和准则为: 1.网络上的所有事物都可以被抽象为资源(resource) 2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识 3.所有的操作都是无状态的 REST简化开发,其架构遵循CRUD原则,该原则告诉我们对于资源(包括网络资源

在Eclipse中使用Jersey和Tomcat构建RESTful WebService及其调用

在Eclipse中使用Jersey和Tomcat构建RESTful WebService及其调用 RESTful Web 服务简介 REST 在 2000 年由 Roy Fielding 在博士论文中提出,他是 HTTP 规范 1.0 和 1.1 版的首席作者之一. REST 中最重要的概念是资源(resources),使用全球 ID(通常使用 URI)标识.客户端应用程序使用 HTTP 方法(GET/ POST/ PUT/ DELETE)操作资源或资源集.RESTful Web 服务是使用 H

Eclipse + Jersey 发布RESTful WebService(一)了解Jersey

2018-4-6 OK,我得承认,是因为Axis2没走通,所以改了用Jersey,因为之前一次用过觉得还挺容易用. 具体Jersey是什么,目前完全不了解,接下来1天时间来试试看. -- 怎么着都不成 一.下文中需要的资源地址汇总 Apache Maven Apache网站 http://maven.apache.org/ Maven下载地址: http://maven.apache.org/download.cgi Jersey Jersey(JAX-RS 2.1 / Jersey 2.26+

flask开发restful api

在此之前,向大家说明的是,我们整个框架用的是flask + sqlalchemy + redis.如果没有开发过web,还是先去学习一下,这边只是介绍如果从开发web转换到开发移动端.如果flask还不是很熟悉,我建议先到这个网站简单学习一下,非常非常简单.http://dormousehole.readthedocs.org/en/latest/ 一直想写一些特别的东西,能让大家学习讨论的东西.但目前网上的很多博客,老么就按照官方文档照本宣读,要么直接搬代码,什么都不说明.我写这个系列的博客,