Я пытаюсь реализовать простой RestfulController для своего приложения. Учитывая следующий класс домена:Grails RestfulController не отвечает JSON, когда присутствует заголовок Content-Type: application/x-www-form-urlencoded
class Test {
String name
int someInteger
static constraints = {
}
}
и его контроллер:
class TestController extends RestfulController<Test>{
TestController() {
super(Test)
}
}
Внутри конф/UrlMappings.groovy я добавил следующие данные:
"/api/$controller?(.${format})?" {
action = [POST: "save", PUT: "save", GET: "index", DELETE:"error"]
}
"/api/$controller/$id?(.${format})?" {
action = [POST: "update", PUT: "update", GET: "show", DELETE: "delete"]
}
Получить запросы работают нормально, но отправлять и отправлять запросы по URL-адресу, например http://localhost:8080/app/api/test.json
, когда присутствует заголовок Content-Type: application/x-www-form-urlencoded
, который не отвечает JSON, как ожидалось. Вместо этого визуализируйте представление действия шоу после сохранения отправленного entrie.
Я также попытался использовать заголовок Accept: application/json
без эффекта.
Как это исправить?
Edit:
Дальнейшего расследование RestfulController
«s исходного файла и раздел документов о Content Negotiation я был в состоянии исправить это путем переопределения сохранения и метода обновления заменить строку:
request.withFormat {
с:
withFormat {
Это намеренно или есть недостаток в реализации RestfulController
? Почему он рассматривает заголовок Content-Type вместо заголовка Accept для визуализации ответа?
Эй, спасибо за быстрый ответ. К сожалению, этот же контроллер используется для API остатка и для рендеринга crud views. Возможно, это была плохая проектная стратегия, но усилия по ее изменению сейчас слишком велики. Моим обходным решением пока является создание класса 'MyRestfullController', расширяющего' RestfullController' изменение поведения методов сохранения и обновления для рассмотрения заголовка Accept вместо Content-Type. – ylima
Я думаю, что мое предложение должно работать, даже если есть методы, которые отображают представления GSP, если эти методы вызывают 'render' вместо' reply' –
Итак, вы предлагаете переопределить эти действия, чтобы использовать 'render' внутри' withFormat', вместо 'respond'? Я попробую это и ответ скоро, если это сработает. Спасибо – ylima