Можно ли пометить метод контроллера как POST в Play с использованием аннотаций? - PullRequest
5 голосов
/ 17 ноября 2011

Я нигде не нашел этого - могу я сказать Play! что определенный метод контроллера должен (только) быть доступен через HTTP POST?

Что-то вроде атрибута HttpPost в C # в Asp.Net MVC?

public class MyController extends Controller {

  @Post
  public void addPerson(String name, String address) {
  }
}

Обновление - Я не понимаю, что делает добавление POST-маршрута:

  1. Запрос POST будет работать без добавления такого маршрута.
  2. Поскольку метод по-прежнему отслеживается правилом GET «Catch all», даже добавление POST-маршрута не помешает GET-запросам к этому методу.

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

Я немного опоздал на вечеринку.afaik нет встроенной аннотации, но вы можете написать ее самостоятельно:

аннотации / HttpMethod.java

/**
 * Add this annotation to your controller actions to force a get/post request. 
 * This is checked in globals.java, so ensure you also have @With(Global.class) 
 * in your controller
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface HttpMethod{
    String method() default "POST";
}

контроллеры / Global.java

/**
 * All the funky global stuff ... 
 */
public class Global extends Controller{

    @Before
    public static void before(){
        if( getActionAnnotation( HttpMethod.class ) != null ){
            HttpMethod method = getActionAnnotation( HttpMethod.class ); 
            if( !method.method().equals( request.method ) ){
                error( "Don't be evil! " ); 
            }
        }
    }
}

использование: контроллеры / Admin.java

@With({Global.class, Secure.class})
public class Admin extends Controller {
    @HttpMethod(method="POST")
    public static void save( MyModel model ){
        // yey...
    }
}
2 голосов
/ 17 ноября 2011

Вы делаете это в файле маршрутов:

POST /person/add   MyController.addPerson

Здесь больше документации по здесь .

1 голос
/ 17 ноября 2011

Вы можете сделать это так:

public static void onlyPost() {
  if (request.method.equals("POST")) {
     // ... Do stuff
     render(); 
  }
  else
    forbidden();
}

Но имейте в виду, что ваш код и файл маршрутов могут быть не синхронизированы.

Также вы можете использовать Groovy-код внутри файла маршрутов, поэтому дублирование не требуется.

# Catch all
#{if play.mode.isDev()}
*   /{controller}/{action}       {controller}.{action}
#{/if}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...