Grails Webサービス
8043 ワード
Webサービス
Webサービスは、あなたのWebアプリケーションにWeb APIを提供することです.通常、SOAPまたはRESTで実現されます.の
1 REST
RESTはそれ自体が技術ではなく、アーキテクチャモデルである.is not really a technology in itself, but more an architectural pattern. RESTは非常に簡単で、通常のXMLやJSONを通信機構として、GET、PUT、POST、DELETEなどの下位システムの状態を表現できるURL形式とHTTP方法を組み合わせている.
各HTTPメソッドは、GETメソッドでデータを取得したり、PUTメソッドでデータを作成したり、POSTでデータを更新したりするactionにマッピングされる.この意味でRESTはCRUDに非常に適している.
URL形式
GrailsでRESTを実装するには、第1のステップは、REST形式のURLマッピングURLマッピングを提供することである.
static mappings = {
"/product/$id?"(resource:"product")
}
これにより、URI
/product
がProductController
にマッピングする.以下の表に示すように、コントローラ内部のHTTPメソッドごとに、GET、PUT、POST、DELETEが1つのactionにマッピングされます.メソッドアクション
GET
show
PUT
update
POST
save
DELETE
delete
URLマッピングメカニズムHTTPメソッドとURLのマッピング関係の変更によって:
"/product/$id"(controller:"product"){
action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"]
}
しかし、この例では、URLマッピングで
resource
パラメータを提供しない限り、Grailsは、先に使用したparseRequest
パラメータのようにXMLまたはJSONシーケンス化を自動的に提供しない."/product/$id"(controller:"product", parseRequest:true){
action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"]
}
XMLシーケンス化-読み込み
コントローラは、Grailsが提供するXMLシーケンス化メカニズムによってGET方法を実装することができる.
import grails.converters.*
class ProductController {
def show = {
if(params.id && Product.exists(params.id)) {
def p = Product.findByName(params.id)
render p as XML
}
else {
def all = Product.list()
render all as XML
}
}
..
}
ここで、パラメータにidが指定すると、
id
によりProduct
が検索され、idが指定するProductが存在する場合は、そのProductが戻る、そうでない場合はすべてのProductが戻る.このように、/products
にアクセスすると、すべてのProductが得られ、/product/MacBook
にアクセスすると、MacBookレコードは1つしか得られません.XMLシーケンス化-更新
PUT
およびPOST
をサポートするために、paramsオブジェクトを使用できます.Grailsのparamsオブジェクトには、XMLパケットを読み込む機能があります.次のXMLパケットのように:<?xml version="1.0" encoding="ISO-8859-1"?>
<product>
<name>MacBook</name>
<vendor id="12">
<name>Apple</name>
</vender>
</product>
データバインド章で説明したような方法で、paramsオブジェクトからXMLデータを読み込むことができます.
def save = {
def p = new Product(params['product']) if(p.save()) {
render p as XML
}
else {
render p.errors
}
}
この例では、
params
オブジェクトの'product'
に対応する値を抽出することによって、Product
のコンストラクタによってXMLデータを自動的に作成およびバインドすることができる.この行に注意してください.def p = new Product(params['product'])
ここでは、XMLデータ要求を処理する方法でフォームコミットを処理するために、コードを変更する必要はありません.同様の方法でJSON要求を処理することも可能である.
異なるクライアント(REST、HTMLなど)に対して異なる応答を提供する必要がある場合は、
content negotation
The
Product
object is then saved and rendered as XML, otherwise an error message is produced using Grails' validation capabilities in the form: <error>
<message>The property 'title' of class 'Person' must be specified</message>
</error>
2 SOAP
Grailsは、XFireプラグインによってSOAPをサポートします.XFireプラグインは、Grailsのservicesを特定の
expose
プロパティでSOAPサービスとして提供できる、ポピュラーなXFire SOAPプロトコルスタックを使用します.class BookService { static expose=['xfire']
Book[] getBooks(){
Book.list() as Book[]
}
}
WSDLファイルは、
http://127.0.0.1:8080/your_grails_app/services/book?wsdl
によって取得できます.詳細については、XFireプラグインのwiki ドキュメントを参照してください.
3 RSSとAtom
GrailsはRSSとAtomのサポートを直接提供していない.You could construct RSS or ATOM feeds with the render method's XML capability. RSSおよびAtomは、Grails Feedsプラグインによって構築することができる.変更プラグインは流行のROMEライブラリを使用する.次に、このプラグインを簡単に使用する例を示します.
def feed = {
render(feedType:"rss", feedVersion:"2.0") {
title = "My test feed"
link = "http://your.test.server/yourController/feed"
Article.list().each() {
entry(it.title) {
link = "http://your.test.server/article/${it.id}"
it.content // return the content
}
}
}
}