初步探讨rest

开始接触rest的时候我的理解是rest也是个web service,只不过是一个比soap更简洁的web service。但是慢慢使用的时候就发现,有好多以前不知道的地方。我是完全从一个使用者的角度来看rest的,没有那种专家级别的高度,比如说对互联网的印象,改变了java web,以后的流行方向等等。毕竟那是酒足饭饱过后的一种高谈阔论。
首先还是来个三部曲吧。我认为任何技术如果老抱着个理论在那里看是最痛苦的事情了。现实点,咱们先弄个hello word出来再说吧。有人认为hello word 太肤浅,我说如果你能搞定大多数技术的hello word ,你离高人也不远了。好了,废话少说。
第一步,建个web工程,一个service,一个实现,一个请求pojo,一个相应pojo,欧儿了。
//service
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

import mytest.rest.resp.BookReq;

@Path("/book")
public interface BookService {
@POST
@Path("/savebook")
public BookReq saveBook(final BookReq bq);


@GET
@Path("/getbook/{bookName}")
public BookReq getBook(@PathParam("bookName")final String bookName);

}

//实现
import mytest.rest.resp.BookReq;

public class Book implements BookService {

@Override
public BookReq getBook(String bookName) {
BookReq bq = new BookReq();
bq.setBookName(bookName);
bq.setAuthor("peter");
bq.setAnnoation("good book");
return bq;
}

@Override
public BookReq saveBook(BookReq bq) {
return bq;
}
}

//请求pojo
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement( name = "req" )
public class BookReq {

private String bookName;
private String author;
private String publishDate;
private String annoation;


public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublishDate() {
return publishDate;
}
public void setPublishDate(String publishDate) {
this.publishDate = publishDate;
}
public String getAnnoation() {
return annoation;
}
public void setAnnoation(String annoation) {
this.annoation = annoation;
}

}

//相应pojo
import javax.xml.bind.annotation.XmlRootElement;


@XmlRootElement( name = "resp" )
public class BookResp{

private String bookName;
private String author;
private String publishDate;
private String annoation;


public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublishDate() {
return publishDate;
}
public void setPublishDate(String publishDate) {
this.publishDate = publishDate;
}
public String getAnnoation() {
return annoation;
}
public void setAnnoation(String annoation) {
this.annoation = annoation;
}
}

第二步,配置文件
<import resource="classpath:cxf/cxf.xml" />
<import resource="classpath:cxf/cxf-extension-jaxrs-binding.xml" />
<import resource="classpath:cxf/cxf-servlet.xml" />

<jaxrs:server id="jaxrsTv" address="/">
<jaxrs:serviceBeans>
<ref bean="bookService"/>
</jaxrs:serviceBeans>

<jaxrs:extensionMappings>
          <entry key="xml" value="application/xml"/>
          <entry key="json" value="application/json"/>
</jaxrs:extensionMappings>
</jaxrs:server>

<bean id="bookService" class="mytest.rest.service.Book">
</bean>
注意我这里粘贴的是主要xml文件。
第三步,启动,打开浏览器,输入http://localhost:8080/mytest/book//getbook/boboke.xml。
然后可以看到结果了,欧儿了。hello word就这么简单。有项目需要的可以参考cxf,jsr-311去扩展,去深入。

知道怎么用了,还得知道它是怎么回事,怎么用好,怎么用不好。这个得看看《restful web service》这本书了。建议不要从头到尾看完,原因有二,好多技术书,等你看完了,反倒啥也不知道了,项目也完了,唯一的用处是拿着跟别人狂吹,或者去面试,当然这得有吹友或者你经常去面试。还有就是写书的人写的一般都全面,你没有必要去看你已经懂的东西,
这跟背英语单词不一样,多背几遍混个眼熟。不过有志在rest界出人头地的可以深入研究。完了,又废话了。
关于rest理论网上可以找很多书,和博客。我就不多说了。我想说的是哪种情况下我们用rest。
首先是你在写web应用。我认为企业级应用,比如说金融,电信系统的内部架构,不适合restful架构。因为rest毕竟是个轻量级的web service,快速,简单。像ruby on rails就是最好的例子。还有一个它跟ajax的关系。至少在rest走红的过程里,ajax也扮演了皮蓬的角色。
其次你的service 是面向资源的。《restful web service》里提到的ROA。把你的服务程序,数据一切的一切抽象成资源,然后标个唯一地址。好比喻你在银行ATM机上操作一样,有的是取钱,有的是存钱,有的两者兼具,还有的可以汇款。几台机器放在那,想干什么自己选。但是说明了哪些资源能干什么,哪些不能干。但是在柜台上就不一样了你找到营业员,发个命令(soap)--我要存钱,ok她给你存;或者跟她说我要取钱,没问题她给你取。柜台营业员给你提供了服务,你不需要关心她存哪里,怎么存。你面对的只是营业员这一个接口,你每次只需要用嘴巴发号施令就ok了。用soap的术语来说就是把消息放到信封里(envelope),发给营业员。不过考虑到国内营业员的态度,我相信你也不敢这么做的。
可有人说去哪儿存钱不都一样吗?不一样。如果你要存1万块去ATM没问题,如果100万,那么对不起,即使ATM允许你这么干,我估计你也不想这么做的。
总结:rest的精髓就在于它充分利用了http协议。它的无状态性,无连接性,表述性都体现了http的特性,我想这是我们选择rest最关键的因素,也是用好它的关键。

你可能感兴趣的:(Web,Ajax,面试,REST,SOAP)