我的REST服务中的参数等

我的REST服务中的参数等,rest,parameters,Rest,Parameters,我正在构建一个REST Web服务,当然已经做了一些研究,但是仍然有一些未回答的问题。我的服务将只为初学者返回JSON 1.我已经决定在GET中使用queryparameters,比如 /api/users/54354/?fields=name,age 用于从id为54354的用户处获取姓名和年龄。 关于采取何种方法似乎有很大的讨论,但这似乎是一种常见的方法。在我的帖子中,我当然使用body作为参数。你对这种方法有什么看法?如果你认为解决方法不同,请争辩 2: 当使用GET(或POST-an

我正在构建一个REST Web服务,当然已经做了一些研究,但是仍然有一些未回答的问题。我的服务将只为初学者返回JSON

1.我已经决定在GET中使用queryparameters,比如

/api/users/54354/?fields=name,age 
用于从id为54354的用户处获取姓名和年龄。 关于采取何种方法似乎有很大的讨论,但这似乎是一种常见的方法。在我的帖子中,我当然使用body作为参数。你对这种方法有什么看法?如果你认为解决方法不同,请争辩

2: 当使用GET(或POST-and-PUT)时,如何使用操作符指定查询,例如
“lastname以'Pe'开头”
“年龄介于10到20之间”
我正在考虑将完整查询放在某种对象中是否有意义。例如

api/users/?filter={'name':{'startsWith':'Pe'},'Age':{'Min':10},'Age':{'Max:'20}}
这种方法可以将JSON语法应用于查询,但我不确定是否还有其他“最佳实践”方法。上述操作需要服务中的解析器/验证器来验证有效的过滤器等

3:最后一件事是如何对其应用和/或操作。 我想它也可以在JSON对象中工作

希望你们中的一些人能在这个问题上给出一些反馈:)

  • 我想知道你是否真的应该检索单独的字段。因为用户代表一种资源,所以您应该获得整个资源,并从客户端的json中提取所需的信息。当您向用户附加了太大而无法按查询传输的资源时,应将其建模为子资源(
    /api/users/54354/subresource

  • 在我看来,在查询中使用JSON语法并不是最佳做法,因为大括号算作不安全的字符,应该进行编码。您可以使用
    /api/users?nameStartsWith=pe&age=10-20
    指定查询。问号应该跟在资源的标识符后面,而不是斜杠。符号AND表示逻辑AND,减号表示范围

  • 这取决于你的问题有多复杂。您可以使用
    =
    后面的值列表,如
    startWithName=pe、foo、bar
    ,在那里启用析取。这甚至适用于
    年龄=10-20,33,40-50的范围。您可以使用AND中提到的
    &
    ,OR中提到的
    +
    +
    通常用作和在API中使用,但也可以…)。当包含括号时,可以嵌套这样的表达式。。。如果你需要的话。但我严重怀疑您是否应该这样做,因为有专门的搜索查询语言用于这种复杂的查询

  • 我想知道你是否真的应该检索单独的字段。因为用户代表一种资源,所以您应该获得整个资源,并从客户端的json中提取所需的信息。当您向用户附加了太大而无法按查询传输的资源时,应将其建模为子资源(
    /api/users/54354/subresource

  • 在我看来,在查询中使用JSON语法并不是最佳做法,因为大括号算作不安全的字符,应该进行编码。您可以使用
    /api/users?nameStartsWith=pe&age=10-20
    指定查询。问号应该跟在资源的标识符后面,而不是斜杠。符号AND表示逻辑AND,减号表示范围

  • 这取决于你的问题有多复杂。您可以使用
    =
    后面的值列表,如
    startWithName=pe、foo、bar
    ,在那里启用析取。这甚至适用于
    年龄=10-20,33,40-50的范围。您可以使用AND中提到的
    &
    ,OR中提到的
    +
    +
    通常用作和在API中使用,但也可以…)。当包含括号时,可以嵌套这样的表达式。。。如果你需要的话。但我严重怀疑您是否应该这样做,因为有专门的搜索查询语言用于这种复杂的查询


  • 谢谢你的回答。这是有道理的,但如果我想要和或不同的字段,比如:startWithName=pe、foo、bar&age=10-20、33、40-50,该怎么办。&在querystring中用于分隔。解决方案是将保留关键字和+定义为或和,例如;它应该是&query=(开始名:pe,foo,bar+age:20-30);性别:男性不仅仅是一个分隔符,它是你的和。您必须考虑布尔表达式(计算结果为true或false的表达式):field=value是一个表达式,(expr+expr)是一个or表达式,(expr&expr)是一个and表达式。使用括号,您可以获得所需的复杂程度,例如
    api/users?(nameStartsWith=pe&age=20)+(haircolor=black,green+bicycle=true)。因此,您不需要任何一个
    ;`或
    。感谢您的澄清。我想我会采用这种方法,只要是3年。部分使用在我无法控制客户端的地方。但我想我需要制作自己的url解析器,因为在php中使用$\u GET会给我类似的东西:[(nameStartsWith]=>pe[age]=>20)(haircolor=black,green bicycle=true)谢谢你的回答。这是有道理的,但如果我想要和或不同的字段,比如:startWithName=pe、foo、bar&age=10-20、33、40-50,该怎么办。&在querystring中用于分隔。解决方案是将保留关键字和+定义为或和,例如;它应该是&query=(开始名:pe,foo,bar+age:20-30);性别:男性不仅仅是一个分隔符,它是你的和。您必须考虑布尔表达式(计算结果为true或false的表达式):field=value是一个表达式,(expr+expr)是一个or表达式,(expr&expr)是一个and表达式。使用括号,您可以获得所需的复杂程度,例如
    api/users?(nameStartsWith=pe&age=20)+(haircolor=black,green+bicycle=true)。因此,您不需要任何一个
    ;`或
    。感谢您的澄清。我想我会采用这种方法,只要是3年。部分使用在我无法控制客户的地方。Bu