Grails Webサービス



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 /productProductControllerにマッピングする.以下の表に示すように、コントローラ内部の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 } } } }