كيفية التعامل مع معلمات الاستعلام الاختيارية في إطار اللعب

StackOverflow https://stackoverflow.com//questions/9657163

سؤال

لنفترض أن لدي تطبيقًا يستند إلى إطار عمل Play 2.0 يعمل بالفعل في Scala والذي يخدم عنوان URL مثل:

http://localhost:9000/birthdays

الذي يستجيب بقائمة بجميع أعياد الميلاد المعروفة

أريد الآن تحسين ذلك عن طريق إضافة القدرة على تقييد النتائج باستخدام معلمات الطلب الاختيارية "من" (التاريخ) و"إلى" مثل

http://localhost:9000/birthdays?from=20120131&to=20120229

(يتم تفسير التواريخ هنا على أنها yyyyMMdd)

سؤالي هو كيفية التعامل مع ربط معلمات الطلب وتفسيره في Play 2.0 باستخدام Scala، خاصة وأن كلا من هاتين المعلمتين يجب أن يكونا اختياريين.

هل يجب التعبير عن هذه المعلمات بطريقة ما في مواصفات "المسارات"؟وبدلاً من ذلك، هل يجب على أسلوب وحدة التحكم المستجيبة فصل المعلمات عن كائن الطلب بطريقة ما؟هل هناك طريقة اخرى لعمل هذا؟

هل كانت مفيدة؟

المحلول

قم بتشفير المعلمات الاختيارية الخاصة بك كـ 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])

نصائح أخرى

ربما الطريقة الأقل نظيفة للقيام بها لمستخدمي Java هي إعداد الإعدادات الافتراضية: giveacodicetagpre.

وفي وحدة التحكم giveacodicetagpre.

مشكلة أخرى، سيتعين عليك تكرار الإعدادات الافتراضية كلما ترتبط بصفحتك في القالب giveacodicetagpre.

بالإضافة إلى إجابة جوليان.إذا كنت لا ترغب في تضمينه في ملفات الملفات .

يمكنك الحصول على هذه السمة في طريقة وحدة التحكم باستخدام Requestheader giveacodicetagpre.

هذا سوف يمنحك معلمات الطلب المطلوب، بالإضافة إلى الحفاظ على ملفات ملفات الملفات.

هنا مثال جوليان إعادة كتابة في جافا، باستخدام f.option: (يعمل اعتبارا من اللعب 2.1) giveacodicetagpre.

الطريق: giveacodicetagpre.

يمكنك أيضا اختيار المعلمات الاستعلام التعسفي كسلاسل (عليك أن تقوم بتحويل النوع بنفسك): giveacodicetagpre.

بالنسبة لمعلمات الاستعلام الاختيارية، يمكنك القيام بذلك بهذه الطريقة

في ملف المسارات، أعلن API

GET   /birthdays     controllers.Application.method(from: Long, to: Long)

يمكنك أيضًا إعطاء بعض القيمة الافتراضية، في حالة عدم احتواء واجهة برمجة التطبيقات (API) على معلمات الاستعلام هذه، فسوف تقوم تلقائيًا بتعيين القيم الافتراضية لهذه المعلمات

GET   /birthdays    controllers.Application.method(from: Long ?= 0, to: Long ?= 10)

في الطريقة المكتوبة داخل تطبيق وحدة التحكم، سيكون لهذه المعلمات قيمة null إذا لم يتم تعيين قيم افتراضية لقيم افتراضية أخرى.

طريقتي في القيام بذلك تتضمن استخدام custom 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) + "&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 هي مجرد طريقة ملائمة أستخدمها في وحدات التحكم الخاصة بي إذا كنت أرغب في تطبيق تصفية التاريخ على الاستعلام.من الواضح أنه يمكنك استخدام إعدادات افتراضية أخرى للتاريخ هنا، أو استخدام بعض الإعدادات الافتراضية الأخرى غير القيمة الخالية لتاريخ البدء والانتهاء في ملف bind طريقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top