相关疑难解决方法(0)

带请求正文的HTTP GET

我正在为我们的应用程序开发一个新的RESTful Web服务.

在某些实体上执行GET时,客户端可以请求实体的内容.如果他们想要添加一些参数(例如排序列表),他们可以在查询字符串中添加这些参数.

或者,我希望人们能够在请求正文中指定这些参数. HTTP/1.1似乎没有明确禁止这一点.这将允许他们指定更多信息,可以更容易指定复杂的XML请求.

我的问题:

  • 这完全是一个好主意吗?
  • HTTP客户端在GET请求中使用请求主体会有问题吗?

http://tools.ietf.org/html/rfc2616

rest http http-get

1896
推荐指数
19
解决办法
98万
查看次数

用于搜索的RESTful URL设计

我正在寻找一种合理的方式将搜索表示为RESTful URL.

设置:我有两个模型,汽车和车库,汽车可以在车库.所以我的网址看起来像:

/car/xxxx
  xxx == car id
  returns car with given id

/garage/yyy
  yyy = garage id
  returns garage with given id
Run Code Online (Sandbox Code Playgroud)

汽车可以独立存在(因此/汽车),也可以存在于车库中.例如,在给定车库中代表所有车辆的正确方法是什么?就像是:

/garage/yyy/cars     ?
Run Code Online (Sandbox Code Playgroud)

车库yyy和zzz中的汽车联盟怎么样?

什么是代表搜索具有某些属性的汽车的正确方法?说:给我看看所有带4扇门的蓝色轿车:

/car/search?color=blue&type=sedan&doors=4
Run Code Online (Sandbox Code Playgroud)

或者它应该是/汽车而不是?

使用"搜索"似乎不合适 - 什么是更好的方式/术语?应该只是:

/cars/?color=blue&type=sedan&doors=4
Run Code Online (Sandbox Code Playgroud)

搜索参数应该是PATHINFO还是QUERYSTRING的一部分?

简而言之,我正在寻找跨模型REST网址设计和搜索的指导.

[更新]我喜欢贾斯汀的答案,但他没有涉及多字段搜索案例:

/cars/color:blue/type:sedan/doors:4
Run Code Online (Sandbox Code Playgroud)

或类似的东西.我们怎么样

/cars/color/blue
Run Code Online (Sandbox Code Playgroud)

到多场案件?

rest

413
推荐指数
7
解决办法
18万
查看次数

GET或POST比另一个更安全吗?

将HTTP GET与HTTP POST进行比较时,从安全角度来看有何不同?其中一个选择本身比另一个更安全吗?如果是这样,为什么?

我意识到POST不会暴露关于URL的信息,但是它是否有任何实际价值,还是仅通过默默无闻的安全性?当担心安全问题时,我是否应该更喜欢POST?

编辑:
通过HTTPS,POST数据被编码,但是第三方可以嗅探URL吗?另外,我正在处理JSP; 在使用JSP或类似框架时,最好的做法是避免将敏感数据放在POST或GET中并使用服务器端代码处理敏感信息吗?

html security http

281
推荐指数
11
解决办法
15万
查看次数

可以在URL中使用哪些字符?

我有一个应用程序,它接受URL中的所有参数,如下所示:/category/subcategory/sub-subcategory.我希望能够在URL的末尾提供额外的参数,比如page-2/order-desc.这将使整个URL成为cat/subcat/sub-subcat{delimiting-character}page-2/order-desc.

我的问题是:我可以使用哪些角色{delimiting-character}.我倾向于选择":",因为我知道它肯定不会出现在任何其他地方,但我不知道它是否符合标准,或者至少它是否会在将来给我带来问题.

我记得vimeo使用过这样的东西:vimeo.com/video:{code}但它们似乎改变了这一点.

url rfc

13
推荐指数
2
解决办法
3万
查看次数

REST搜索界面和GET的幂等性

为了坚持REST概念,例如安全操作,幂等性等,如何实现涉及多个参数的复杂搜索操作?

我看过谷歌的实施,这很有创意.什么是期权,除此之外?

幂等要求就是绊倒我,因为操作肯定不会为相同的标准返回相同的结果,比如搜索名为"Smith"的客户每次都不会返回相同的结果,因为添加了更多的"Smith"客户每时每刻.我的直觉是使用GET,但对于真正的搜索功能,结果似乎不是幂等的,并且由于其流畅的结果集需要被标记为不可缓存.

rest web-services

10
推荐指数
2
解决办法
2961
查看次数

Restful API命名约定

所以我和我的老板不同意这里,也找不到任何相关信息.场景:我想获得某个组织的所有用户.URL应该是什么?

mydomain.com/users/by/organisation/{orgId}

要么

mydomain.com/organisation/{orgId}/users

我们的论点:

情况1:呼叫预期返回"用户",因此"资源"(呼叫的第一部分)应该与之相关.

案例2:组织"拥有"/"是用户的父母,因此组织应该是第一位的.

你的想法是什么?

更新: 我不担心之后会发生什么mydomain.com/{resource}.问题主要涉及HTTP操作(GET,POST,PUT,DELETE)是否应与第一个资源相关mydomain.com/users或是否应该反映该关系mydomain.com/organisations/users/.

rest naming-conventions restful-architecture

10
推荐指数
3
解决办法
3万
查看次数

具有对象列表的OpenAPI查询字符串参数

我正在尝试使用OpenAPI记录看起来像的查询字符串

filtered[0][id]=code&filtered[0][value]=12345
Run Code Online (Sandbox Code Playgroud)

并包含具有属性id和的对象列表value

