カスタム検索

2009年3月7日土曜日

GrailsとRESTのただならぬ事情

GrailsでRESTfulなWebアプリを作るのは凄く簡単です。

URLMappingで以下のように振分けが出来ます。

"/rest/$id?"(controller:"rest"){
action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"]
}


これで /rest に来たアクセスはメソッドによりアクションへ振分けされます。
GET(普通にブラウザで開いたり)した場合は show アクションへ、POST(フォーム送信とか)なら save アクションへ飛ばされます。

詳しくはIBMの記事を参照下さい。

ではGrailsでRESTfulなサービスを使用するには、というとデフォではそのような機能はありません。(多分)
ここで前に使ったHTTPBuilderを使おうと思ったのですが、こいつがGrailsと組み合わせてしまうと思うように動かないメソッドがあったりします・・・
http.request(GET,TEXT) { req -> }  とか・・・ responseが正常に取得出来ません :(

HTTPBuilderは中でApache HttpClientを使ってるだけなんで、こいつを直接使う事にしました。


def client = new HttpClient()
def getMethod = new GetMethod("http://localhost:8080/restProject/rest/1")
getMethod.setRequestHeader("Accept", "text/json")
client.executeMethod(getMethod)
def result=getMethod.getResponseBodyAsString().toString()


これでGETを実行し、結果をStringで受け取れます。
それぞれ PostMethod、PutMethod、DeleteMethodが用意されているのでそれらに置き換えれば他のメソッドを実行出来ます。

RESTってHTTPプロトコルの標準な機能なのでクライアントに特別なライブラリ等を追加する必要がない反面、WSDLのようにメソッドの仕様や型の制御などが作り手次第になってしまうのがちょっと難点な気がします。

でもWSDLと違って、認証等はacegi pluginいれてbasic認証使えば比較的セキュアかつ統合された作りが簡単に出来るのは良いですね!

2009年3月2日月曜日

GrailsでMySQLに接続

特に書くほどの事でも無いですが一応メモ・・・

MySQLへの接続は Connector/J で行いますんで、MySQLのサイトから接続するDBバージョンにあわせたConnector/Jをダウンロードします。
今回は 5.1 なので mysql-connector-java-5.1.7.tar.gz をダウンロードしました。
こいつを解凍して mysql-connector-java-5.1.7-bin.jar を grails の lib フォルダに入れます。

まずはDB側の設定。my.cnf に以下を入れておく。

default-character-set=utf8

MySQLAdministrator の設定画面から行くと↓のへん


DBを先に作っておき(今回はdbnameという名称で仮定)、 conf/DataSource.groovy の設定を

pooled = true
dialect = org.hibernate.dialect.MySQLDialect.class
driverClassName = "org.gjt.mm.mysql.Driver"
username = "root"
password = ""
dbCreate = "update"
url = "jdbc:mysql://localhost/dbname?useUnicode=true&characterEncoding=UTF8"

以上のようにして起動すればめでたしめでたし。