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