Come codificare i parametri URL?


123

Sto cercando di passare parametri a un URL simile a questo:

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

E voglio passare i parametri come l'URL di un'immagine che viene generato da sé da un'altra API e il collegamento per l'immagine risulta come:

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

Tuttavia, quando provo a utilizzare l'URL:

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

Non funziona.

Ho anche provato a usare encodeURI()e encodeURIComponent()su imageURL, e anche questo non funziona.


Quale lingua sta generando l'URL? JavaScript?
Phil

2
Nota che non dovresti inserire password negli URL, nemmeno quando usi https, poiché ogni router tra client e server vedrà l'intero URL.
fabb

Risposte:


171

Con PHP

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

Risultato

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

Con 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

Usando il nuovo ES6 Object.entries(), rende divertente un po 'annidato 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

Non dovresti usare encodeURIComponent()o encodeURI(). Dovresti usare fixedEncodeURIComponent()e fixedEncodeURI(), secondo la documentazione MDN.

Per quanto riguarda encodeURI()...

Se si desidera seguire la più recente RFC3986 per gli URL, che rende le parentesi quadre riservate (per IPv6) e quindi non codificate quando si forma qualcosa che potrebbe essere parte di un URL (come un host), il seguente frammento di codice può aiutare:

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

Per quanto riguarda encodeURIComponent()...

Per essere più rigorosi nell'adesione alla RFC 3986 (che riserva!, ', (,) E *), anche se questi caratteri non hanno usi di delimitazione URI formalizzati, si può tranquillamente usare quanto segue:

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

Allora, qual è la differenza? fixedEncodeURI()e fixedEncodeURIComponent()convertire lo stesso insieme di valori, ma fixedEncodeURIComponent()converte anche questo set: +@?=:*#;,$&. Questo set è usato in GETparametri ( &, +, ecc), i tag di ancoraggio ( #), i tag jolly ( *), parti di e-mail / nome utente ( @), ecc ..

Ad esempio: se utilizzi encodeURI(), user@example.com/?email=me@homenon invierà correttamente il secondo @al server, ad eccezione del tuo browser che gestisce la compatibilità (come naturalmente fa spesso Chrome).


Cosa intendi con "except for your browser handling the compatibility"?
Stephan

@Stephan: ad esempio, se site.com?formula=a+b=cfunziona in produzione formula=>a+b=c, viola le specifiche, ma se funziona, è perché Chrome / ecc. può rilevare l'errore nelle specifiche dell'URL, ecc. e così via, w / user@site.com?email=user@site.com.
HoldOffHunger
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.