Как кодировать пространство как% 20 в UrlEncodedFormEntity при выполнении Apache HttpPost? - PullRequest
3 голосов
/ 27 октября 2011

Веб-серверу, который я запускаю, требуются параметры как URLEncodedFormEntity. Я не могу изменить пространство на% 20 согласно требованию веб-службы, вместо этого пространство преобразуется в +.

Мой код:

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

, где параметры List<NameValuePair> параметры.

Я прочитал много постов, и все предлагают вручную изменить пространство на% 20 после emcoding. Здесь, как я могу получить доступ к объекту и изменить его вручную? Любая помощь будет оценена.

Ответы [ 2 ]

8 голосов
/ 27 октября 2011

UrlEncodedFormEntity - это, в основном, StringEntity с пользовательским конструктором, вам на самом деле не нужно использовать его для создания полезной сущности.

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
0 голосов
/ 26 апреля 2016

ответ Дженса работает как шарм! Чтобы завершить его пример, я использовал его для публикации параметра:

String label = "A label";

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

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

Но он всегда отправляет строку «+», я имею в виду «label = A + label». Используя предложение Йенса, я изменил свой код на:

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

Теперь он публикует "label = A% 20label"

...