我正在学习Play 2.0(使用Java API)并希望使用double /
float参数(用于位置坐标),例如http://myfooapp.com/events/find?latitude=25.123456&longitude=60.251253。
我可以通过将参数获取为String并在控制器等处进行解析来做到这一点,但是我可以在这里使用自动绑定吗?
现在,我首先尝试仅具有一个double值:
GET /events/foo controllers.Application.foo(doublevalue: Double)
与
public static Result foo(Double doublevalue) {
return ok(index.render("Foo:" + doublevalue));
}
我得到的是 “找不到Double类型的QueryString绑定器。请尝试为此类型实现隐式QueryStringBindable。”
我错过了已经提供的东西吗?还是必须制作一个可解析Double的自定义QueryStringBindable?
我在http://julien.richard-foy.fr/blog/2012/04/09/how-to-implement-a-custom-
pathbindable-with-play中
找到了一些有关使用Scala创建自定义字符串查询字符串绑定器的说明-2 /
我在包装夹中实现了DoubleBinder:
import java.util.Map;
import play.libs.F.Option;
import play.mvc.QueryStringBindable;
public class DoubleBinder implements QueryStringBindable<Double>{
@Override
public Option<Double> bind(String key, Map<String, String[]> data) {
String[] value = data.get(key);
if(value == null || value.length == 0) {
return Option.None();
} else {
return Option.Some(Double.parseDouble(value[0]));
}
}
@Override
public String javascriptUnbind() {
// TODO Auto-generated method stub
return null;
}
@Override
public String unbind(String key) {
// TODO Auto-generated method stub
return null;
}
}
并尝试将其添加到project / Build.scala的main中:
routesImport += "binders._"
但是结果相同:“未找到Double …类型的QueryString绑定器。”
当前(在Play 2.0中),Java活页夹仅适用于自递归类型。也就是说,类型如下所示:
class Foo extends QueryStringBindable<Foo> {
…
}
因此,如果要为java.lang.Double
Java的现有类型定义活页夹,则需要将其包装为自递归类型。例如:
package util;
public class DoubleW implements QueryStringBindable<DoubleW> {
public Double value = null;
@Override
public Option<DoubleW> bind(String key, Map<String, String[]> data) {
String[] vs = data.get(key);
if (vs != null && vs.length > 0) {
String v = vs[0];
value = Double.parseDouble(v);
return F.Some(this);
}
return F.None();
}
@Override
public String unbind(String key) {
return key + "=" + value;
}
@Override
public String javascriptUnbind() {
return value.toString();
}
}
然后,可以在应用程序中按以下方式使用它:
GET /foo controllers.Application.action(d: util.DoubleW)
public static Result action(DoubleW d) {
…
}
上一篇文章我们说到路由的正则编译,正则编译的目的就是和请求的 url 来匹配,只有匹配上的路由才是我们真正想要的,此外也会通过正则匹配来获取路由的参数。 路由的匹配 路由进行正则编译后,就要与请求 request 来进行正则匹配,并且进行一些验证,例如 UriValidator、MethodValidator、SchemeValidator、HostValidator。 class RouteCo
例如,在具有分页列表的路由上,网址可能如下所示,表示我们已加载第二个网页: 使用指令和来传递查询参数。例如: 或者,我们可以使用服务通过JS跳转: 读取查询参数 See Official Documentation on Query Parameters
``` 所以,我的问题是--有没有一种干净的方法来结构和重构路由,而不是将它们集中在一个大的路由定义中?我也许可以创建一个参与者(路由器)的层次结构,主路由定义只是将其委托给路由器,随着我们深入参与者层次结构,我们会逐步添加更多的细节。但是否有一两种普遍接受的模式来组织路线呢?
路由参数 路由分组及规则定义支持指定路由参数,这些参数主要完成路由匹配检测以及行为执行。5.1版本极大改进了路由参数的用法。 路由参数可以在定义路由规则的时候直接传入(批量),不过5.1采用了更加面向对象的方式进行路由参数配置,因此使用方法配置更加清晰。 参数 说明 方法名 method 请求类型检测,支持多个请求类型 method ext URL后缀检测,支持匹配多个后缀 ext deny_ex
将路由链接到参数 显示特定产品详细信息的组件的路由需要该产品ID的路由参数。我们可以使用以下实现: 注意:product-details路由的路径中的 ,它将参数放在路径中。例如,要查看ID为5的产品的产品详细信息页面,必须使用以下URL:localhost:3000/product-details/5 注意,指令传递一个数组,该数组指定路径和路由参数。或者,我们可以使用JS跳转: Product
我已经使用FastAPI创建了一个简单的API,我正在尝试将URL作为任意的<code>路径</code>参数传递给FastAPI路由。 当我测试它时,它不起作用并抛出错误。我以这种方式测试它: