10

Jeśli chcę przetworzyć ten adres URL, na przykład:Nie można proces url z pionowym/bar rury w Java/Apache HttpClient

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

Java/Apache nie pozwoli mnie, bo mówi, że pionowy pasek (” | ") jest nielegalne.

niej ucieczki podwójne ukośniki nie działa tak dobrze:

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

^że nie działa dobrze.

Wszelkie sugestie, jak to zrobić?

Odpowiedz

9

spróbuj URLEncoder.encode()

Uwaga: należy zakodować ciąg, który jest po action= nie 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

To się zgadza. Kodowanie całego łańcucha zakończy się niepowodzeniem, ponieważ URI nie rozpoznaje zakodowanego 'http: //'. –

7

Musisz zakodować | w adresie URL jako %7C.

Rozważ użycie HttpClient na URIBuilder który dba o uciekający dla Ciebie, np:

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); 
+0

Ta odpowiedź jest bardziej gadatliwy niż [jeden przez Tarsem] (http://stackoverflow.com/a/18316373/177710), ale pomaga zrozumieć, jakie części są w URI. Z drugiej strony, ładnie ukrywa szczegóły obsługi i kodowania w szczegółach implementacji 'URIBuilder'. – Oliver

0

można zakodować parametry adresu URL za pomocą URLEncoder:

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

To będzie kodować wszystkie znaki specjalne, nie tylko fajka, dla ciebie.

0

W poście nie przywiązują parametry URL. Kod poniżej dodaje i urlEncodes twój parametr. Zajęło od: 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(); 
    } 
+0

Cytowanie: * "W poście nie dodajemy parametrów do adresu URL." * To nie jest prawda. Możesz bardzo dobrze wysyłać dane w żądaniu POST za pomocą parametrów URL i nie koliduje to z żadnymi standardami. – Oliver

0

miałem ten sam problem i go rozwiązać zastępując | do kodowanej wartości niego =>% 7C i ir działa

z tego

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

W tym

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