Не удается обработать URL-адрес с вертикальной/трубкой в ​​Java/Apache HttpClient

Если я хочу обработать этот URL, например:

post = new HttpPost("http://testurl.com/lists/lprocess?action=LoadList|401814|1");

Java/Apache не позволит мне, потому что говорит, что вертикальная полоса ( "|" ) является незаконной.

экранирование его двойными косыми чертами также не работает:

post = new HttpPost("http://testurl.com/lists/lprocess?action=LoadList\\|401814\\|1");

^, что тоже не работает.

Любые предложения, как сделать эту работу?

Ответ 1

попробуйте URLEncoder.encode()

Примечание: вы должны закодировать строку, которая после action= not complete URL

post = new HttpPost("http://testurl.com/lists/lprocess?action="+URLEncoder.encode("LoadList|401814|1","UTF-8"));

Refernce http://docs.oracle.com/javase/7/docs/api/java/net/URLEncoder.html

Ответ 2

Вы должны кодировать | в URL как %7C.

Рассмотрим использование HttpClient URIBuilder, который позаботится об экранировании для вас, например:

final URIBuilder builder = new URIBuilder();
builder.setScheme("http")
    .setHost("testurl.com")
    .setPath("/lists/lprocess")
    .addParameter("action", "LoadList|401814|1");
final URI uri = builder.build();
final HttpPost post = new HttpPost(uri);

Ответ 3

Вы можете кодировать параметры URL, используя URLEncoder:

post = new HttpPost("http://testurl.com/lists/lprocess?action=" + URLEncoder.encode("LoadList|401814|1", "UTF-8"));

Это будет кодировать для вас все специальные символы, а не только канал.

Ответ 4

В сообщении мы не прикрепляем параметры к URL. Код ниже добавляет и urlEncodes ваш параметр. Это взято из: http://hc.apache.org/httpcomponents-client-ga/quickstart.html

    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost("http://testurl.com/lists/lprocess");

    List <NameValuePair> nvps = new ArrayList <NameValuePair>();
    nvps.add(new BasicNameValuePair("action", "LoadList|401814|1"));
    httpPost.setEntity(new UrlEncodedFormEntity(nvps));
    HttpResponse response2 = httpclient.execute(httpPost);

    try {
        System.out.println(response2.getStatusLine());
        HttpEntity entity2 = response2.getEntity();
        // do something useful with the response body
        // and ensure it is fully consumed

        String response = new Scanner(entity2.getContent()).useDelimiter("\\A").next();
        System.out.println(response);


        EntityUtils.consume(entity2);
    } finally {
        httpPost.releaseConnection();
    }

Ответ 5

У меня была такая же проблема, и я решил ее заменить | для закодированного значения it = > % 7C и ir работает

Из этого

post = new HttpPost("http://testurl.com/lists/lprocess?action=LoadList|401814|1");

Для этого

post = new HttpPost("http://testurl.com/lists/lprocess?action=LoadList\\%7C401814\\%7C1");