URLEncodedUtils не анализирует все параметры, полученные из данного URL - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть URL-адрес, и я хотел бы проанализировать и извлечь из него параметры.Моя реализация основана на следующем стеке потока post

Однако мой URL более сложный, чем тот, который использовался в посте выше.Это выглядит следующим образом:

https://example.com/cdscontent/login?initialURI=https%3A%2F%2Fexample.com%2Fdashboard%2F%3Fportal%3Dmyportal%26LO%3D4%26contentid%3D10007.786471%26viewmode%3Dcontent%26variant%3D%2Fmyportal%2F

Как вы можете видеть, он имеет параметр initialURI, который является (закодированным) URL-адресом, и порядок параметров в нем не может быть изменен.

Когда я запускаю org.apache.http.client.utils.URLEncodedUtils#parse, он возвращает

[initialURI=https://example.com/dashboard/?portal=myportal, LO=4, contentid=10007.786471, viewmode=content, variant=/myportal/]

, как вы можете видеть, он анализирует каждый параметр, кроме portal.Он все еще связан с https://example.com/dashboard/ Другими словами, я ожидаю этого:

[initialURI=https://example.com/dashboard/, portal=myportal, LO=4, contentid=10007.786471, viewmode=content, variant=/myportal/]

Я что-то здесь не так делаю или вы думаете, что URLEncodedUtils # parse не может обработать этот случай?

У вас есть альтернатива, чтобы предложить?

Большое спасибо!

Модульный тест, чтобы попробовать

public class UrlParserTest {

  @Test
  public void testParseUrl() throws UnsupportedEncodingException, URISyntaxException {

    String url =
        "https://www.example.com/cdscontent/login?initialURI=https%3A%2F%2Fwww.example.com%2Fdashboard%2F%3Fportal%3Dmyportal%26LO%3D4%26contentid%3D10007.786471%26viewmode%3Dcontent%26variant%3D%2Fmyportal%2F";

    String decoded = URLDecoder.decode(url, "UTF-8");
    List<NameValuePair> params = URLEncodedUtils.parse(new URI(decoded), "UTF-8");
    System.out.println(params);
  }

}

1 Ответ

0 голосов
/ 19 декабря 2018

С чем мы работаем

У вас есть следующий URL (декодированный):

https://www.example.com/cdscontent/login?initialURI=https://www.example.com/dashboard/?portal=myportal&LO=4&contentid=10007.786471&viewmode=content&variant=/myportal/

Этот URL состоит из основного URL:

https://www.example.com/cdscontent/login

, которыйимеет 1 параметр запроса initialURI:

https://www.example.com/dashboard/?portal=myportal&LO=4&contentid=10007.786471&viewmode=content&variant=/myportal/

Этот URL имеет несколько параметров запроса (те, которые вы ищете):

portal=myportal&LO=4&contentid=10007.786471&viewmode=content&variant=/myportal/

Решение

Шаг 1:

Сначала мы должны получить URL в параметре запроса initialURI:

 List<NameValuePair> params = URLEncodedUtils.parse(new URI(url), Charset.forName("UTF-8"));

// Find first NameValuePair where the name equals initialURI
Optional<NameValuePair> initialURI = params.stream()
        .filter(e -> e.getName().equals("initialURI"))
        .findFirst();

System.out.println(initialURI);

Это печатает:

Optional[initialURI=https://www.example.com/dashboard/?portal=myportal&LO=4&contentid=10007.786471&viewmode=content&variant=/myportal/]

Шаг 2:

Теперь мы можем получить параметры запроса этого URL и распечатать их:

List<NameValuePair> initialParams = URLEncodedUtils
        .parse(new URI(initialURI.get().getValue()), Charset.forName("UTF-8"));

System.out.println(initialParams);

В результате:

[portal=myportal, LO=4, contentid=10007.786471, viewmode=content, variant=/myportal/]

Примечание

Это не совсем ваше ожидаемое поведение, вы ожидали, что initialURI=https://example.com/dashboard/ также будет в списке.Однако вы можете видеть, что это , а не параметр запроса, весь URL в initialURI (с его параметрами запроса) является параметром запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...