2016-10-11 3 views
0

クエリ文字列から値を読み取る必要があるユースケースがあります。 は現在、私は、クエリ文字列をURLに存在している場合は、API1が、そうでない場合はAPI2を実行する必要があり、同じURLに再生フレームワークに同じURLの2つ以上のAPIを作成する

GET /service/class/:className/details controllers.Student.getStudentDetails(studentId) 
GET /service/class/:className/details controllers.Student.getAllStudentsDetails()

をマップする二つの異なるAPIを(いくつかの他の人がコードを作成しています)があります。

URLは両方のAPIで同じであるため、get-student-details API(ルートファイルの優先度が高いため)を使用できます。 私はこの問題を解決するための代替案を探しています。

私の知る限り、クエリ文字列を処理するためだけに異なるAPIを作成する必要はありません。 私は1つのAPIで2つの異なるAPIをマージすることを考えています。要求に応じてクエリ文字列の存在に応じて処理を行います。

私が知りたいのは、同じURLにマップする2つの異なるAPIを実行する方法があるかどうかです(違いはクエリ文字列とのみです)。

注:私は再生2.4.6を使用しています。

答えて

1

私は(たとえば、我々はgetStudentDetailsを選んだ)

1)Optionパラメータ持つ単一コントローラ機能を使用していくつかの方法を参照してください:あなたのhttpリクエスト内のクエリ文字列パラメータを探し

def getStudentDetails(studentId: Option[String]) = Action { studentId match { 
     case Some(id) => // do something 
     case None => // do something else 
    } 
    // .. 
    } 

2):

def getStudentDetails = Action { request => 
    request.queryString.get("studentId") match { 
     case Some(list) => // do something...beware this is a List 
     case None => // do something else 
    } 
    //... 
    } 
+0

はい、あなたが提案したのと同じ方法で修正するつもりです。 – Shailesh

+0

現在のところ、これらのケースでは2つの異なるAPIを使用していますが、再生では1つのAPIしか使用できません。ルートファイルを修正しても問題は解決しないでしょうか(Playは両方のAPIを打つことができます)? – Shailesh

+0

もちろん、あなたはあなたの 'ルート'を変更する必要があります。私はこれらの2つの機能をまとめて回答していました。 – mfirry

関連する問題