RESTful Webservice

前端之家收集整理的这篇文章主要介绍了RESTful Webservice前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1,REST和RESTFUL是什么

   REST ( REpresentational State Transfer ),State Transfer 为 "状态传输" 或 "状态转移 ",Representational 中文有人翻译为"表征"、"具象",合起来就是 "表征状态传输" 或 "具象状态传输" 或 "表述性状态转移"
   REST是一种架构风格,REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性。
   REST提出设计概念和准则为:
   1.网络上的所有事物都可以被抽象为资源(resource)
   2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识
   3.所有的操作都是无状态的
   REST简化开发,其架构遵循CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建,获取,更新和删除就可以完成相关的操作和处理。您可以通过统一资源标识符(Universal Resource Identifier,URI)来识别和定位资源,并且针对这些资源而执行的操作是通过 HTTP 规范定义的。其核心操作只有GET,PUT,POST,DELETE。

   由于REST强制所有的操作都必须是stateless的,这就没有上下文的约束,如果做分布式,集群都不需要考虑上下文和会话保持的问题。极大的提高系统的可伸缩性。

2.SOAP Webservice和RESTful Webservice

  WebService是一种能够使应用程序在不同的平台使用不同的编程语言进行通讯的技术规范,而这种技术规范的实现可以用不同的方法,比如使用基于XML形式的协议(SOAP)进行通讯或者是RESTFUL形式的。

   既然我们知道可以使用上面的两种形式进行通讯,那么我们就需要对上面的两种形式进行描述,规范化。而这些规范化的工作sun已经帮我们完成了,也就是JAX-WS,JAX-RS这两种规范.

  JAX-WS是一种规范,而在jdk1.6之后就有了自带的实现,但是这种实现是比较简单的,基本上就只能够传递SOAP协议格式的消息。这就是为什么我们可以在没有axis2或者CXF的情况下开发WebService。  这时候我们就会想了,如果我们需要其他的服务,比如我想让JAX-WS与Spring集成。这种需求前辈都已经考虑过了,也实现了,不需要我们在去实现这样的需求。而这种需求的解决方案在JAX-WS中是采用框架。而JAX-WS的框架就有AXIS2和CXF。框架使用起来可能会更加灵活,功能更加强大。比如CXF不仅仅实现JAX-WS,也实现了JAX-RS规范。

 

  那么选择SOAP Webservice和Restful Webservice的使用,首先需要理解就是SOAP偏向于面向活动,有严格的规范和标准,包括安全,事务等各个方面的内容,同时SOAP强调操作方法和操作对象的分离,有WSDL文件规范和XSD文件分别对其定义。而REST强调面向资源,只要我们要操作的对象可以抽象为资源即可以使用REST架构风格。

 

3. Cxf 开发soap webservice 简单实例:

接口和实现类:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package  demo2;
 
javax.jws.WebParam;
javax.jws.WebService;
 
@WebService
interface  HiGirl {
 
     String sayHi( @WebParam (name =  "text" ) String text);
}
 
 
 
 
HiGirlImpl  implements  HiGirl {
 
@Override
     public  ) String text) {
return  "hi,"  + text;
}
 
}

 

 spring配置:

<?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:tx="http://www.springframework.org/schema/tx"
xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:cxf="http://cxf.apache.org/core"
xsi:schemaLocation="    
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.1.xsd 
      http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd 
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
 
     <!-- 以下三个文件在 cxf-2.7.18.jar 中定义 ,主要功能室CXF和Spring集成时,注册一些Process Bean -->
resource="classpath:Meta-INF/cxf/cxf.xml" />
resource="classpath:Meta-INF/cxf/cxf-extension-soap.xml" />
Meta-INF/cxf/cxf-servlet.xml" />
 
jaxws:endpoint  id="hiGirl" implementor="demo2.HiGirlImpl"
address="/hiGirl" />
     
