Play Frameworkでオプションのクエリパラメータを処理する方法
-
11-12-2019 - |
質問
既に機能しているPlay 2.0フレームワークベースのアプリケーションが、次のようなURLを提供するScalaで既に機能しています。
既知のすべての誕生日のリストで応答する
などのオプションの「DATE」(DATE)と「TO」のプロファイルを使用して結果を制限する機能を追加することでこれを強化したいと考えています。
http:// localhost:9000 /誕生日から?から= 20120229
私の質問は、特にこれらのパラメータの両方がオプションであるべきであることを考えると、Play 2.0でのリクエストPARMバインディングと解釈をスカラで処理する方法です。
解決
オプションのパラメータをOption[String]
(またはOption[java.util.Date]
)としてエンコードしますが、独自のQueryStringBindable[Date]
を実装する必要があります):
def birthdays(from: Option[String], to: Option[String]) = Action {
// …
}
.
と次の経路を宣言する:
GET /birthday controllers.Application.birthday(from: Option[String], to: Option[String])
. 他のヒント
A Javaユーザーにとってこれを行うことのきれいな方法は、デフォルト設定の設定です。
GET /users controllers.Application.users(max:java.lang.Integer ?= 50, page:java.lang.Integer ?= 0)
.
とコントローラ
public static Result users(Integer max, Integer page) {...}
.
もう1つの問題は、テンプレートのページにリンクしているときはいつでもデフォルトを繰り返す必要があります
@routes.Application.users(max = 50, page = 0)
. ジュリアンの答えに加えて。 routes ファイルに含めたくない場合は、
RequestHeader を使用してコントローラメソッドでこの属性を取得できます。
.
String from = request().getQueryString("from");
String to = request().getQueryString("to");
これはあなたに望ましい要求パラメータを加え、あなたの routes ファイルのクリーンを維持します。
ここにJulienの例は、F.Optionを使用してJavaで書き換えられました。(Play 2.1以降で動作する)
import play.libs.F.Option;
public static Result birthdays(Option<String> from, Option<String> to) {
// …
}
.
経路:
GET /birthday controllers.Application.birthday(from: play.libs.F.Option[String], to: play.libs.F.Option[String])
.
文字列として任意のクエリパラメータを選択するだけで(タイプ変換自分自身を実行する必要があります):
public static Result birthdays(Option<String> from, Option<String> to) {
String blarg = request().getQueryString("blarg"); // null if not in URL
// …
}
. オプションのクエリパラメータの場合は、このようにすることができます
routesファイル、宣言API
GET /birthdays controllers.Application.method(from: Long, to: Long)
.
デフォルト値を指定することもできます.APIにはこれらのクエリパラメータが含まれていない場合は、デフォルト値をこれらのPARAMS に自動的に割り当てます。
GET /birthdays controllers.Application.method(from: Long ?= 0, to: Long ?= 10)
.
コントローラアプリケーション内部で書かれた方法では、デフォルト値が割り当てられていない場合は、値null
が発生します。
これを行う私の方法は、カスタムQueryStringBindable
を使用することを含みます。このようにして、ルートのパラメータを表現します。
GET /birthdays/ controllers.Birthdays.getBirthdays(period: util.Period)
.
期間のコードはこのように見えます。
public class Period implements QueryStringBindable<Period> {
public static final String PATTERN = "dd.MM.yyyy";
public Date start;
public Date end;
@Override
public F.Option<Period> bind(String key, Map<String, String[]> data) {
SimpleDateFormat sdf = new SimpleDateFormat(PATTERN);
try {
start = data.containsKey("startDate")?sdf.parse(data.get("startDate") [0]):null;
end = data.containsKey("endDate")?sdf.parse(data.get("endDate")[0]):null;
} catch (ParseException ignored) {
return F.Option.None();
}
return F.Option.Some(this);
}
@Override
public String unbind(String key) {
SimpleDateFormat sdf = new SimpleDateFormat(PATTERN);
return "startDate=" + sdf.format(start) + "&" + "endDate=" + sdf.format(end);
}
@Override
public String javascriptUnbind() {
return null;
}
public void applyDateFilter(ExpressionList el) {
if (this.start != null)
el.ge("eventDate", this.start);
if (this.end != null)
el.le("eventDate", new DateTime(this.end.getTime()).plusDays(1).toDate());
}
}
.
applyDateFilter
は、クエリに日付フィルタリングを適用したい場合は、私のコントローラで使用するコンロベーションの単なる調整方法です。明らかに、ここで他の日付のデフォルトを使用するか、bind
メソッドの開始日と終了日にNULLよりも他のデフォルトを使用することができます。