Як кодувати параметри URL-адреси?


123

Я намагаюся передати параметри до URL-адреси, яка виглядає приблизно так:

http://www.foobar.com/foo?imageurl=

І я хочу передати такі параметри, як URL-адреса зображення, яка генерується самим іншим API, і посилання на зображення виходить таким:

http://www.image.com/?username=unknown&password=unknown

Однак, коли я намагаюся використовувати URL:

http://www.foobar.com/foo?imageurl=http://www.image.com/?username=unknown&password=unknown

Це не працює.

Я також спробував використовувати encodeURI()і encodeURIComponent()на imageURL, і це теж не працює.


Яка мова генерує URL? JavaScript?
Філ

2
Зауважте, що не слід вводити паролі в URL-адреси, навіть не використовуючи https, оскільки кожен маршрутизатор між клієнтом і сервером бачить всю URL-адресу.
fabb

Відповіді:


171

З PHP

echo urlencode("http://www.image.com/?username=unknown&password=unknown");

Результат

http%3A%2F%2Fwww.image.com%2F%3Fusername%3Dunknown%26password%3Dunknown

За допомогою Javascript:

var myUrl = "http://www.image.com/?username=unknown&password=unknown";
var encodedURL= "http://www.foobar.com/foo?imageurl=" + encodeURIComponent(myUrl);

DEMO: http://jsfiddle.net/Lpv53/


37

Використовуючи новий ES6 Object.entries(), він дає можливість весело вкластись map/ join:

const encodeGetParams = p => 
  Object.entries(p).map(kv => kv.map(encodeURIComponent).join("=")).join("&");

const params = {
  user: "María Rodríguez",
  awesome: true,
  awesomeness: 64,
  "ZOMG+&=*(": "*^%*GMOZ"
};

console.log("https://example.com/endpoint?" + encodeGetParams(params))


1

Ви не повинні використовувати encodeURIComponent()або encodeURI(). Ви повинні використовувати fixedEncodeURIComponent()і fixedEncodeURI(), згідно з документацією MDN.

Щодо encodeURI()...

Якщо ви хочете слідкувати за останніми RFC3986 для URL-адрес, що робить квадратні дужки зарезервованими (для IPv6) і, таким чином, не кодується, формуючи щось, що може бути частиною URL-адреси (наприклад, хост), може допомогти наступний фрагмент коду:

function fixedEncodeURI(str) { return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']'); }

Щодо encodeURIComponent()...

Щоб бути більш суворим у дотриманні RFC 3986 (який резервує!, ', (,) І *), хоча ці символи не мають формалізованого використання URI, що обмежує використання, можна безпечно використовувати наступне:

function fixedEncodeURIComponent(str) { return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { return '%' + c.charCodeAt(0).toString(16); }); }

Отже, у чому різниця? fixedEncodeURI()і fixedEncodeURIComponent()перетворити той же набір значень, але fixedEncodeURIComponent()і перетворює цей набір: +@?=:*#;,$&. Цей набір використовується в GETпараметрах ( &, +тощо), тегах прив’язки ( #), тегах підстановки ( *), частинах електронної пошти / імені користувача ( @) та ін.

Наприклад - якщо ви користуєтесь encodeURI(), user@example.com/?email=me@homeне буде належним чином надсилати другий @на сервер, за винятком того, що ваш браузер обробляє сумісність (як це звичайно робить Chrome).


Що ви маєте на увазі під "except for your browser handling the compatibility"?
Стефан

@Stephan: Наприклад, якщо site.com?formula=a+b=cпрацює на виробництві formula=>a+b=c, це порушує специфікацію, але якщо вона працює, це тому, що Chrome / тощо. може виявити специфічний збій URL-адреси тощо тощо, w / user@site.com?email=user@site.com.
HoldOffHunger
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.