我的yaml文档如下所示

parameters:
    - name: filtered
      in: query
      description: filters to be applied
      explode: true
      style: deepObject
      schema:
        type: array
        items:
          properties:
            id:
              description: name of the field to be filtered
              type: string
            value:
              description: value of the filter
          type: object
Run Code Online (Sandbox Code Playgroud)

问题如下:看起来该style: deepObject选项仅适用于一个级别,而不适用于我的对象实际所在的第二个级别。也就是说,它需要一个查询字符串,例如

?sorted[0]=%7B%0A%20%20%22id%22%3A%20%22string%22%2C%0A%20%20%22value%22%3A%20true%0A%7D
Run Code Online (Sandbox Code Playgroud)

该对象未使用idvalue键序列化为数组。

有办法解决吗?

json jsonschema swagger openapi

6
推荐指数
1
解决办法
1504
查看次数

在通过API端点搜索时不使用POST的原因?

我认为RESTful搜索的标准方法是这样的:

GET /users?parameter1=value1&parameter2=value2&parameter3=value3&parameter4=value4
Run Code Online (Sandbox Code Playgroud)

但我想做这样的事情:

GET /users
# Request body:
{
    "parameter1": "value1",
    "parameter2": "value2",
    "parameter3": "value3",
    "parameter4": "value4"
}
Run Code Online (Sandbox Code Playgroud)

更新:我不能以上述方式使用GET,因为有些设备不尊重GET请求的正文内容.所以我不得不使用POST.

RESTful宗教信仰是我不应该使用POST将JSON数据发送到/api/search端点的唯一原因,而不是使用URI吗?

以这种方式使用POST是否有任何技术上和可证明的危险?

我知道这与以下内容类似:

如何设计RESTful搜索/过滤?

但我要问更具体的事情:即,除了"它不符合惯例"之外,这是一个坏方法的原因是什么.

asp.net rest json asp.net-web-api

3
推荐指数
1
解决办法
634
查看次数

如何设计RESTful高级搜索/过滤器

首先,我已经阅读了用于搜索的RESTful URL设计以及如何设计RESTful搜索/过滤?的问题.我正在尝试设计更高级的选项,以简单和RESTful方式进行搜索.这些问题的答案给了我一些见解和线索,告诉我如何为搜索/过滤功能设计我以前的应用程序网址模式.

首先,我使用模式为基本过滤选项提出了非常好的简单解决方案:

Equality search: key = val

IN search: key = val1 & key = val2
Run Code Online (Sandbox Code Playgroud)

但随着应用程序的增长,搜索要求也在增长.我最终得到了一些相当不愉快和复杂的网址模式,用于高级搜索选项,其中包括:

Negation search: key-N = val

Like search: key-L = val

OR search: key1-O = val1 & key2 = val2

Range search: key1-RS = val1 & key1-RE = val2
Run Code Online (Sandbox Code Playgroud)

更重要的是,除了过滤器,查询必须获取有关分页和顺序的信息,因此过滤器参数具有F-后缀,按字段排序具有O-后缀,并且分页具有P-后缀.

我希望在这一点上我不必补充说解析这样的请求是相当恶意的任务,如果密钥包含' - '则可能存在歧义.我创建了一些正则表达式来解析它,它现在运行得很好,但......

现在我开始编写一个新的Web应用程序,我有机会从头开始重新设计这个部分.

我想知道在包含所有信息的浏览器中以结构化和不言自明的方式创建对象,并将其作为JSON字符串发送到服务器,如:

filter = {{'type':'like','field':key,'value':val1,'operator':'and','negation':false},..}
Run Code Online (Sandbox Code Playgroud)

但我感到奇怪的是,这不是一个好主意 - 我真的不知道为什么.

所以,这将是我的上下文的定义.现在的问题是:

我正在寻找更简单,更安全的模式来实现高级搜索,包括我上面提到的RESTful GET参数选项 - 你能分享一些想法吗?或者也许是一些关于不以RESTful方式执行此操作的见解?此外,如果你看到JSON方式的一些陷阱,请分享它们.

编辑:

我知道是什么让json成为get参数,不是那么好主意.对它进行编码 - 它使它难看且难以阅读.

由thierry templier发出的链接提供的信息给了我一些思考的东西,我设法在GET参数中设计了更多的有条理和安全的过滤器处理.下面是语法的定义.

对于过滤器 - 多个F参数(每个搜索标准一个):

F = OPERATOR:NEGATION:TYPE:FIELD:VAL[:VAL1,:VAL2...]
Run Code Online (Sandbox Code Playgroud)

允许值: …

api rest search filter

3
推荐指数
1
解决办法
3135
查看次数

HTTP GET请求,查询字符串中包含许多项

我们使用查询字符串中包含大量数据的HTTP GET请求来表示要检索的集合的所有ID。

关于网址中查询字符串长度的限制,谷歌快速搜索显示:

RFC 3986也声明没有限制,但是由于DNS限制,主机名限制为255个字符(第2.3.3节)。Microsoft说,Internet Explorer中URL的最大长度为2,083个字符,URL的路径部分最多不超过2,048个字符。2009年5月1日

如果我们不使用IE,我是否应该担心可能超出查询字符串长度的限制?我确定我已经在Node.js Express服务器上看到了超出的限制,特别是当我在GET请求的查询字符串中包含表示图像的base64字符串时。

解决这个问题的好方法是什么?我们应该只使用HTTP POST请求吗?当然,我们不想为了避免此问题而将1个GET请求分解为1000个。

url get http query-string web

1
推荐指数
1
解决办法
1955
查看次数