Розбір рядків запитів на Android


271

Java EE має ServletRequest.getParameterValues ​​() .

На не-EE платформах URL.getQuery () просто повертає рядок.

Який нормальний спосіб правильно проаналізувати рядок запиту в URL-адресі, коли немає на Java EE?


< rant >

У відповідях популярно спробувати зробити власний парсер. Це дуже цікавий та захоплюючий проект мікрокодування, але я не можу сказати, що це гарна ідея :(

Фрагменти коду, наведені нижче, як правило, несправні або порушені, btw. Розбити їх - цікава вправа для читача. І хакерам, які атакують веб-сайти, які їх використовують .

Розбір рядків запитів є чітко визначеною проблемою, але читання специфікації та розуміння нюансів нетривіально. Набагато краще дозволити деякому кодеру бібліотеки платформи зробити важку роботу і зробити це для вас!

< / rant >


Чи можете ви опублікувати зразок URL-адреси, що ви отримуєте getQuery(), і що ви хочете отримати як вихід?
Томас Оуенс

1
Ви хочете зробити це із сервлету чи сторінки JSP? Мені потрібно дещо роз’яснення, перш ніж відповісти.
ChadNC

1
Вам також потрібно проаналізувати параметри POST?
Тіло

2
Навіть якщо ви перебуваєте на J2EE (або на SE із вибраними пакетами EE, доданими через OSGi, як я), це питання може мати сенс. У моєму випадку рядки запитів / тіло POST, кодовані URL-адресою, обробляються частиною системи, яка навмисно є агностичною для подібних речей ServletRequest.
Hanno Fietz

61
Оголошено за <rant />!
Nowaker

Відповіді:


65

З моменту Android M справи ускладнилися. Відповідь android.net.URI .getQueryParameter () має помилку, яка розбиває пробіли перед JellyBean. Apache URLEncodedUtils.parse () працювала, але була застаріла в L і видалена в М .

Тож найкраща відповідь зараз - UrlQuerySanitizer . Це існує з першого рівня API та існує. Це також змушує задуматися над складними питаннями, такими як обробка спеціальних символів або повторних значень.

Найпростіший код

UrlQuerySanitizer.ValueSanitizer sanitizer = UrlQuerySanitizer.getAllButNullLegal();
// remember to decide if you want the first or last parameter with the same name
// If you want the first call setPreferFirstRepeatedParameter(true);
sanitizer.parseUrl(url);
String value = sanitizer.getValue("paramName"); // get your value

Якщо ви задоволені поведінкою розбору за замовчуванням, ви можете:

new UrlQuerySanitizer(url).getValue("paramName")

але ви повинні переконатися, що ви розумієте, що таке поведінка для розбору за замовчуванням, оскільки це може бути не тим, що ви хочете.


4
URLQuerySanitizer.getAllButNullLegal () повертає UrlQuerySanitizer.ValueSanitizer, а не UrlQuerySanitizer.
Пітер Чжао

31
Чомусь вищезгадане не працювало для мене, мені довелося його трохи змінити - це полегшує:UrlQuerySanitizer sanitizer = new UrlQuerySanitizer(YourStringURL); String value = sanitizer.getValue("parameter");
SeBsZ

3
Не працює. UrlQuerySanitizer у sdk-23 є лише один методsanitize()
Ninja

Це розшифрує спеціальні символи та смайли для _. Я повинен був піти з stackoverflow.com/a/35638979/1155282
Irshu

Чи є в цьому джерело еквівалентна бібліотека?
iamjoshua

202

На Android:

import android.net.Uri;

[...]

Uri uri=Uri.parse(url_string);
uri.getQueryParameter("para1");

20
зауважте, що для цього використовується клас Uri, а не клас URI (Uri є частиною android.net, а URI - частиною java.net)
Маріус

5
Також зауважте, що перед бутербродом з морозивом це не зможе розібрати + символи у значеннях пробілу.
rpetrich

@rpetrich насправді документи говорять про те, що помилка передує Jelly Bean, включаючи бутерброд з морозивом. ref
Big McLargeHuge

64

9
Це доступно в бібліотеці клієнтів apache http, не тільки на Android. До речі, посилання на apache було змінено. Останнє: hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/…
Крістіан

9
Дратівливо URLEncodedUtils.parse()повертає значення, Listяке вам потім доведеться переглядати, щоб знайти значення для конкретного ключа. Було б набагато приємніше, якби він повернув Mapподібне у відповіді BalusC.
Асаф

1
@Hanno Fietz ти маєш на увазі, що ти довіряєш цим альтернативам? Я знаю, що вони баггі. Я знаю, що вказівки на помилки, які я бачу, лише заохочуватимуть людей приймати «виправлені» версії, а не шукати помилки, які я переглядав.
Буде

1
@Will - ну, я б ніколи не довіряв фрагменти копіювання та вставки, які я отримував з будь-якого веб-сайту, і ніхто не повинен. Але тут ці фрагменти досить добре переглянуті та прокоментовані і, таким чином, areсправді корисні. Просто бачити деякі пропозиції щодо того, що може бути не так з кодом, - це вже чудова допомога в роздумах для себе. І зауважте, я не мав на увазі сказати, що "прокатуйте своє краще", а скоріше, що це чудово мати хороший матеріал для обґрунтованого рішення у своєму коді.
Ханно Фіет

8
Я уявляю, що синтаксичний аналіз повертає список, щоб він підтримував впорядкування позицій і легше дозволяв повторювати записи.
dhaag23

26

Ось відповідь BalusC , але він збирає та повертає результати:

public static Map<String, List<String>> getUrlParameters(String url)
        throws UnsupportedEncodingException {
    Map<String, List<String>> params = new HashMap<String, List<String>>();
    String[] urlParts = url.split("\\?");
    if (urlParts.length > 1) {
        String query = urlParts[1];
        for (String param : query.split("&")) {
            String pair[] = param.split("=");
            String key = URLDecoder.decode(pair[0], "UTF-8");
            String value = "";
            if (pair.length > 1) {
                value = URLDecoder.decode(pair[1], "UTF-8");
            }
            List<String> values = params.get(key);
            if (values == null) {
                values = new ArrayList<String>();
                params.put(key, values);
            }
            values.add(value);
        }
    }
    return params;
}

1
Примітка JVM: Я реалізував еквівалентну форму цього в Scala, використовуючи колекції Java; ось gistub
Джей Тейлор

2
Я пропоную перейти String pair[] = param.split("=");на String pair[] = param.split("=", 2);розділити пару ключів = значення лише під час першого появи. Я вважаю, що дозволено мати некодовані знаки рівності у значенні.
Денні

22

Якщо у вас на класній стежці є пристані (сервер чи клієнт), ви можете використовувати класи утиліти (див. Javadoc ), наприклад:

import org.eclipse.jetty.util.*;
URL url = new URL("www.example.com/index.php?foo=bar&bla=blub");
MultiMap<String> params = new MultiMap<String>();
UrlEncoded.decodeTo(url.getQuery(), params, "UTF-8");

assert params.getString("foo").equals("bar");
assert params.getString("bla").equals("blub");

13

Якщо ви користуєтеся версією 3.1 або пізнішої версії (поступається, сподівався, що підтримка піде далі), ви можете використовувати UriComponentsта UriComponentsBuilder:

UriComponents components = UriComponentsBuilder.fromUri(uri).build();
List<String> myParam = components.getQueryParams().get("myParam");

components.getQueryParams() повертає a MultiValueMap<String, String>

Ось ще трохи документації .


Це те, що я шукаю. Моє запитання - як я отримую ури? Я застряг у підтримці коду, який я не можу багато змінити, і ми не використовуємо HttpServlet. Натомість просто використовуйте примітки та Spring (@Get, @Produces (mediaType) та @Path ("/ dataAsJSON / datafield / {datafield})) Просто потрібно знати, як отримати рядок запиту, щоб я міг розібрати його, як показано на цей приклад.
Nelda.techspiress

5

Для сервлету або сторінки JSP ви можете отримати запит-парами ключ / значення, використовуючи request.getParameter ("параметр")

String name = request.getParameter("name");

Є й інші способи зробити це, але це так, як я це роблю на всіх сервлетах та jsp сторінках, які я створюю.


3
HttpServletRequest є частиною J2EE, якої у нього немає. Також використання getParamter () насправді не аналізує.
Містер Блискучий та Новий 安 宇

3
Будь ласка, знайдіть час, щоб прочитати коментар, в якому я попросив роз'яснити його питання. Ця відповідь відповідає його відповіді на той коментар, в якому він заявив: "Я намагаюся зробити це на Android, але всі відповіді на всіх платформах були б корисними відповідями, які можуть дати вказівники (також для інших, хто може натрапити на це" питання) тому не стримуйтесь! " Я відповів на його запитання, виходячи з цього коментаря. Якщо у вас немає нічого корисного для додання, не додавайте нічого
ChadNC

1
Не варто занадто засмучуватися. "Це не відповідає на питання" корисно додати, ІМО.
Містер Блискучий і Новий 安 宇

1
Не має значення Android чи ні, питання полягає в тому, як проаналізувати рядок, що містить URL, та отримати параметри URL-адреси з неї. Що ви пересилаєте тут, це частина API сервлетів, де контейнер сервлетів аналізує вхідні параметри з HTTP-запиту для вас. Це не має значення, оскільки питання стосується розбору рядка, що містить URL, а не HTTP-запит і не знаходиться в контейнері сервлетів.
mvmn

5

На Android я спробував використовувати відповідь @diyism, але зіткнувся з проблемою з символом пробілу, порушеним @rpetrich, наприклад: я заповнюю форму, де username = "us+us"і password = "pw pw"викликає такий рядок URL:

http://somewhere?username=us%2Bus&password=pw+pw

Тим НЕ менше, @diyism код повертається "us+us"і "pw+pw", тобто він не виявляє символ пропуску. Якщо URL-адреса була переписана з %20символом пробілу:

http://somewhere?username=us%2Bus&password=pw%20pw

Це призводить до наступного виправлення:

Uri uri = Uri.parse(url_string.replace("+", "%20"));
uri.getQueryParameter("para1");

replace(" ", "%20")це неправильно. Але зробив трюк для мене: D
Mārtiņš Briedis

Правильний синтаксис повинен бути "деякий рядок" .replaceAll ("[+]", "% 20");
RRTW

4

Розбір рядка запиту дещо складніше, ніж здається, залежно від того, наскільки ви прощаєтесь.

По-перше, рядок запиту - байти ascii. Ви читаєте в цих байтах по одному і перетворюєте їх у символи. Якщо персонаж є? або & тоді він сигналізує про початок імені параметра. Якщо символ = =, він сигналізує про початок значення параметра. Якщо символ%, то він сигналізує про початок кодованого байта. Ось де це стає хитро.

Коли ви читаєте в% char, ви повинні прочитати наступні два байти та інтерпретувати їх як шістнадцяткові цифри. Це означає, що наступні два байти будуть 0-9, af або AF. Склейте ці дві шістнадцяткові цифри разом, щоб отримати значення байта. Але пам’ятайте, байти - це не символи . Ви повинні знати, яке кодування використовувалося для кодування символів. Символ é не кодує такий самий у UTF-8, як у ISO-8859-1. Взагалі неможливо знати, яке кодування було використано для заданого набору символів. Я завжди використовую UTF-8, оскільки мій веб-сайт налаштований так, щоб завжди обслуговувати все, використовуючи UTF-8, але на практиці ви не можете бути впевнені. Деякі користувацькі агенти скажуть вам кодування символів у запиті; ви можете спробувати прочитати це, якщо у вас є повний HTTP-запит. Якщо у вас просто URL-адреса у відриві, удачі.

У будь-якому випадку, припускаючи, що ви використовуєте UTF-8 або якесь інше багатобайтове кодування символів, тепер, коли ви розшифрували один кодований байт, ви повинні відкласти його до моменту, поки ви не захопите наступний байт. Вам потрібні всі кодовані байти, які є разом, тому що ви не можете правильно дешифрувати url один байт за один раз. Відкладіть всі байти, які є разом, а потім розшифруйте їх усі відразу, щоб відновити ваш персонаж.

Плюс до цього стає веселіше, якщо ви хочете бути поблажливішими і враховувати користувальницькі агенти, які обробляють url Наприклад, деякі клієнти веб-пошти подвійно кодують речі. Або подвоїти знаки? & = (Наприклад http://yoursite.com/blah??p1==v1&&p2==v2:). Якщо ви хочете спробувати витончено впоратися з цим, вам потрібно буде додати більше логіки до свого парсера.


Це не пояснює, як проаналізувати або отримати значення параметрів запиту
рядків

Правильно, але трохи громіздко. Для цього у нас вже є URLDecoder.
BalusC

2
@ChadNC: третє речення розповідає про те, як розбирати: читати в одному байті за один раз і перетворювати на символи. Четверте речення застерігає вас від спеціальних символів. І т.д. Можливо, ви не прочитали відповіді?
Містер Блискучий та Новий 安 宇

@BalusC: URLDecoder працює, але у нього є деякі режими відмов, якщо ви намагаєтесь бути більш поблажливими до того, який тип URL-адреси ви приймаєте.
Містер Блискучий та Новий 安 宇

1
Погодьтеся з параметром запиту розбору @ Mr.ShinyAndNew непросто. Я підтримую FIQL, і це стає справжнім болем у дупі. Наприклад: yoursite.com/blah??p1==v1&&p2==v2,p2==v3;p2==v4
rafa.ferreira

4

На Android просто, як і в коді нижче:

UrlQuerySanitizer sanitzer = new UrlQuerySanitizer(url);
String value = sanitzer.getValue("your_get_parameter");

Також якщо ви не хочете реєструвати використання кожного очікуваного ключа запиту:

sanitzer.setAllowUnregisteredParamaters(true)

Перед тим, як зателефонувати:

sanitzer.parseUrl(yourUrl)

4

У мене є методи для досягнення цього:

1) :

public static String getQueryString(String url, String tag) {
    String[] params = url.split("&");
    Map<String, String> map = new HashMap<String, String>();
    for (String param : params) {
        String name = param.split("=")[0];
        String value = param.split("=")[1];
        map.put(name, value);
    }

    Set<String> keys = map.keySet();
    for (String key : keys) {
        if(key.equals(tag)){
         return map.get(key);
        }
        System.out.println("Name=" + key);
        System.out.println("Value=" + map.get(key));
    }
    return "";
}

2) і найпростіший спосіб зробити це за допомогою класу Uri :

public static String getQueryString(String url, String tag) {
    try {
        Uri uri=Uri.parse(url);
        return uri.getQueryParameter(tag);
    }catch(Exception e){
        Log.e(TAG,"getQueryString() " + e.getMessage());
    }
    return "";
}

і це приклад використання будь-якого з двох методів:

String url = "http://www.jorgesys.com/advertisements/publicidadmobile.htm?position=x46&site=reform&awidth=800&aheight=120";      
String tagValue = getQueryString(url,"awidth");

значення tagValue - 800


3

На Android ви можете використовувати статичний метод Uri.parse класу android.net.Uri для важкого підйому. Якщо ви робите що-небудь з URI та Intents, ви хочете використовувати його будь-коли.


3

Для довідки, це те, що я закінчив (на основі URLEncodedUtils і повернення карти).

Особливості:

  • він приймає частину URL-адреси рядка запиту (ви можете використовувати request.getQueryString())
  • порожній рядок запиту видасть порожній Map
  • параметр без значення (? test) буде відображено у порожнє List<String>

Код:

public static Map<String, List<String>> getParameterMapOfLists(String queryString) {
    Map<String, List<String>> mapOfLists = new HashMap<String, List<String>>();
    if (queryString == null || queryString.length() == 0) {
        return mapOfLists;
    }
    List<NameValuePair> list = URLEncodedUtils.parse(URI.create("http://localhost/?" + queryString), "UTF-8");
    for (NameValuePair pair : list) {
        List<String> values = mapOfLists.get(pair.getName());
        if (values == null) {
            values = new ArrayList<String>();
            mapOfLists.put(pair.getName(), values);
        }
        if (pair.getValue() != null) {
            values.add(pair.getValue());
        }
    }

    return mapOfLists;
}

Помічник сумісності (значення зберігаються в масиві String так само, як у ServletRequest.getParameterMap () ):

public static Map<String, String[]> getParameterMap(String queryString) {
    Map<String, List<String>> mapOfLists = getParameterMapOfLists(queryString);

    Map<String, String[]> mapOfArrays = new HashMap<String, String[]>();
    for (String key : mapOfLists.keySet()) {
        mapOfArrays.put(key, mapOfLists.get(key).toArray(new String[] {}));
    }

    return mapOfArrays;
}

3

Це працює для мене .. Я не впевнений, чому кожен був після карти, списку> Все, що мені потрібно, - це просте значення імені Map.

Щоб зробити все просто, я використав збірку в URI.getQuery ();

public static Map<String, String> getUrlParameters(URI uri)
    throws UnsupportedEncodingException {
    Map<String, String> params = new HashMap<String, String>();
    for (String param : uri.getQuery().split("&")) {
        String pair[] = param.split("=");
        String key = URLDecoder.decode(pair[0], "UTF-8");
        String value = "";
        if (pair.length > 1) {
            value = URLDecoder.decode(pair[1], "UTF-8");
        }
        params.put(new String(key), new String(value));
    }
    return params;
}

1
як щодо форм з множинним вибором? Цілком нормально, щоб ключі повторювались у законних рядках запитів (та телах форми POST). Є інші дефекти та кутові шафи, не охоплені; багато з них були згадані в коментарі щодо інших підходів. Я утримаюся форму , вказуючи їх у страху , що ви виправити це замість того , щоб використовувати бібліотеку якості, відповідно з моєї тиради в питанні;)
Волю

2

Мультимап Гуави краще підходить для цього. Ось коротка чиста версія:

Multimap<String, String> getUrlParameters(String url) {
        try {
            Multimap<String, String> ret = ArrayListMultimap.create();
            for (NameValuePair param : URLEncodedUtils.parse(new URI(url), "UTF-8")) {
                ret.put(param.getName(), param.getValue());
            }
            return ret;
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }

1

Apache AXIS2 має самостійну реалізацію QueryStringParser.java. Якщо ви не використовуєте Axis2, просто завантажте звідси вихідний код і тест -

http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/transport/http/util/QueryStringParser.java

http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/transport/http/util/QueryStringParserTest.java


1

Оригінально відповів тут

На Android є клас Uri в пакеті android.net . Зауважте, що Uri є частиною android.net, а URI - частиною java.net.

Клас Uri має багато функцій для отримання пар запитів ключ-значення. введіть тут опис зображення

Наступна функція повертає пари ключ-значення у вигляді HashMap.

На Java:

Map<String, String> getQueryKeyValueMap(Uri uri){
    HashMap<String, String> keyValueMap = new HashMap();
    String key;
    String value;

    Set<String> keyNamesList = uri.getQueryParameterNames();
    Iterator iterator = keyNamesList.iterator();

    while (iterator.hasNext()){
        key = (String) iterator.next();
        value = uri.getQueryParameter(key);
        keyValueMap.put(key, value);
    }
    return keyValueMap;
}

У Котліні:

fun getQueryKeyValueMap(uri: Uri): HashMap<String, String> {
        val keyValueMap = HashMap<String, String>()
        var key: String
        var value: String

        val keyNamesList = uri.queryParameterNames
        val iterator = keyNamesList.iterator()

        while (iterator.hasNext()) {
            key = iterator.next() as String
            value = uri.getQueryParameter(key) as String
            keyValueMap.put(key, value)
        }
        return keyValueMap
    }

0

Я не думаю, що в JRE є такий. Ви можете знайти подібні функції в інших пакетах, таких як Apache HttpClient. Якщо ви не використовуєте жодних інших пакетів, вам просто потрібно написати свій власний. Це не так складно. Ось що я використовую,

public class QueryString {

 private Map<String, List<String>> parameters;

 public QueryString(String qs) {
  parameters = new TreeMap<String, List<String>>();

  // Parse query string
     String pairs[] = qs.split("&");
     for (String pair : pairs) {
            String name;
            String value;
            int pos = pair.indexOf('=');
            // for "n=", the value is "", for "n", the value is null
         if (pos == -1) {
          name = pair;
          value = null;
         } else {
       try {
        name = URLDecoder.decode(pair.substring(0, pos), "UTF-8");
              value = URLDecoder.decode(pair.substring(pos+1, pair.length()), "UTF-8");            
       } catch (UnsupportedEncodingException e) {
        // Not really possible, throw unchecked
           throw new IllegalStateException("No UTF-8");
       }
         }
         List<String> list = parameters.get(name);
         if (list == null) {
          list = new ArrayList<String>();
          parameters.put(name, list);
         }
         list.add(value);
     }
 }

 public String getParameter(String name) {        
  List<String> values = parameters.get(name);
  if (values == null)
   return null;

  if (values.size() == 0)
   return "";

  return values.get(0);
 }

 public String[] getParameterValues(String name) {        
  List<String> values = parameters.get(name);
  if (values == null)
   return null;

  return (String[])values.toArray(new String[values.size()]);
 }

 public Enumeration<String> getParameterNames() {  
  return Collections.enumeration(parameters.keySet()); 
 }

 public Map<String, String[]> getParameterMap() {
  Map<String, String[]> map = new TreeMap<String, String[]>();
  for (Map.Entry<String, List<String>> entry : parameters.entrySet()) {
   List<String> list = entry.getValue();
   String[] values;
   if (list == null)
    values = null;
   else
    values = (String[]) list.toArray(new String[list.size()]);
   map.put(entry.getKey(), values);
  }
  return map;
 } 
}

Який шлях з класами апаш?
Буде чи

1
Ви можете використовувати метод parse (): hc.apache.org/httpcomponents-client/httpclient/apidocs/org/…
ZZ Coder

3
Будь ласка, поставте посилання apache commons у власну відповідь, щоб я міг її проголосувати.
itadok

0

На основі відповіді BalusC я написав кілька прикладів Java-коду:

    if (queryString != null)
    {
        final String[] arrParameters = queryString.split("&");
        for (final String tempParameterString : arrParameters)
        {
            final String[] arrTempParameter = tempParameterString.split("=");
            if (arrTempParameter.length >= 2)
            {
                final String parameterKey = arrTempParameter[0];
                final String parameterValue = arrTempParameter[1];
                //do something with the parameters
            }
        }
    }

0
public static Map <String, String> parseQueryString (final URL url)
        throws UnsupportedEncodingException
{
    final Map <String, String> qps = new TreeMap <String, String> ();
    final StringTokenizer pairs = new StringTokenizer (url.getQuery (), "&");
    while (pairs.hasMoreTokens ())
    {
        final String pair = pairs.nextToken ();
        final StringTokenizer parts = new StringTokenizer (pair, "=");
        final String name = URLDecoder.decode (parts.nextToken (), "ISO-8859-1");
        final String value = URLDecoder.decode (parts.nextToken (), "ISO-8859-1");
        qps.put (name, value);
    }
    return qps;
}


0

за допомогою Guava:

Multimap<String,String> parseQueryString(String queryString, String encoding) {
    LinkedListMultimap<String, String> result = LinkedListMultimap.create();

    for(String entry : Splitter.on("&").omitEmptyStrings().split(queryString)) {
        String pair [] = entry.split("=", 2);
        try {
            result.put(URLDecoder.decode(pair[0], encoding), pair.length == 2 ? URLDecoder.decode(pair[1], encoding) : null);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    return result;
}

0

Відповідаючи тут, бо це популярна тема. Це чистий розчин у Котліні, який використовує рекомендовані UrlQuerySanitizerapi. Дивіться офіційну документацію . Я додав конструктор струн для об'єднання та відображення парам.

    var myURL: String? = null
    // if the url is sent from a different activity where you set it to a value
    if (intent.hasExtra("my_value")) {
        myURL = intent.extras.getString("my_value")
    } else {
        myURL = intent.dataString
    }

    val sanitizer = UrlQuerySanitizer(myURL)
    // We don't want to manually define every expected query *key*, so we set this to true
    sanitizer.allowUnregisteredParamaters = true
    val parameterNamesToValues: List<UrlQuerySanitizer.ParameterValuePair> = sanitizer.parameterList
    val parameterIterator: Iterator<UrlQuerySanitizer.ParameterValuePair> = parameterNamesToValues.iterator()

    // Helper simply so we can display all values on screen
    val stringBuilder = StringBuilder()

    while (parameterIterator.hasNext()) {
        val parameterValuePair: UrlQuerySanitizer.ParameterValuePair = parameterIterator.next()
        val parameterName: String = parameterValuePair.mParameter
        val parameterValue: String = parameterValuePair.mValue

        // Append string to display all key value pairs
        stringBuilder.append("Key: $parameterName\nValue: $parameterValue\n\n")
    }

    // Set a textView's text to display the string
    val paramListString = stringBuilder.toString()
    val textView: TextView = findViewById(R.id.activity_title) as TextView
    textView.text = "Paramlist is \n\n$paramListString"

    // to check if the url has specific keys
    if (sanitizer.hasParameter("type")) {
        val type = sanitizer.getValue("type")
        println("sanitizer has type param $type")
    }

-2

цей метод приймає uri і повертає карту імені номіналу та номіналу

  public static Map<String, String> getQueryMap(String uri) {

    String queryParms[] = uri.split("\\?");

    Map<String, String> map = new HashMap<>();// 

    if (queryParms == null || queryParms.length == 0) return map;

    String[] params = queryParms[1].split("&");
    for (String param : params) {
        String name = param.split("=")[0];
        String value = param.split("=")[1];
        map.put(name, value);
    }
    return map;
}

1
Відповідно до моєї виклику вище, це може бути банально збито. Не займіться виправленням, просто використовуйте натомість професійну бібліотеку утиліт.
Буде чи

-3

Ви говорите "Java", але "не Java EE". Ви маєте на увазі, що використовуєте JSP та / або сервлети, але не повний стек Java EE? Якщо це так, то вам все одно слід мати доступ до request.getParameter ().

Якщо ви маєте на увазі, що ви пишете Java, але ви не пишете JSP або сервлети, або що ви просто використовуєте Java як опорну точку, але ви перебуваєте на іншій платформі, яка не має вбудованого аналізу параметрів ... , це просто звучить як малоймовірне питання, але якщо так, то принцип буде таким:

xparm=0
word=""
loop
  get next char
  if no char
    exit loop
  if char=='='
    param_name[xparm]=word
    word=""
  else if char=='&'
    param_value[xparm]=word
    word=""
    xparm=xparm+1
  else if char=='%'
    read next two chars
    word=word+interpret the chars as hex digits to make a byte
  else
    word=word+char

(Я можу написати код Java, але це було б безглуздо, тому що якщо у вас є Java, ви можете просто використовувати request.getParameters.)


стежте за кодуванням символів, коли URL-код розшифровує шістнадцяткові цифри.
Містер Блискучий і Новий 安 宇

Це Android, отже, Java, але не J2EE.
Анджей Дойл

Я забув згадати: Вам також потрібно перевірити "+", що має бути переведено у пробіл. Вбудовані пробіли незаконні в рядку запиту.
Jay
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.