2011-11-17 9 views
5

私はこれをどこにも見つけられませんでした - 私はプレイを伝えることができます! HTTP POSTを介して特定のコントローラメソッドにアクセスする必要があるかどうかを確認します。注釈を使用してコントローラメソッドをPlayのPOSTとしてマークすることはできますか?

C#のAsp.Net MVCでHttpPost attributeのようなものがありますか?

public class MyController extends Controller { 

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

アップデート - 私がやるPOSTルートを追加するかを理解していない:

  1. をPOSTリクエストは、このようなルートを追加せずに動作します。
  2. このメソッドは "Catch all" GETルールによって引き続きキャッチされるため、POSTルートを追加しても、このメソッドに対するGET要求は防止されません。
+0

POSTのみでメソッドにアクセスするには、* catch allを削除する必要があります。そのキャッチオールは、とにかく開発のためだけに使うべきです。 これはまた、あなたが暴露しているものを正確に見るのに役立ちます! – mericano1

+0

@ mericano1 - キャッチオールは、コンベンションオーバーのコンベンションイディオムにはいいです、私はそれが生産のために悪いとは思わない(そうでなければ、コントローラ/アクションのリストを複製します...私は機能要求を提出すると思います。 – ripper234

+0

チケットを投稿しました:https://play.lighthouseapp.com/projects/57987-p​​lay-framework/tickets/1260-ability-to-mark-controller-methods-as-post-by-annotation – ripper234

答えて

1

あなたはそれをこのように行うことができます:

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} 
+0

ルートでのグルーヴィーについては涼しいですが、その点以外にも、DevだけでなくProdで作業するためのコードが必要です。 – ripper234

+0

これは私が望んでいたことの次善のものだからあなたの答えを受け入れるでしょう - しかし、これを注釈でマークすることについて開かれた問題を見てください - https://play.lighthouseapp.com/projects/57987-p​​lay-framework/ Tickets/1260-ability to-mark-controller-methods-by-by-annotation – ripper234

+0

上記のGroovyコードは、Prodのcatch allを無効にし、@ mericano1が提案したものを実装します。しかし、彼らがあなたのチケットを受け入れるかどうかを見てみましょう。誰かがあなたの行動に間違った方法でアクセスしたときに、どんなHTTP応答を期待していますか? –

2

あなたはルートファイルで次の操作を行います。

POST /person/add MyController.addPerson 

このhereの詳細ドキュメントがあります。

+0

このオプションを見ましたが、それは少し厄介だと感じています。また、このルートを追加しても、このメソッドはデフォルトの「Catch all」ルートと一致するため、GETリクエストにも応答します。 注釈でこれを設定する計画はありますか?機能要求を提出する必要がありますか? – ripper234

+0

更新された質問をご覧ください。 – ripper234

2

私は少し遅れています。

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

用法: コントローラが、注釈、 に組み込まれていないが、あなたは非常に簡単に1を自分で書くことができます私の知る限り /Admin.java

@With({Global.class, Secure.class}) 
public class Admin extends Controller { 
    @HttpMethod(method="POST") 
    public static void save(MyModel model){ 
     // yey... 
    } 
} 
関連する問題