Frage

Nehmen wir an, ich habe eine bereits funktionierende Play 2.0 Framework-basierte Anwendung in Scala, die eine URL wie die folgende bereitstellt:

http://localhost:9000/birthdays

die mit einer Auflistung aller bekannten Geburtstage antwortet

Ich möchte dies jetzt verbessern, indem ich die Möglichkeit hinzufüge, Ergebnisse mit optionalen Anforderungsparametern "von" (Datum) und "bis" einzuschränken, z

http://localhost:9000/birthdays ?von=20120131&bis=20120229

(Datumsangaben werden hier als jjjjMMtt interpretiert)

Meine Frage ist, wie mit der Bindung und Interpretation von Anforderungsparametern in Play 2.0 mit Scala umgegangen werden soll, insbesondere angesichts der Tatsache, dass beide Parameter optional sein sollten.

Sollten diese Parameter irgendwie in der Spezifikation "Routen" ausgedrückt werden?Alternativ sollte die antwortende Controller-Methode die Parameter irgendwie vom Anforderungsobjekt trennen?Gibt es eine andere Möglichkeit, dies zu tun?

War es hilfreich?

Lösung

Codieren Sie Ihre optionalen Parameter als Option[String] (oder Option[java.util.Date], aber Sie werden Ihre eigenen implementieren müssen QueryStringBindable[Date]):

def birthdays(from: Option[String], to: Option[String]) = Action {
  // …
}

Und deklarieren Sie die folgende Route:

GET   /birthday       controllers.Application.birthday(from: Option[String], to: Option[String])

Andere Tipps

Eine vielleicht weniger saubere Möglichkeit, dies für Java-Benutzer zu tun, ist die Standardeinstellung: generasacodicetagpre.

und in der Steuerung generasacodicetagpre.

Ein weiteres Problem, Sie müssen die Standardeinstellungen wiederholen, wenn Sie in der Vorlage auf Ihre Seite verlinken. generasacodicetagpre.

Neben der Antwort von Julien.Wenn Sie es nicht in die Datei Routen einfügen möchten.

Sie können dieses Attribut in der Controller-Methode mithilfe von Anforderungshelfer erhalten. generasacodicetagpre.

Hier gibt es die gewünschten Anforderungsparameter, plus Halten Sie Ihre -Routen Datei sauber.

Hier ist Juliens Beispiel in Java umgeschrieben, mithilfe von f.Option: (arbeitet ab Play 2.1) generasacodicetagpre.

Route: generasacodicetagpre.

Sie können auch willkürliche Abfrageparameter als Saiten aussuchen (Sie müssen die Typumwandlung selbst durchführen): generasacodicetagpre.

Für optionale Abfrageparameter können Sie dies auf diese Weise tun

in Routes-Datei, deklarieren Sie API generasacodicetagpre.

Sie können auch einen gewünschten Standardwert angeben. Wenn API diese Abfrageparams nicht enthält, wird diese Parameter automatisch die Standardwerte zugewiesen generasacodicetagpre.

in der Methode geschrieben Insidecontroller-Anwendung Diese Parameter verfügen über einen Wertegrafikodicetagcode, wenn keine Standardwerte, die jedoch nicht mit Standardwerten zugewiesen sind.

Meine Art, dies zu tun, beinhaltet die Verwendung eines benutzerdefinierten QueryStringBindable.Auf diese Weise drücke ich Parameter in Routen als aus:

GET /birthdays/ controllers.Birthdays.getBirthdays(period: util.Period)

Der Code für den Zeitraum sieht folgendermaßen aus.

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) + "&amp;" + "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 ist nur eine praktische Methode, die ich in meinen Controllern verwende, wenn ich Datumsfilterung auf die Abfrage anwenden möchte.Natürlich könnten Sie hier andere Datumsvorgaben verwenden oder einen anderen Standardwert als null für das Start- und Enddatum in der bind Methode.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top