ترميز URL لـ Java لمعلمات سلسلة الاستعلام


Answers

لن أستخدم URLEncoder . إلى جانب كونها غير صحيحة ( URLEncoder لا علاقة لها بعناوين URL) ، غير فعالة (تستخدم StringBuffer بدلاً من Builder وتقوم ببضع أشياء أخرى بطيئة).

بدلا من ذلك أود أن استخدام URIBuilder أو URIBuilder أو الربيع في Apache HttpClient . السبب الذي يجعلك تفلت من اسم معلمات الاستعلام (أي ، إجابة BalusC q ) بشكل مختلف عن قيمة المعلمة.

الجانب السلبي الوحيد إلى الأعلى (الذي اكتشفته مؤلمًا) هو أن عنوان URL ليس مجموعة فرعية فعلية من URI .

عينة من الرموز:

import org.apache.http.client.utils.URIBuilder;

URIBuilder ub = new URIBuilder("http://example.com/query");
ub.addParameter("q", "random word £500 bank \$");
String url = ub.toString();

// Result: http://example.com/query?q=random+word+%C2%A3500+bank+%24

وبما أنني أقوم فقط بالربط بأجوبة أخرى ، فقد وضعت علامة على هذا كموقع ويكي. لا تتردد في تحرير.

Question

قل لدي عنوان URL

http://example.com/query?q=

ولدي استعلام أدخله المستخدم مثل:

كلمة عشوائية £ 500 بنك $

أريد أن تكون النتيجة عنوان URL تم ترميزه بشكل صحيح:

http://example.com/query?q=random%20word%20%A3500%20bank%20%24

ما هي أفضل طريقة لتحقيق ذلك؟ لقد حاولت URLEncoder وإنشاء كائنات عنوان URL / عنوان URL ولكن لم يبرز أي منها بشكل صحيح تمامًا.




1. انقسام URL إلى أجزاء هيكلية. استخدم java.net.URL لذلك.

2. ترميز كل جزء هيكلي بشكل صحيح!

3. استخدام IDN.toASCII(putDomainNameHere) إلى Punycode ترميز اسم المضيف!

4. استخدم java.net.URI.toASCIIString() إلى ترميز في المئة ، NFC ترميز يونيكود - (سيكون أفضل NFKC!). لمزيد من المعلومات ، راجع: كيفية ترميز هذا العنوان بشكل صحيح

URL url= new URL("http://example.com/query?q=random word £500 bank $");
URI uri = new URI(url.getProtocol(), url.getUserInfo(), IDN.toASCII(url.getHost()), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String correctEncodedURL=uri.toASCIIString(); 
System.out.println(correctEncodedURL);

مطبوعات

http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$






فيما يلي طريقة يمكنك استخدامها في التعليمات البرمجية الخاصة بك لتحويل سلسلة url وخريطة المعلمات إلى سلسلة عنوان url مشفرة صالحة تحتوي على معلمات الاستعلام.

String addQueryStringToUrlString(String url, final Map<Object, Object> parameters) throws UnsupportedEncodingException {
    if (parameters == null) {
        return url;
    }

    for (Map.Entry<Object, Object> parameter : parameters.entrySet()) {

        final String encodedKey = URLEncoder.encode(parameter.getKey().toString(), "UTF-8");
        final String encodedValue = URLEncoder.encode(parameter.getValue().toString(), "UTF-8");

        if (!url.contains("?")) {
            url += "?" + encodedKey + "=" + encodedValue;
        } else {
            url += "&" + encodedKey + "=" + encodedValue;
        }
    }

    return url;
}