如何URL编码本身就是URL的URL参数?

时间:2011-07-24 03:24:39

标签: javascript jquery html ruby-on-rails ajax

快速背景 -

我正在对我编写的返回JSON响应的服务进行jQuery ajax调用。该服务接受网站URL(即www.google.com,www.xyz.com / abcc123)。请求的格式如下:

http://www.mysite.com/[url]

...其中[url]是用户提供的网址(再次,类似www.google.com/abc)

我需要对参数进行URL编码,因为mysite.com/www.google.com给了我错误。

我的问题是,所有标准的javascript编码功能实际上并不对URL进行编码。

一个例子:

<html>
<head>
<script>
document.write("encodeURIComponent = " + encodeURIComponent("www.google.com") + "<br />");
document.write("encodeURI = " + encodeURI("www.google.com") + "<br />");
document.write("escape = " + escape("www.google.com"));
</script>
</head>
<body>
</body>

...具有以下输出:

encodeURIComponent = www.google.com
encodeURI = www.google.com
escape = www.google.com

使用JavaScript / jQuery实现此目的的正确方法是什么?

我不认为它是相关的,但为了以防万一,这是一个Rails 3.0.7应用程序。

编辑更详细信息

如果www.google.com已经过网址编码,并且我的网址(www.mysite.com/www.google.com)中的期限没问题,为什么我会收到此错误?

来自Chrome开发工具:

GET http://localhost:3000/s/www.google.com 404 (Not Found)

我的jQuery代码段:

$.getJSON("http://localhost:3000/s/" + encodeURI($("#txtURL").val()), function(data) {
        alert(data.result.url);
    });

3 个答案:

答案 0 :(得分:3)

这是一个完全有效的网址:

http://mysite.com/s/www.google.com

我怀疑你刚刚遇到Rails format的东西(即URL末尾的.html将格式设置为HTML,.js为JSON,... )所以你只需要修改你的路线,以防止格式自动检测妨碍:

map.connect '/s/:url', :requirements => { :url => /.*/ }, ...

match '/s/:url' => 'pancakes#house', :constraints => { :url => /.*/ }, ...

或您正在使用的任何路由语法。

如果你没有告诉rails :url应该匹配/.*/(即任何东西),它将尝试将路由中的句点解释为格式说明符,这将失败并且Rails将404,因为它无法弄清楚如何路由URL。

答案 1 :(得分:2)

URL编码会转义URL中具有特殊含义的字符(如/?)和/或不是ASCII字符。 http://mysite.com/www.google.com是一个完全有效的网址,没有什么可以逃脱的。如果你也包括协议,你会得到一些有逃避价值的角色:

encodeURIComponent('http://www.google.com')
"http%3A%2F%2Fwww.google.com"

如果您的服务器404发出http://localhost:3000/s/www.google.com请求,则表示该服务器未处理该URL。这并不意味着URL无效。

答案 2 :(得分:1)

正如mu所说,不需要对点进行编码。 用于构建正确的QUERY_STRING的jQuery方法是使用$.param()

$.param({encodeURIComponent:'http://www.google.de'})