在 Lagom 中访问 URL 查询参数
Access URL Query Parameters in Lagom
如何从 Lagom 的 http 请求中访问 URL 查询参数?我有一个要求,其中查询参数集是不确定的和无限的。我想以地图的形式访问查询参数。有什么办法吗?
来自文档:
也可以从路径中提取查询字符串参数,在 ? 之后使用 & 分隔列表。在路径的尽头。例如,以下服务调用使用查询字符串参数来实现分页:
ServiceCall> getItems(long orderId, int pageNo, int pageSize);
default Descriptor descriptor() {
return named("orders").withCalls(
pathCall("/order/:orderId/items?pageNo&pageSize", this::getItems)
);
}
从 Lagom 1.3 开始,目前没有办法将查询参数作为映射访问,或者声明采用不确定参数的服务调用。
在请求可能具有任意长度或复杂性的情况下,最好在实体主体中对请求数据进行编码,并使用 Lagom 中的请求消息反序列化器将其映射到不可变数据类型。
https://github.com/msdhillon8989/lagom-demo-request-header.git
可以使用lagom的HeaderServiceCall
@Override
public ServiceCall<NotUsed, String> method1() {
return readHeader(
new Function<String, ServerServiceCall<NotUsed, String>>() {
@Override
public ServerServiceCall<NotUsed, String> apply(String param) throws Exception {
return request -> {
return completedFuture(Utilities.ok(null, parseQueryString(param).toString()));
};
}
});
}
readHeader函数定义如下
public <Request, Response> ServerServiceCall<Request, Response> readHeader(Function<String, ServerServiceCall<Request, Response>> serviceCall) {
return HeaderServiceCall.composeAsync(new java.util.function.Function<RequestHeader, CompletionStage<? extends ServerServiceCall<Request, Response>>>() {
@Override
public CompletionStage<? extends ServerServiceCall<Request , Response>> apply(RequestHeader requestHeader) {
CompletableFuture<String> uri = CompletableFuture.supplyAsync(()->requestHeader.uri().getRawQuery().toString());
return uri.thenApply(query->
{
try {
return serviceCall.apply(query);
} catch (Exception e) {
e.printStackTrace();
throw new Forbidden("Bad request "+e.getMessage());
}
}
);
}
});
}
如何从 Lagom 的 http 请求中访问 URL 查询参数?我有一个要求,其中查询参数集是不确定的和无限的。我想以地图的形式访问查询参数。有什么办法吗?
来自文档:
也可以从路径中提取查询字符串参数,在 ? 之后使用 & 分隔列表。在路径的尽头。例如,以下服务调用使用查询字符串参数来实现分页: ServiceCall> getItems(long orderId, int pageNo, int pageSize);
default Descriptor descriptor() {
return named("orders").withCalls(
pathCall("/order/:orderId/items?pageNo&pageSize", this::getItems)
);
}
从 Lagom 1.3 开始,目前没有办法将查询参数作为映射访问,或者声明采用不确定参数的服务调用。
在请求可能具有任意长度或复杂性的情况下,最好在实体主体中对请求数据进行编码,并使用 Lagom 中的请求消息反序列化器将其映射到不可变数据类型。
https://github.com/msdhillon8989/lagom-demo-request-header.git
可以使用lagom的HeaderServiceCall
@Override
public ServiceCall<NotUsed, String> method1() {
return readHeader(
new Function<String, ServerServiceCall<NotUsed, String>>() {
@Override
public ServerServiceCall<NotUsed, String> apply(String param) throws Exception {
return request -> {
return completedFuture(Utilities.ok(null, parseQueryString(param).toString()));
};
}
});
}
readHeader函数定义如下
public <Request, Response> ServerServiceCall<Request, Response> readHeader(Function<String, ServerServiceCall<Request, Response>> serviceCall) {
return HeaderServiceCall.composeAsync(new java.util.function.Function<RequestHeader, CompletionStage<? extends ServerServiceCall<Request, Response>>>() {
@Override
public CompletionStage<? extends ServerServiceCall<Request , Response>> apply(RequestHeader requestHeader) {
CompletableFuture<String> uri = CompletableFuture.supplyAsync(()->requestHeader.uri().getRawQuery().toString());
return uri.thenApply(query->
{
try {
return serviceCall.apply(query);
} catch (Exception e) {
e.printStackTrace();
throw new Forbidden("Bad request "+e.getMessage());
}
}
);
}
});
}