bean  id="client" class="demo2.HiGirl" factory-bean="clientFactory"
bean >
 
factorybean">
property  name="serviceClass" value="demo2.HiGirl"></ property >
>
</ >
@H_67_403@beans>

 web.xml 配置:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
display-name >CXFwebservice</ >
>
welcome-file >index.html</ >
 
>
param-name >contextConfigLocation</ >
>classpath:demo2/applicationContext.xml</ >
>
>
listener-class >org.springframework.web.context.ContextLoaderListener</ >
servlet >
>CxfServlet</ >
servlet-class >org.apache.cxf.transport.servlet.CXFServlet</ >
>1</ >
>
>
>
>/webservice/*</ >
filter filter-name >encoding</ >
filter-class >org.springframework.web.filter.CharacterEncodingFilter</ >
>
             >
>
>
>forceEncoding</ >
>
>
filter-mapping >
>*.jsp</ >
>
>*.do</ >
web-app 15
org.springframework.context.ApplicationContext;
org.springframework.context.support.ClassPathXmlApplicationContext;
 
WebServiceApp {
 
static  void  main(String[] args) {
ApplicationContext factory =  new  ClassPathXmlApplicationContext( "demo2/applicationContext.xml" );
HiGirl client = (HiGirl) factory.getBean( "client" );
"bitch!" ));
 
 
}

 4,CXF开发 restful webservice 简单实例:

demo;
 
java.util.List;
List<Person> persons;
persons =  LinkedList<Person>();
Person();
person.setId( "6272058" );
"刘德华" );
persons.add(person);
}
 
demo;
 
javax.xml.bind.annotation.XmlRootElement;
 
@XmlRootElement "Person" )
 
String name;
String id;
 
String getName() {
@H_67_403@return  name;
}
 
setName(String name) {
.name = name;
}
 
String getId() {
}
 
setId(String id) {
}
 
}
 
javax.ws.rs.DELETE;
javax.ws.rs.POST;
javax.ws.rs.Path;
javax.ws.rs.Produces;
javax.ws.rs.core.MediaType;
javax.ws.rs.core.Response.Status;
 
@Path ( "/PersonService" )
//@Produces注释用来指定将要返回给client端的数据标识类型(MIME)。
//@Produces可以作为class注释,也可以作为方法注释,方法的@Produces注释将会覆盖class的注释。
方法声明了自己的Produce,那么以方法的为准,class的仅供参考
@Produces ({  "application/json" "application/xml"  })
 
"/getPerson/{dd}" )
Person getPerson( @PathParam "dd" ) String id) {
(id !=  null  && id.length() >  0 ) {
             for  (Person pp : Config.persons) {
if (id.equals(pp.getId())){
                     pp;
}
             }
Person();
result.setId(id);
else  {
Person();
}
 
"/regPerson" )
//@Consumes与@Produces相反,用来指定可以接受client发送过来的MIME类型,
//同样可以用于class或者method,也可以指定多个MIME类型,一般用于@PUT,@POST。
@H_658_1301@@Consumes})
Response regPerson(Person person) {
Response.status(Status.BAD_REQUEST).build();
Config.persons.add(person);
}
 
"/delPerson" )
Response delPerson( @QueryParam "id" ) String id) {
person.setId(id);
Response.status(Status.BAD_REQUEST).build();
Config.persons.remove(person);
}
 
"/updatePerson" )
403@ Response updatePerson(Person person) {
Response.status(Status.BAD_REQUEST).build();
(Person pp : Config.persons) {
                     pp.setName(person.getName());
}
}
 
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.5.xsd
http://cxf.apache.org/jaxrs
 
Meta-INF/cxf/cxf.xml" />
resource="classpath:Meta-INF/cxf/cxf-servlet.xml" />
 
jaxrs:server  id="rs_server" address="/rs">
ref  bean="personService"/>
30
>CxfRestWebservice</ >classpath:demo/beans.xml</  
>cxfservlet</ >