1

我正在开发一个 Restful WS,它可以完成查询数据库和带回一些数据的简单工作。正在查询的表有大约 20 列。

我希望能够通过使用我的 SQL 语句的 WHERE 子句中的矩阵参数来过滤我返回的记录。

例如:假设我们有表格 People,其中包含 id、firstname、lastname 列

我希望 URL将所有名字等于 Nick ( )http://localhost:808/myservice/people;firstname=nick 的人带回给我。select * from people where firsname='Nick'

首先,这是正确的做法吗?其次,在我有 20 列的平板电脑中,我必须在我的 Java 代码中创建一个包含所有可能的矩阵参数的方法(见下文),或者有更好的方法来做到这一点?

public Response getPeople(@MatrixParam("id") String id,
            @MatrixParam("firstname") String firstname,
                    @MatrixParam("lastname") String lastname,
                    @MatrixParam("antoherColumn") String antoherColumn,
                    @MatrixParam("antoherColumn") String antoherColumn,
                    @MatrixParam("antoherColumn") String antoherColumn,
                    @MatrixParam("antoherColumn") String antoherColumn,
                    @MatrixParam("antoherColumn") String antoherColumn,
                    @MatrixParam("antoherColumn") String antoherColumn,
                    @MatrixParam("antoherColumn") String antoherColumn,
                    @MatrixParam("antoherColumn") String antoherColumn,) {

}

提前致谢

4

2 回答 2

0

首先,不要通过连接字符串来创建查询:

String q = "select * from where firstName = " + firstName //BAD!

您要求诸如 SQL 注入攻击之类的麻烦。如果您使用 JDBC,请使用查询参数。

由于您可能想使用 GET 请求,因此您可以坚持您的方法,改用查询参数 (@QueryParam)。您还可以考虑以下方法:

http://localhost:808/myservice/people?filter=firstname:nick,lastName:smith

和方法:

public Response getPeople(@QueryParam("filter") String filter) {
  //if filter is not null, tokenize filter string by ',' then by ':' 
  //to get needed parameters

}
于 2013-05-28T17:37:34.237 回答
0

您应该使用@BeanParam将 MatrixParam 映射到对象。

通过这种方式,您可以保持资源非常简单,但仍然可以添加更多矩阵参数。此外,添加矩阵参数根本不涉及更改资源。@BeanParam 也适用于@PathParam 和@QueryParam。

示例:考虑一下:

http://localhost:8081/myservice/people;firstname=nick,lastName=smith/?offset=3&limit=4

然后是资源:

@GET
public Response get(@BeanParam Filter filter, @BeanParam Paging paging) {
    return Response.ok("some results").build();
}

过滤器类看起来像:

public class Filter {

    public Filter(@MatrixParam("firstname") String firstname, @MatrixParam("lastname")  String lastname) {}
}

和分页类:

public class Paging {

public Paging(@QueryParam("offset") int offset, @QueryParam("limit") int limit) { }
}

您还可以使用更多过滤器,例如 Filter1、Filter2 等,以使其更加模块化。

使用矩阵参数最大的优点是缓存。如果您的 API 中有多个级别,例如../animals;size=medium/mamals;fur=white/?limit=3&offset=4 ,则更有意义,因为查询参数将适用于所有集合。

于 2013-12-18T10:27:54.007 回答