Java complexerestfulget查询

Java complexerestfulget查询,java,rest,tomcat,get,uri,Java,Rest,Tomcat,Get,Uri,我知道如何使用ID进行GET和pull之类的查询,在本例中为“1”,但假设您希望搜索一本包含2个变量而不是1的书。这仍然可以通过GET完成吗?无需担心。我找到了我的答案,密码是: @GET @Produces("application/json") @Path("/network/{id: [0-9]+}/{nid}") public User getUserByNetworkId(@PathParam("id") int id, @PathParam("nid"

我知道如何使用ID进行GET和pull之类的查询,在本例中为“1”,但假设您希望搜索一本包含2个变量而不是1的书。这仍然可以通过GET完成吗?

无需担心。我找到了我的答案,密码是:

    @GET
    @Produces("application/json")
    @Path("/network/{id: [0-9]+}/{nid}")
    public User getUserByNetworkId(@PathParam("id") int id, @PathParam("nid") String networkId) {
        Query q = em.createQuery("SELECT u FROM User u WHERE u.networkId = :id AND u.networkUserId = :nid");
        q.setParameter("id", id);
        q.setParameter("nid", networkId);
        return (User) q.getSingleResult();
    }

别客气。我找到了我的答案,密码是:

    @GET
    @Produces("application/json")
    @Path("/network/{id: [0-9]+}/{nid}")
    public User getUserByNetworkId(@PathParam("id") int id, @PathParam("nid") String networkId) {
        Query q = em.createQuery("SELECT u FROM User u WHERE u.networkId = :id AND u.networkUserId = :nid");
        q.setParameter("id", id);
        q.setParameter("nid", networkId);
        return (User) q.getSingleResult();
    }

常用的方法是将参数作为查询字符串参数传递。。。但是你可以让它们作为url的一部分

e、 g.图书/搜索/arg1/arg2


就我个人而言,我更喜欢查询字符串方法。

常见的方法是将参数作为查询字符串参数传递。。。但是你可以让它们作为url的一部分

e、 g.图书/搜索/arg1/arg2


就我个人而言,我更喜欢查询字符串方法。

您可以更改URL中的标识符,以允许ID的分隔列表:

GET /books/1+2
这将使您的URL保持整洁,并遵循REST的精神,即URL标识资源。另一个好处是,您可以使用单个绑定来处理URL中任意数量的ID

@GET
@Produces("application/json")
@Path("/books/{ids}")
public Books getBooks(@PathParam("ids") String ids) {

    Books books = new Books();
    for (String id: ids.split("+")) {
        books.add(bookRepository.findById(id))
    }

    return books;
}
此方法可以处理多个场景:

GET /books/1
GET /books/2
GET /books/1+2
GET /books/1+2+3

您可以更改URL中的标识符,以允许ID的分隔列表:

GET /books/1+2
这将使您的URL保持整洁,并遵循REST的精神,即URL标识资源。另一个好处是,您可以使用单个绑定来处理URL中任意数量的ID

@GET
@Produces("application/json")
@Path("/books/{ids}")
public Books getBooks(@PathParam("ids") String ids) {

    Books books = new Books();
    for (String id: ids.split("+")) {
        books.add(bookRepository.findById(id))
    }

    return books;
}
此方法可以处理多个场景:

GET /books/1
GET /books/2
GET /books/1+2
GET /books/1+2+3

我们可以讨论两种查询

  • 由服务器构造的简单查询

    这些查询由服务器构造并传递给URI,因此客户端与它们无关,因为它从不解析URI。(REST客户端遵循链接并使用链接的语义注释,例如链接关系来决定选择哪个链接。-HATEOAS约束)因此,您可以使用任何想要的解决方案,对于如何构建URI没有任何约束。(URI必须标识资源,因此一个URI不能属于多个资源。URI映射到资源而不是操作,因此,如果您希望具有人类可读的URI,则它们可能只包含名词而不包含动词。)

  • 由客户端构造的即席查询

    通过这种查询,您必须使用URI模板并用一些语义注释参数(可能通过使用依赖于应用程序的vocab)。如果超出URI模板的能力,则需要标准查询语言(例如SQL)和查询约束的标准描述格式(目前afaik不可用,但可以是带有RDF语义注释的扩展模板语言)

在你的情况下,不清楚你想要什么。有一点是肯定的,它是由服务器构造的一个简单查询

  • 您所说的是一本由两个参数标识的书。在这种情况下,结果将包含单个项目资源的表示,您可以有如下内容:
    /books/x:1+y:2
    /books/x:1/y:2
    /books?x=1&y=2
    。但是识别一本有两个参数的书对我来说没有意义

  • 如果您想在响应中获得多本书,那么我们讨论的是减少一个集合资源的映射。您可以使用与单个项目资源所述相同的URI:
    /books/x:1+y:2
    /books/x:1/y:2
    /books?x=1&y=2


您可以对如何区分集合和项目有一个约定,例如
/books?x=1&y=2
可以表示缩小集合,而
/books/x:1+y:2
可以表示标识单个项目。但那部分取决于你。Ofc最好对此有一个约定,因为在服务器上编写URI生成和路由逻辑更容易。

我们可以讨论两种查询

  • 由服务器构造的简单查询

    这些查询由服务器构造并传递给URI,因此客户端与它们无关,因为它从不解析URI。(REST客户端遵循链接并使用链接的语义注释,例如链接关系来决定选择哪个链接。-HATEOAS约束)因此,您可以使用任何想要的解决方案,对于如何构建URI没有任何约束。(URI必须标识资源,因此一个URI不能属于多个资源。URI映射到资源而不是操作,因此,如果您希望具有人类可读的URI,则它们可能只包含名词而不包含动词。)

  • 由客户端构造的即席查询

    通过这种查询,您必须使用URI模板并用一些语义注释参数(可能通过使用依赖于应用程序的vocab)。如果超出URI模板的能力,则需要标准查询语言(例如SQL)和查询约束的标准描述格式(目前afaik不可用,但可以是带有RDF语义注释的扩展模板语言)

在你的情况下,不清楚你想要什么。有一点是肯定的,它是由服务器构造的一个简单查询

  • 您所说的是一本由两个参数标识的书。在这种情况下,结果将包含单个项目资源的表示,您可以有如下内容:
    /books/x:1+y:2
    /books/x:1/y:2
    /books?x=1&y=2
    。但是识别一本有两个参数的书对我来说没有意义

  • 如果您想在响应中获得多本书,那么我们讨论的是减少一个集合资源的映射。您可以使用与单个项目资源所述相同的URI:
    /books/x:1+y:2
    /books/x:1/y:2
    /books?x=1&y=2

您可以有一个关于如何区分集合和项的约定,例如