В мире веб-разработки традиционно, при создании первых приложений, пишутся телефонные справочники. Последуем традиции и напишем веб сервис для этого справочника. Не будем усложнять с доменным уровнем: пусть у нас будет только один класс - Person. Допустим такой:
class Person { String firstname String lastname Integer phone String email static constraints = { firstname blank:false lastname blank:false phone size:10 email email:true } }RESTful web service должен оперировать стандартными web-методами: GET, POST, PUT и DELETE. По запросу GET мы должны предоставить пользователю информацию о человеке из адресной книги, по POST - сохранить контакт, по PUT - обновить и по DELETE - удалить. Опишем эти принципы в маппинге адресов нашего приложения - модифицируем класс UrlMappings, чтобы он стал таким:
class UrlMappings { static mappings = { "/person"(controller:"person") { action = [GET:"show", POST:"save", PUT:"update", DELETE:"remove"] } } }Осталось совсем недолго! Теперь создадим контроллер, который собственно и будет нашим веб сервисом. Следуя традициям Grails, назовем его в честь доменного класса - PersonController:
package phonebookws import grails.converters.JSON import javax.validation.ValidationException class PersonController { def show() { if(params.id && Person.exists(params.id)) { render Person.get(params.id) as JSON } else { render Person.list() as JSON } } def save() { def person = new Person(params) if(!person.validate()) throw new ValidationException("Person data is not valid", person.errors) person.save() render person as JSON } def update() { def userPerson = new Person(params) if(!userPerson.validate()) throw new ValidationException("Person data is not valid", userPerson.errors) if(userPerson.id && Person.exists(userPerson.id)) { def dbPerson = Person.get(userPerson.id) if (!userPerson.firstname.empty) dbPerson.firstname = userPerson.firstname; if (!userPerson.lastname.empty) dbPerson.lastname = userPerson.lastname; if (!userPerson.phone != 0) dbPerson.phone = userPerson.phone; if (!userPerson.email.empty) dbPerson.email = userPerson.email; dbPerson.save() } } def remove() { if(params.id && Person.exitsts(params.id)) { def person = Person.get(params.id) person.delete() } } }
Веб сервис готов! Конечно, он получился не чудом инженерной мысли и далеко не самым элегентным, но он работает, в чем вы можете убедиться написав для него клиента. Например, так:
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.2' ) import groovyx.net.http.* def http = new HTTPBuilder( 'http://localhost:8080/PhoneBookWS/' ) pbody = [ lastname:'Marley', firstname:'Bob', email: 'bob@marley.com', phone: 1234567890 ] http.post (path: 'person', body: pbody) { resp -> println "New record is created." } http.get( path: 'person', query: [id:1] ) { resp, json -> println json }Как не трудно догадаться, в этом примере мы создаем запись в адресной книге, а затем выводим её.
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.