Zi 字媒體
2017-07-25T20:27:27+00:00
Introduction
REST(Representational State Transfer)是一種分散式超媒體系統(如WWW)的軟體架構風格,你可以想像它是一個良好設計的Web應用程式規則。
REST 所描述的網路系統包括三個部份:
Data elements (resource, resource identifier, representation)
Connectors (client, server, cache, resolver, tunnel)
Domponents (origin server, gateway, proxy, user agent)
REST Principles
Data elements 由標準化介面存取
Components 透過介面傳輸 資源表徵 (representations of resources) 來溝通,而不是直接操作資源本身。
Connectors 提供 component 的抽象介面來溝通,隱藏溝通機制的實作細節。
REST符合以下幾個條件:
應用程式的狀態跟功能拆成 resources
每個 Resource 使用 URI 作為獨一無二的定址方式
所有 Resources 共用相同的介面在 Client 跟 Resource 之間轉換狀態,包括:
A. 定義操作 well-defined operations (在HTTP中即 GET/POST/PUT/DELETE)
B. 有限的內容格式 content types
REST包含以下特色:
A. Client/Server 架構
B. Stateless 狀態無關
C. Cacheable 快取能力
D. Layered 分層能力
符合 REST principles 的系統稱做 RESTful。
Lightweight REST framework, Restlet API
官方網站 http://www.restlet.org/
Restlet on Jetty Implement
載入相關Jar檔
org.restlet.jar
com.noelios.restlet.jar
com.noelios.restlet.ext.servlet.jar
以Eclipse開啟Dynamic Web Project新專案
新增EntryApplication.java
package com.toright.rest;
import org.restlet.Application;
import org.restlet.Context;
import org.restlet.Restlet;
import org.restlet.Router;
public class EntryApplication extends Application {
public EntryApplication(Context parentContext) {
super(parentContext);
}
@Override
public synchronized Restlet createRoot() {
Router router = new Router(getContext());
//設定URI位置
router.attach("/users/{user}", UserResource.class);
//設定預設的處理Class
router.attachDefault(HelloWorldResource.class);
return router;
}
}
新增HelloWorldResource.java
package com.toright.rest;
import org.restlet.Context;
import org.restlet.data.MediaType;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.resource.Representation;
import org.restlet.resource.Resource;
import org.restlet.resource.StringRepresentation;
import org.restlet.resource.Variant;
public class HelloWorldResource extends Resource {
public HelloWorldResource(Context context, Request request, Response response) {
super(context, request, response);
getVariants().add(new Variant(MediaType.TEXT_PLAIN));
}
@Override
public Representation getRepresentation(Variant variant) {
Representation representation = new StringRepresentation("Hello world", MediaType.TEXT_PLAIN);
return representation;
}
}
新增UserResource.java
package com.toright.rest;
import org.restlet.Context;
import org.restlet.data.MediaType;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.resource.Representation;
import org.restlet.resource.Resource;
import org.restlet.resource.StringRepresentation;
import org.restlet.resource.Variant;
public class UserResource extends Resource {
String userName;
Object user;
public UserResource(Context context, Request request, Response response) {
super(context, request, response);
System.out.println("Method:"+request.getMethod().getName());
this.userName = (String) request.getAttributes().get("user");
getVariants().add(new Variant(MediaType.TEXT_PLAIN));
}
@Override
public Representation getRepresentation(Variant variant) {
Representation result = null;
if (variant.getMediaType().equals(MediaType.TEXT_PLAIN)) {
result = new StringRepresentation("Account of user \"" + this.userName + "\"");
}
return result;
}
}
編輯 web.xml
first steps servlet
org.restlet.application
com.transtep.rest.EntryApplication
RestletServlet
com.noelios.restlet.ext.servlet.ServerServlet
RestletServlet
/*
專案的結構如下圖
執行Jetty與測試 http://127.0.0.1:8080/restlet/ 沒有輸入資源位置,自動轉換至預設處理Class,畫面顯示Hello,world
http://127.0.0.1:8080/restlet/users/mary 以資源位置處理相關的功能
寫了
5860316篇文章,獲得
23313次喜歡