Как мне URL Кодировать параметр URL, который сам является URL? - PullRequest
1 голос
/ 24 июля 2011

Быстрый фон -

Я делаю jQuery-вызов ajax в службу, которую я написал, которая возвращает ответ JSON. Служба принимает URL-адрес веб-сайта (например, www.google.com, www.xyz.com/abc123). Формат запроса следующий:

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

... где [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 уже имеет URL-кодировку, и в моем URL-адресе (www.mysite.com/www.google.com) указаны правильные периоды, почему я получаю эту ошибку?

Из Chrome Dev Tools:

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 ]

3 голосов
/ 24 июля 2011

Это совершенно действительный URL:

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

Я подозреваю, что вы просто работаете с Rails format (т.е. .html в конце URL устанавливает формат HTML, .js для JSON, ...) так что вам просто нужно исправить маршрут, чтобы не мешать автоопределению формата:

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

или

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

или любой другой синтаксис маршрутизации, который вы используете.

Если вы не укажете rails, что :url должно соответствовать /.*/ (т.е. что-либо вообще), он попытается интерпретировать периоды в маршрутев качестве спецификаторов формата это не удастся, и Rails выдаст 404, потому что он не может понять, как маршрутизировать URL.

2 голосов
/ 24 июля 2011

Кодировка URL экранирует символы, которые имеют специальное значение в URL (например, / и ?) и / или не являются символами ASCII. http://mysite.com/www.google.com - это абсолютно действительный URL, от которого нечего скрывать Если вы также включите протокол, вы получите несколько символов, достойных побега:

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

Если ваш сервер 404s запросил http://localhost:3000/s/www.google.com, это означает, что URL не обрабатывается сервером. Это не значит, что URL недействителен.

1 голос
/ 24 июля 2011

Как сказал му, точки не нужно кодировать. JQuery-путь для создания правильного QUERY_STRING будет использовать $.param()

$.param({encodeURIComponent:'http://www.google.de'})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...