URL parametreleri nasıl kodlanır?


123

Parametreleri şuna benzeyen bir URL'ye aktarmaya çalışıyorum:

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

Ve kendisi başka bir API tarafından oluşturulan bir resim URL'si gibi parametreleri geçirmek istiyorum ve resmin bağlantısı şu şekilde çıkıyor:

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

Ancak, URL'yi kullanmaya çalıştığımda:

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

Çalışmıyor.

Ben de kullanarak denedi encodeURI()ve encodeURIComponent()ImageUrl üzerinde ve çok çalışma değil bu.


URL'yi hangi dil oluşturuyor? JavaScript?
Phil

2
İstemci ve sunucu arasındaki her yönlendirici url'nin tamamını göreceğinden, https kullanırken bile URL'lere şifre koymamanız gerektiğini unutmayın.
fabb

Yanıtlar:


171

PHP ile

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

Sonuç

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

Javascript ile:

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

Yeni ES6 kullanarak Object.entries(), eğlenceli bir iç içe geçmiş 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

Sen kullanarak olmamalıdır encodeURIComponent()ya encodeURI(). MDN Belgelerine göre fixedEncodeURIComponent()ve kullanmalısınız fixedEncodeURI().

İle ilgili olarak encodeURI()...

Köşeli parantezleri ayrılmış kılan (IPv6 için) ve dolayısıyla bir URL'nin parçası olabilecek bir şey oluştururken (örneğin bir ana bilgisayar) kodlanmamış olan URL'ler için daha yeni RFC3986'yı izlemek isterseniz, aşağıdaki kod parçacığı yardımcı olabilir:

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

İle ilgili olarak encodeURIComponent()...

RFC 3986'ya (!, ', (,) Ve * ayıran) daha katı olmak için, bu karakterlerin resmileştirilmiş URI sınırlandırma kullanımı olmamasına rağmen, aşağıdakiler güvenle kullanılabilir:

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

Öyleyse, fark nedir? fixedEncodeURI()ve fixedEncodeURIComponent()değerlerinin aynı kümesine dönüştürmek, ancak fixedEncodeURIComponent()aynı zamanda bu seti dönüştürür: +@?=:*#;,$&. Bu set GETparametrelerde ( &, +vb.), Bağlantı etiketlerinde ( #), joker karakter etiketlerinde ( *), e-posta / kullanıcı adı bölümlerinde ( @) vb. Kullanılır.

Örneğin - kullanıyorsanız encodeURI(), tarayıcınızın uyumluluğu işlemesi dışında (Chrome'un doğal olarak sıklıkla yaptığı gibi) user@example.com/?email=me@homeikincisini @sunucuya düzgün bir şekilde göndermez .


Ne demek istiyorsun "except for your browser handling the compatibility"?
Stephan

@Stephan: Örneğin, üretimde site.com?formula=a+b=cçalışıyorsa formula=>a+b=c, bu şartnameyi ihlal ediyor, ancak işe yarıyorsa , bunun nedeni Chrome / vb. URL, vb .'nin özellik hatasını tespit edebilir ve benzeri, w / user@site.com?email=user@site.com.
HoldOffHunger
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.