职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 604|回复: 1

RestyGWT简介

[复制链接]
醉倚西风 发表于 2011-9-2 12:17 | 显示全部楼层 |阅读模式
定义: RestyGWT是一个REST服务GWT生成器和Java Object JSON数据格式转换引擎。它能够生成基于JSON的异步Restful服务代理,提供易于使用的REST API。
REST Services
RestyGWT的 Rest Services能够生成基于JSON的异步Restful服务,和GWT中的异步类似:

  
  public interface PizzaService extends RestService {   
    @POST  
    public void order(PizzaOrder request,   
                      MethodCallback<OrderConfirmation> callback);   
}  

  public interface PizzaService extends RestService {
    @POST
    public void order(PizzaOrder request,
                      MethodCallback<OrderConfirmation> callback);
}
  
@POST:表示以POST方式向Server端发送数据,server端的servlet具体实现时应该是doPost()。
Java beans可以通过JSON的编码和解码向Server端发送和从server端返回,以PizzaOrder为例:

  
public class PizzaOrder {   
    public String phone_number;   
    public boolean delivery;   
    public List<String> delivery_address = new ArrayList<String>(4);   
    public List<Pizza> pizzas = new ArrayList<Pizza>(10);   
}   
JSON形式:   
{   
  "phone_number":null,   
  "delivery":true,   
  "delivery_address":[   
    "3434 Pinerun Ave.",   
    "Wesley Chapel, FL 33734"  
  ],   
  "pizzas":[   
    {"quantity":1,"size":16,"crust":"thin","toppings":["ham","pineapple"]},   
    {"quantity":1,"size":16,"crust":"thin","toppings":["extra cheese"]}   
  ]   
}  

public class PizzaOrder {
    public String phone_number;
    public boolean delivery;
    public List<String> delivery_address = new ArrayList<String>(4);
    public List<Pizza> pizzas = new ArrayList<Pizza>(10);
}
JSON形式:
{
  "phone_number":null,
  "delivery":true,
  "delivery_address":[
    "3434 Pinerun Ave.",
    "Wesley Chapel, FL 33734"
  ],
  "pizzas":[
    {"quantity":1,"size":16,"crust":"thin","toppings":["ham","pineapple"]},
    {"quantity":1,"size":16,"crust":"thin","toppings":["extra cheese"]}
  ]
}
  
在GWT的客户端调用server端服务:
1. 创建一个REST service 的实例,并和HTTP URL关联起来。示例代码如下:

  
Resource resource = new Resource( GWT.getModuleBaseURL() + "pizza-service");   
PizzaService service = GWT.create(PizzaService.class);   
((RestServiceProxy)service).setResource(resource);   
service.order(order, callback);  

Resource resource = new Resource( GWT.getModuleBaseURL() + "pizza-service");
PizzaService service = GWT.create(PizzaService.class);
((RestServiceProxy)service).setResource(resource);
service.order(order, callback);
  
2. 使用Rest API
  
Resource resource = new Resource("http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&query=finances&format=pdf&output=json&callback=callback");   
resource.jsonp().send(new JsonCallback() {   
            public void onSuccess(Method method, JSONValue response) {   
                JSONObject obj = (JSONObject) ((JSONObject) response).get("ResultSet");   
                RootPanel.get().add(new Label("Search Results Available: " + obj.get("totalResultsAvailable")));   
            }   
  
            public void onFailure(Method method, Throwable exception) {   
                Window.alert("Error x: " + exception);   
            }   
        });  

Resource resource = new Resource("http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=YahooDemo&query=finances&format=pdf&output=json&callback=callback");
resource.jsonp().send(new JsonCallback() {
            public void onSuccess(Method method, JSONValue response) {
                JSONObject obj = (JSONObject) ((JSONObject) response).get("ResultSet");
                RootPanel.get().add(new Label("Search Results Available: " + obj.get("totalResultsAvailable")));
            }

            public void onFailure(Method method, Throwable exception) {
                Window.alert("Error x: " + exception);
            }
        });
  
JSON Encoder/Decoders
要实现Java Object与JSON数据格式转换,必须定义一个接口来继承JsonEncoderDecoder接口,这样RestyGWT就可以实现Java Object与JSON数据的转换了,使用encode和decode方法即可。示例:
1. 首先,定义接口:
  
public interface PizzaOrderCodec  extends JsonEncoderDecoder<PizzaOrder> {   
}  

public interface PizzaOrderCodec  extends JsonEncoderDecoder<PizzaOrder> {
}
  
2. 使用encode和decode方法:
  
// GWT will implement the interface for you   
PizzaOrderCodec codec = GWT.create(PizzaOrderCodec.class);   
  
// Encoding an object to json   
PizzaOrder order = ...   
JSONValue json = codec.encode(order);   
  
// decoding an object to from json   
PizzaOrder other = codec.decode(json);  

// GWT will implement the interface for you
PizzaOrderCodec codec = GWT.create(PizzaOrderCodec.class);

// Encoding an object to json
PizzaOrder order = ...
JSONValue json = codec.encode(order);

// decoding an object to from json
PizzaOrder other = codec.decode(json);
  
REST API
RestyGWT提供了易于使用的REST API,支持所有的HTTP methods,在调用过程中用参数来设置HTTP Accept 和 Content-Type header,并且可以设置response code和request timeout。示例:

  
Resource resource = new Resource( GWT.getModuleBaseURL() + "pizza-service");   
JSONValue request = ...   
resource.post().json(request).send(new JsonCallback() {   
    public void onSuccess(Method method, JSONValue response) {   
        System.out.println(response);   
    }   
    public void onFailure(Method method, Throwable exception) {   
        Window.alert("Error: "+exception);   
    }   
});  

Resource resource = new Resource( GWT.getModuleBaseURL() + "pizza-service");
JSONValue request = ...
resource.post().json(request).send(new JsonCallback() {
    public void onSuccess(Method method, JSONValue response) {
        System.out.println(response);
    }
    public void onFailure(Method method, Throwable exception) {
        Window.alert("Error: "+exception);
    }
});
  
每次请求时必须创建一个新的Method 对象,由下面的HTTP methods产生:
resource.head(); resource.get(); resource.put(); resource.post(); resource.delete()
可以通过下面的方法来设置Content-Type header:
  
method.text(String data)       // HTTP request body为text   
method.xml(Document data)       // HTTP request body为xml   
method.json(JSONValue data)      // HTTP request body为json  

method.text(String data)       // HTTP request body为text
method.xml(Document data)       // HTTP request body为xml
method.json(JSONValue data)      // HTTP request body为json
  
可以通过下面的方法来设置Accept header(与Content-Type 类似):
  
method.send(TextCallback callback)   
method.send(JsonCallback callback)   
method.send(XmlCallback callback)  

method.send(TextCallback callback)
method.send(JsonCallback callback)
method.send(XmlCallback callback)
  

已经来了吗 发表于 2011-9-2 12:17 | 显示全部楼层
推荐链接
3G培训就业月薪平均7K+,不3K就业不花一分钱!
见证又一个准百万富翁的诞生!
20-30万急聘多名天才Java/MTA软件工程师


您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-28 03:14 , Processed in 0.135016 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表