Необходимо экранировать «%» при создании URL-адреса Java - PullRequest
0 голосов
/ 18 сентября 2018

У меня проблемы с созданием рабочего URL, потому что он должен содержать некоторые специальные символы.

String address = "...";
URL url = new URL(address);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();
InputStream input = url.openStream();
....

Проблема в том, что мой адрес должен содержать & в качестве одного из символов в строке,выражается в% 26.Когда я создаю свой адрес как:

String address = "http://foo.com/?animal=monkey&banana=fruit%20%26%20delicious";

..., который изменяется в

"http://foo.com/?animal=monkey&banana=fruit%20%2526%20delicious"

во время процесса URL-to-URI-and-back.

Как лучше всего это исправить?Использую ли я лучшие практики для преобразования URL / URI?Если это так, есть ли способ избежать «%» перед 26, чтобы он оставался% 26 в конце?

MCVE:

import java.util.*;
import java.io.*;
import java.net.*;

public class Test {
    public static void main(String[] args) {
        try {
            String address = "http://foo.com/?animal=monkey&banana=fruit%20%26%20delicious";
            URL url = new URL(address);
            URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
            url = uri.toURL();
            System.out.println("url: " + url);
        } catch (Exception e) {
            System.out.println("Bad!");
        }
    }

}

Терминал ввода-вывода:

$ javac Test.java
$ java Test
url: http://foo.com/?animal=monkey&banana=fruit%2520%2526%2520delicious

Другими словами, как мне заставить его выводить этот URL:

url: http://foo.com/?animal=monkey&banana=fruit%20%26%20delicious

1 Ответ

0 голосов
/ 18 сентября 2018

После копания я не могу использовать этот метод для создания URL.Мне нужно использовать конструктор URI, который принимает только одну строку.

Я использовал этот код для выявления различий и выделения проблемы:

import java.util.*;
import java.io.*;
import java.net.*;

public class Test {
    public static void main(String[] args) {
        ArrayList<String> addresses = new ArrayList<String>();
        addresses.add("http://foo.com/?animal=monkey&banana=fruit%20%26%20delicious");
        addresses.add("http://foo.com/?animal=monkey&banana=fruit %26 delicious");
        addresses.add("http://foo.com/?animal=monkey&banana=fruit & delicious");
        //addresses.add("http://foo.com/?animal=monkey&banana=fruit \%26 delicious"); this uses an illegal escape character

        for (String address : addresses) {
            System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
            try {
                URL url = new URL(address);
                URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
                URL urlA = uri.toURL();
                System.out.println("address: " + address);
                System.out.println("yields: ");
                System.out.println("  * urlA: " + urlA);
                uri = new URI(address);
                URL urlB = uri.toURL();
                System.out.println("  * urlB: " + urlB);
            } catch (Exception e) {
                System.out.println("  Problem!");
            }
        }
    }

}

, которая вызвала этот вывод в терминале:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
address: http://foo.com/?animal=monkey&banana=fruit%20%26%20delicious
yields: 
  * urlA: http://foo.com/?animal=monkey&banana=fruit%2520%2526%2520delicious
  * urlB: http://foo.com/?animal=monkey&banana=fruit%20%26%20delicious
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
address: http://foo.com/?animal=monkey&banana=fruit %26 delicious
yields: 
  * urlA: http://foo.com/?animal=monkey&banana=fruit%20%2526%20delicious
  Problem!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
address: http://foo.com/?animal=monkey&banana=fruit & delicious
yields: 
  * urlA: http://foo.com/?animal=monkey&banana=fruit%20&%20delicious
  Problem!

Результат работы urlB в первом испытании - единственный, который работает.

...