를 처리하는 방법을 선택 매개변수에 놀 framework
-
11-12-2019 - |
문제
고 말할 수 있습니다 내가 이미 기능을 재생 2.0 프레임워크 기반 응용 프로그램에서 스칼라를 제공하는 같은 URL 을:
http://localhost:9000/birthdays
는 응답을 알려진 모든 생일
내가 지금 이를 강화하기 위해 할 수있는 기능을 추가하여를 제한하는 결과를 선택"에서"(날짜)및"을"요청 params 등
http://localhost:9000/birthdays?from=20120131&to=20120229
(여기에 날짜로 해석 yyyyMMdd)
나의 질문은 처리하는 방법을 요청 파라미터 바인딩 및 해석에 놀 2.0 와 스칼라 특히,주어진 이들 모두 params 선택적이어야 합니다.
해야 하는 이러한 매개 변수있게 표현에서"노선"specification?그 대안으로 응답 컨트롤러한 방법을 따로 따로 선택 params 요청으로부터 개체에게?할 수 있는 다른 방법이 있을까요?
해결책
옵션 매개 변수를 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 사용자 가이 작업을 수행하는 데 덜 깨끗한 방법은 기본값입니다.
GET /users controllers.Application.users(max:java.lang.Integer ?= 50, page:java.lang.Integer ?= 0)
.
및 컨트롤러
public static Result users(Integer max, Integer page) {...}
.
하나의 문제점, 템플릿에서 페이지에 연결할 때마다 기본값을 반복해야합니다
@routes.Application.users(max = 50, page = 0)
. 줄리앙의 답변 이외에. routes 파일에 포함시키지 않으려면
RequestHeader 를 사용하여 컨트롤러 메소드 에서이 속성을 얻을 수 있습니다.
.
String from = request().getQueryString("from");
String to = request().getQueryString("to");
이렇게하면 원하는 요청 매개 변수를 제공하고 경로 파일을 깨끗하게 유지합니다.
여기에 F.Option : (Play 2.1의 작동) Java에서 재 작성된 Julien의 예입니다.
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
// …
}
. 선택적 쿼리 매개 변수의 경우이 방법을 수행 할 수 있습니다
라우트 파일에서 API를 선언
GET /birthdays controllers.Application.method(from: Long, to: Long)
.
일부 기본값을 제공 할 수도 있습니다. API에는 이러한 쿼리 매개 변수가 포함되지 않으면 자동으로 기본값을 이러한 params 에 할당합니다.
GET /birthdays controllers.Application.method(from: Long ?= 0, to: Long ?= 10)
.
컨트롤러 응용 프로그램 내부에 기록 된 방법에서 이러한 params는 기본값이 지정된 기본값이 지정되지 않은 경우 값 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
그냥 편 방법에서 사용 컨트롤러고 싶은 경우에는 적용일 필터링을 쿼리가 있습니다.분명히 당신이 사용할 수 있는 다른 여기에 날짜가 기본값으로 사용하거나 일부 다른 기본 null 을 위해 시작과 끝 날짜 bind
방법입니다.