10

Se voglio trattare questo URL, ad esempio:Impossibile processo url con barra verticale/tubo in Java/Apache HttpClient

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

Java/Apache non mi lascia perché si dice che la barra verticale (" | ") è illegale.

fuggire con doppie barre non funziona così:

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

^che non funziona pure.

Qualche suggerimento su come farlo funzionare?

risposta

9

provare con URLEncoder.encode()

Nota: si dovrebbe codificare stringa che viene dopo action= non 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

Questo è corretto. La codifica dell'intera stringa fallirà perché l'URI non riconoscerebbe il 'http: //' codificato. –

7

È necessario codificare | in un URL come %7C.

Considerare l'utilizzo di URIBuilder che si occupa della fuga per voi, per esempio HttpClient:

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

Questa risposta è più prolisso di [quella di Tarsem] (http://stackoverflow.com/a/18316373/177710) ma aiuta a capire quali parti ci sono in un URI. D'altra parte, mantiene la gestione e la codifica ben nascoste nei dettagli di implementazione di 'URIBuilder'. – Oliver

0

È possibile codificare parametri URL utilizzando il URLEncoder:

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

Ciò codificare tutti i caratteri speciali, non solo la pipa, per te.

0

Nel messaggio non diamo parametri da URL. Il codice qui sotto aggiunge e urlEncode il tuo parametro. E 'tratto da: 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

Citazione: * "In post non colleghiamo i parametri all'URL." * Questo non è vero. È possibile inviare i dati in una richiesta POST utilizzando i parametri URL e non si scontrano con nessuno standard. – Oliver

0

Ho avuto lo stesso problema e ho risolto sostituendo il | per un valore codificato di esso =>% 7C e ir lavori

Da questo

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

Per questo

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