10

Wenn ich will diese URL zum Beispiel verarbeiten:kann nicht verarbeitet werden URL mit vertikal/Rohr bar in Java/Apache Httpclient

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

Java/Apache lässt mich nicht, weil er sagt, dass der vertikale Balken (“ | ") ist illegal.

es mit doppelten Schrägstrichen zu entkommen funktioniert nicht gut:

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

^, die nicht so gut funktioniert.

Irgendwelche Vorschläge, wie dies funktioniert?

Antwort

9

versuchen mit URLEncoder.encode()

Hinweis: Sie sollten Zeichenfolge codieren, das nach action= nicht 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

Das ist richtig. Das Codieren der gesamten Zeichenfolge schlägt fehl, da URI das codierte "http: //" nicht erkennt. –

7

Sie müssen | in einer URL als %7C codieren. mit

Betrachten Httpclient des URIBuilder, die für Sie kümmern sich um die Flucht nimmt, zum Beispiel:

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

Diese Antwort ausführlicher als [dem von Tarsem] ist (http://stackoverflow.com/a/18316373/177710), sondern hilft zu erkennen, welche Teile in einem URI vorhanden sind. Auf der anderen Seite hält es die Handhabung und Codierung in den Implementierungsdetails von 'URIBuilder' versteckt. – Oliver

0

Sie URL-Parameter kodieren, können die mit URLEncoder:

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

Dadurch werden alle Sonderzeichen kodieren, nicht nur die Pfeife, für dich.

0

In Post wir url keine Parameter anhängen. Code unten fügt hinzu und urlEncodiert Ihren Parameter. Es ist entnommen aus: 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

Zitat: * "In der Post fügen wir keine Parameter zu URL." * Dies ist nicht wahr. Sie können sehr gut Daten in einer POST-Anfrage mit URL-Parametern senden und es kollidiert nicht mit Standards. – Oliver

0

hatte ich gleiches Problem und ich löse sie die ersetzende | für einen codierten Wert von it =>% 7C und ir arbeitet

Von diesem

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

Zu diesem

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