6.4 将URI解码为选项
将请求的URI解析成option的步骤如下所述。经过这些步骤后,要么生成包含0个或多个Uri-Host、Uri-Port、Uri-Path和Uri-Query选项的请求,要么会失败。
如果URI不是一个绝对URI([RFC3986]),那么解析失败。
如果被转化成为小写ASCII字符后的URL不含有值为“coap”或者“coaps”的scheme组件,那么解析失败。
如果URL有一个fragment组件,那么解析失败。
如果URL中的host组件不是以ip字符串格式组成的请求端目的ip地址,那么要包含一个Uri-Host选项,并且让选项的值和host组件的值相同,转化为ASCII小写字母,然后将所有百分号编码转化为为对应的字符。
注意:通常来说请求的目的ip地址是从host获取,它保证了Uri-Host选项仅用于host组件,格式为reg-name。
如果URL有port组件,那么将port的值解析成十进制整型,否则,port采用默认值。
如果port的值和请求的目的UDP端口不一致,增加Uri-Port选项并将其值置为port的值。
如果URL中的path组件为空或者只有一个“/”(U+002F),则进行下一步;否则,针对path组件中的每个段,都需要包含一个Uri-Path选项,且将选项的值(将百分号编码转换为对应的字符后)置为这个段的值(不含分隔符)。
如果URL有query组件,那么,针对每个query组件中的参数,都需要包含一个Uri-Query选项,并且让选项的值(将百分号编码转换为对应的字符后)为该参数的值(不包含“?”和“&”)。
注意,这些规则可以完全解析任何百分比编码。
6.5, 将选项编码成URI
将请求选项转化为URI的步骤如下。经过这些步骤后,要么会生成一个URI,要么失败。在这些步骤中,百分号编码一个字符意味着将每个UTF8编码字符转化成由一个“%”开头的、两字节的十六进制数,其中A-F是大写的(如2.1节中采用的[RFC3986]定义,为了减要么少复杂度,CoAP URI中,百分号编码中的十六进制数必须为大写)。unreserved和sub-delims的定义请参考[RFC3986]。
如果请求用DTLS加密,则URL开头用“coaps://”,否则用“coap://”。
如果请求包含了Uri-Host选项,则将URL中的host的值置为该选项的值,所有非ASCII的字符转化成百分号编码。如果host不是一个合法的域名格式或者ip格式,将导致失败。如果请求没有Uri-Host选项,将host的值置为请求的目的ip地址(V4或V6格式)。
添加host到URL。
如果请求中有Uri-Port选项,则将port组件的值置为该选项的值。否则采用请求的目的端UDP端口。
如果port不是该scheme默认的端口号,则采用“:”+port值的方式加载URL后面。
将resource name清空。对请求中的每个Uri-Path选项,采用“/”+选项的值跟随在resource name后面。在此之前,需要先将不在unreserved集、sub-delims集、不为“:”、“@”的字符转化为百分号编码。
如果resource name为空,将它设置为“/”。
对请求中的每个Uri-Query选项,采用“?”(第一个选项)或“&”(后续选项)+选项值的形式编码到resource name中(同样的,在此之前,需要先将不在unreserved集、sub-delims集、不为“:”、“@”、“/”、“?”的字符转化为百分号编码)。
将resource name添加到URL中。
返回URL。
注意:这些步骤旨在以标准形式构建一个URI(参见6.3节)。
最后更新于
这有帮助吗?