Jquery, Ajax и загадка амперсанда - PullRequest
3 голосов
/ 18 августа 2010

Я знаю, что должен кодировать UUR для любого URL, переданного во что-либо еще, потому что я прочитал это: http://www.digitalbart.com/jquery-and-urlencode/

Я хочу поделиться текущим временем текущего трека, который я слушаю.Так что я установил превосходный укорочитель Yoururls.И у меня есть немного кода, который объединяет все биты и делает следующее: track = 2 & time = 967

Поскольку я не хочу, чтобы все видели мой закрытый ключ, у меня есть небольшой php-файл, который принимаетввод, и добавляет следующее, так это выглядит так: http://myshorten.example/yourls-api.php?signature=x&action=shorturl&format=simple&url=http://urltoshorten?track=2&time=967

Итак, на главной странице я вызываю jquery $("div.shorturl").load(loadall);

Затем он делает немногоCURL, а затем сокращатель возвращает хороший короткий URL.

Примерно так:

$myurl='http://myshorten.example/yourls-api.php?signature=x&action=shorturl&format=simple&url=' . $theurl;
$ch = curl_init($myurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
  echo 'cURL failed';
  exit;
}
echo $data;

Все идеально.

Кроме ... Сокращенный URL всегда находится вформа http://urltoshorten? track = 2 - что-нибудь после сокращения амперсанда.

Я попытался обернуть весь URL в URL-код php, я обернул дорожку = 2 & time = 967и в encodeURI, и в encodeURIComponent я попытался обернуть все это в один или оба.И все же, & ломает его, хотя я вижу, что представленный URL выглядит как track = 1% 26time% 3D5 в конце.

Если я вставлю эту или даже «простую» версию с не кодированным URLлибо в интерфейс yoururls, либо отправьте его через интерфейс API в виде обычного URL-адреса, вставленного в адресную строку браузера, опять же, он работает идеально.

Так что это не ваша ошибка, похоже,URL кодируется должным образом, единственное, что я могу вспомнить, это, возможно, CURL?

Теперь вы можете подумать: «Почему бы не заменить & на * и затем преобразовать его обратно?».Итак, когда URL расширен, я получаю значения из

var track = $.getUrlVar('track');
var time = $.getUrlVar('time');

, поэтому я МОГУ БЫТЬ потерять переменную времени, затем немного найти, где находится *, и затем предположить, что остальныечто-нибудь после * - это время, но это немного уродливо, и, главное, это не совсем правильный способ сделать что-либо.

Если кто-нибудь может мне помочь, это будет оценено.

Ответы [ 2 ]

2 голосов
/ 18 августа 2010

Я попытался обернуть весь URL в URL-код php

Это действительно то, что вам нужно сделать (при условии, что под «URL» вы подразумеваете, что внутренний URL передается как компонентвнешний URL).Каждый раз, когда вы вводите значение в компонент URL, вам необходимо кодировать URL независимо от того, является ли заданное вами значение URL-адресом или нет.

$myurl='http://...?...&url='.rawurlencode($theurl);

(urlencode() подходит для параметров запроса, таких какэто, но rawurlencode() также подходит для частей пути, поэтому, если вам не нужны пробелы, чтобы выглядеть немного красивее [+ против %20], я бы по умолчанию выбрал rawurlencode().)

Это даст вам окончательный URL-адрес, такой как:

http://myshorten.example/yourls-api.php?signature=x&action=shorturl&format=simple&url=http%3A%2F%2Furltoshorten%3Ftrack%3D2%26time%3D967

, который вы сможете проверить работоспособность.Если этого не произойдет, значит что-то не так с yourls-api.php.

1 голос
/ 18 августа 2010

Я попытался обернуть весь URL-адрес в URL-код php, я обернул track = 2 & time = 967 как в encodeURI, так и в encodeURIComponent, я пытался обернуть все это в один или оба.И все же, & ломает его, хотя я вижу, что представленный URL выглядит как track = 1% 26time% 3D5 в конце.

Возможно, объяснение того, как работают переменные HTTP, поможет вам.

Если я получаю страницу со следующими переменными и значениями:

var1 = Bruce Oxford
var2 = Brandy&Wine
var3 = ➋➌➔            (unicode chars)

Мы кодируем URI-имя и значение переменной, то есть:

var1 = Bruce+Oxford
var2 = Brandy%26Wine
var3 = %E2%9E%8B%E2%9E%8C%E2%9E%94

То, что мы не делаем, это кодирование разделителей, поэтому данные запроса будут выглядеть так:

?var1=Bruce+Oxford&var2=Brandy%26Wine&var3=%E2%9E%8B%E2%9E%8C%E2%9E%94

Вместо:

%3Fvar1%3DBruce+Oxford%26var2%3DBrandy%26Wine%26var3%3D%E2%9E%8B%E2%9E%8C%E2%9E%94

Что, конечно, просто бред.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...