微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RESTful API,其中URI模板中有#个片段扩展RFC 6570

如何解决RESTful API,其中URI模板中有#个片段扩展RFC 6570

我有另一家公司的新项目的RESTful API规范,它引用RFC6570并在向其API请求时在URI模板中使用片段扩展{#var}

URI模板如下:

PUT https://api.acme.com/order{#Meta*}{?order_number}GET https://api.acme.com/orders{#Meta*}(请注意订单之间的差异)。

他们提到“如果存储在系统中的元数据看起来像这样:”

{
  "Meta": {
    "customer": "1234","state": "open"
  },"order_number": "0003"
}

然后将其转换为PUT https://api.acme.com/order#customer=1234,state=open?order_number=0003GET https://api.acme.com/orders#customer=1234,state=open之类的请求。

URL片段,例如#customer=1234,state=open是否打算用作请求的某种元数据过滤或上下文?

邮递员,curl和浏览器请求似乎删除#之后的所有内容,然后发送到服务器。这是预期的行为,并且在RFC中有描述吗?这是否意味着这些RESTful URL无效?

URL模板中{#var}片段扩展的正确用例是什么?

解决方法

邮递员,curl和浏览器请求似乎删除了#号之后的所有内容,然后发送到服务器。这是预期的行为,并且在RFC中有描述吗?

是的,它在RFC 3896

中有描述

在URI的特定于方案的处理中不使用片段标识符;取而代之的是,在取消引用之前,将片段标识符与URI的其余部分分开,因此,片段本身中的标识信息仅由用户代理取消引用,而与URI方案无关。

与RFC 7230所述的想法相同


这是否意味着这些RESTful URL无效?

排序。

https://api.acme.com/orders#customer=1234,state=open

那是一个完全有效的URL(请参见RFC 3986 appendix A中的生产规则)。

让我们回顾一下fragments的规范:

URI的片段标识符组件允许通过引用主资源和其他标识信息来间接标识辅助资源。标识的辅助资源可以是主要资源的一部分或子集,可以是主要资源表示形式的某些视图,也可以是那些表示形式定义或描述的其他资源。

HTTP definition更加清晰:

可选的片段组件允许间接标识辅助资源

因此,为了便于练习,让我们看一下片段规范本身的标识符

https://tools.ietf.org/html/rfc3986#section-3.5

这里我们有两个资源的标识符:“主要资源”是网页本身,它由片段定界符-https://tools.ietf.org/html/rfc3986之前的字符序列标识;那么我们在二级资源之内内,一级资源section-3.5告诉我们在一级资源中寻找什么。因此,浏览器知道(a)下载主要资源,然后(b)发现主要资源具有text/html表示形式之后,便知道如何挖掘html标签以找到与片段匹配的标签。然后,浏览器可以直接跳转到文档中的正确位置。

在您的示例中,https://api.acme.com/orders是主要资源,customer=1234,state=open是用于在主要资源表示中标识某些资源的片段。

但是

RFC 7230定义了HTTP的request line

method SP request-target SP HTTP-version CRLF

request-target依次定义为

     request-target = origin-form
                    / absolute-form
                    / authority-form
                    / asterisk-form

我们感兴趣的两个是origin-formabsolute-form。两者均由RFC 7230定义

origin-form    = absolute-path [ "?" query ]
absolute-form  = absolute-URI

其中absolute-URI在RFC 3986中定义

某些协议元素仅允许使用绝对形式的URI,而没有片段标识符。

absolute-URI  = scheme ":" hier-part [ "?" query ]

这完全符合对target-uri的限制

目标URI排除了引用的片段组件(如果有的话),因为片段标识符是保留给客户端处理的


URL模板中{#var}片段扩展的正确用例是什么?

试图构造到辅助资源的链接,特别是作为两个代码段的协作;一段代码知道模板变量的值,但不知道它们应该去哪里(特别是片段中属于哪些变量),另一段代码则知道每个不同的变量在URI中的位置出现,但不知道这些值是什么。

换句话说,这与我们创建URI模板以允许生成主要资源的标识符,但也允许在fragment元素中进行变量扩展时所执行的操作完全相同。

http://example.org/people/bob
http://example.org/people#bob

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。