Не удается обработать 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");

^ это тоже не работает.

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

5 ответов


попробовать URLEncoder.encode()

Примечание: вы должны кодировать строку, которая после action= не 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


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

рассмотрите возможность использования 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);

вы можете кодировать параметры URL с помощью средств кодирования:

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

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


в post мы не прикрепляем параметры к 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();
    }

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

отсюда

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

этой

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