2011-11-17 34 views
5

Tôi không tìm thấy điều này ở bất cứ đâu - tôi có thể nói với Play không! rằng một phương pháp điều khiển cụ thể nên (chỉ) được truy cập thông qua HTTP POST?Tôi có thể đánh dấu phương thức điều khiển là POST trong Play bằng chú thích không?

Thứ gì đó giống như HttpPost attribute trong C# Asp.Net MVC của C#?

public class MyController extends Controller { 

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

Cập nhật - Tôi không hiểu gì thêm một tuyến đường POST làm:

  1. Một POST yêu cầu sẽ làm việc mà không cần thêm một con đường như vậy.
  2. Vì phương pháp vẫn bị bắt bởi quy tắc GET "Bắt tất cả", thậm chí thêm tuyến đường POST sẽ không ngăn các yêu cầu GET cho phương thức này.
+0

Bạn cần xóa * bắt tất cả nếu bạn muốn phương thức của mình chỉ được truy cập qua POST. Việc bắt tất cả đó chỉ nên được sử dụng để phát triển. Nó cũng giúp bạn thấy chính xác những gì bạn đang phơi bày! – mericano1

+0

@ mericano1 - bắt tất cả là tuyệt vời cho việc tuân theo Công ước thành ngữ cấu hình, tôi không nghĩ rằng đó là xấu cho sản xuất (nếu không tôi sẽ chỉ lặp lại danh sách các bộ điều khiển/hành động có ... bảo trì nhiều hơn). Tôi đoán tôi sẽ gửi yêu cầu tính năng. – ripper234

+0

Đã đăng một vé: https://play.lighthouseapp.com/projects/57987-play-framework/tickets/1260-ability-to-mark-controller-methods-as-post-by-annotation – ripper234

Trả lời

1

Bạn có thể làm theo cách này:

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

Nhưng hãy nhớ rằng mã của bạn và tập tin tuyến đường của bạn có thể không được đồng bộ.

Ngoài ra, bạn có thể sử dụng mã Groovy bên trong tệp tuyến, do đó không cần sao chép.

# Catch all 
#{if play.mode.isDev()} 
* /{controller}/{action}  {controller}.{action} 
#{/if} 
+0

Thật thú vị về những thứ hấp dẫn trong các tuyến đường - nhưng ngoài vấn đề - tôi cần mã để làm việc trong Prod, không chỉ là Dev. – ripper234

+0

Tôi sẽ chấp nhận câu trả lời của bạn vì đó là điều tốt nhất tiếp theo với những gì tôi muốn - nhưng hãy xem vấn đề tôi đã mở về việc đánh dấu điều này bằng chú thích - https://play.lighthouseapp.com/projects/57987-play-framework/ vé/1260-khả năng để đánh dấu-điều khiển-phương pháp-as-post-by-chú thích – ripper234

+0

Mã Groovy trên vô hiệu hóa bắt tất cả trong Prod, nó thực hiện những gì @ mericano1 đề nghị. Nhưng hãy xem họ có chấp nhận vé của bạn không. Bạn mong đợi phản ứng HTTP nào khi ai đó truy cập hành động của bạn bằng phương pháp sai? –

2

Bạn làm điều này trong các tập tin tuyến đường:

POST /person/add MyController.addPerson 

Có tài liệu hướng dẫn thêm về here này.

+0

Tôi thấy tùy chọn này, nhưng cảm thấy hơi khó xử. Ngoài ra, ngay cả khi tôi thêm tuyến đường này, phương thức này cũng sẽ phản hồi các yêu cầu GET, vì nó sẽ khớp với tuyến đường "Bắt tất cả" mặc định. Có kế hoạch cho phép thiết lập điều này thông qua chú thích không? Tôi có nên gửi yêu cầu tính năng không? – ripper234

+0

Xem câu hỏi được cập nhật của tôi. – ripper234

2

Tôi đến muộn một chút. afaik rằng không có bất xây dựng trong chú thích, nhưng bạn có thể khá dễ dàng viết một mình:

chú thích/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"; 
} 

controllers/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! "); 
      } 
     } 
    } 
} 

sử dụng: điều khiển /Admin.java

@With({Global.class, Secure.class}) 
public class Admin extends Controller { 
    @HttpMethod(method="POST") 
    public static void save(MyModel model){ 
     // yey... 
    } 
} 
Các vấn đề liên quan