3 Stimmen

Wie Leerzeichen als %20 in UrlEncodedFormEntity während der Ausführung von Apache HttpPost zu kodieren?

Der Webserver, auf den ich stoße, benötigt die Parameter als URLEncodedFormEntity. Ich bin nicht in der Lage, Leerzeichen in %20 wie pro Anforderung des Webdienstes zu ändern, stattdessen wird Leerzeichen in + umgewandelt.

Mein Code lautet:

HttpClient client = new DefaultHttpClient()
HttpPost post = new HttpPost(url);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters,
            HTTP.UTF_8);
post.setEntity(entity);
HttpResponse resp = client.execute(post);

wobei Parameter ist List<NameValuePair> Parameter.

Ich habe mir viele Beiträge durchgelesen und alle schlagen vor, das Leerzeichen nach der Emcodierung in %20 zu ändern. Wie kann ich hier auf die Entität zugreifen und sie manuell ändern? Jede Hilfe wird geschätzt werden.

8voto

Jens Punkte 16639

Die UrlEncodedFormEntity ist im Grunde eine StringEntity mit einem benutzerdefinierten Konstruktor, Sie müssen sie nicht wirklich verwenden, um eine brauchbare Entität zu erstellen.

String entityValue = URLEncodedUtils.format(parameters, HTTP.UTF_8);
// Do your replacement here in entityValue
StringEntity entity = new StringEntity(entityValue, HTTP.UTF_8);
entity.setContentType(URLEncodedUtils.CONTENT_TYPE);
// And now do your posting of this entity

0voto

lgallard Punkte 464

Jens' Antwort funktioniert wie ein Zauberspruch! Um sein Beispiel zu vervollständigen, habe ich das hier verwendet, um einen Parameter zu posten:

String label = "A label";

List<NameValuePair> nvps = new ArrayList<NameValuePair>();

nvps.add(new BasicNameValuePair("label", label));
httpget.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

Aber es wird immer die Zeichenfolge "+" angezeigt, also "label=A+label". Mit Jens' Vorschlag änderte ich meinen Code zu:

String label = "A label";

List<NameValuePair> nvps = new ArrayList<NameValuePair>();

nvps.add(new BasicNameValuePair("label", label));

String entityValue = URLEncodedUtils.format(nvps, HTTP.UTF_8);
entityValue = entityValue.replaceAll("\\+", "%20");

StringEntity stringEntity = new StringEntity(entityValue, HTTP.UTF_8);
stringEntity.setContentType(URLEncodedUtils.CONTENT_TYPE);

httpget.setEntity(stringEntity);

Jetzt steht dort "label=A%20label".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X