Rest API:在REST uri中传递window.location.href

时间:2011-01-25 18:33:23

标签: rest uri window.location

由于跨域问题,我有一个通过JSONP使用的rest api,我已经实现了一个错误记录器,可以捕获页面上发生的每个错误并将其发布到服务器 错误记录器的uri类似于:

user/{userId}/message/{errorMessage}/browser/{browser}/browserVer/{browserVer}/secure/{secure}/os/{os}/location/{location}"

位置变量有问题,如何在uri中传递window.location.href?

我已尝试过escape,encodeuri,encodeuricomponent我必须使用base64吗? 谢谢

1 个答案:

答案 0 :(得分:0)

URI的转义序列在RFC2396(统一资源标识符)的section 2.4.1中定义:

An escaped octet is encoded as a character triplet, consisting of the
percent character "%" followed by the two hexadecimal digits
representing the octet code. For example, "%20" is the escaped
encoding for the US-ASCII space character.

   escaped     = "%" hex hex
   hex         = digit | "A" | "B" | "C" | "D" | "E" | "F" |
                         "a" | "b" | "c" | "d" | "e" | "f"

此RFC还为section 3.3中的path组件定义了保留字符:

Within a path segment, the characters "/", ";", "=", and "?" are reserved.

因此,您需要使用encodeURIComponent()因为escape()已经deprecatedencodeURI() does not escape all reserved characters需要根据上面的RFC摘录进行转义。< / p>

下面的示例显示只有encodeURIComponent()正确转义斜杠(这些是最有可能导致您遇到问题的字符):

>>> escape('//');
"//"

>>> encodeURI('//');
"//"

>>> encodeURIComponent('//');
"%2F%2F"

但请注意,如果可能,您应使用POST而不是GET 。这是在REST(通常)中使用的正确方法,因为您要将数据从客户端发送到服务器(POST),而不是从服务器(GET)获取它们。

使用POST还可以避免其他问题。由于URI的长度在常见的Web服务器中受到限制,因此迟早会遇到具有非常长的URI的请求,该URI会被修剪或抛出错误。切换到POST将允许您保持URI清洁并将数据保留在消息正文中而不是URI中。有关URI长度限制的详细信息,请参阅answers to this question