Подтвердить что ты не робот

Создание UrlEncodedFormEntity из списка NameValuePairs вызывает исключение NullPointerException

Я создаю unit test, чтобы опробовать только что созданный сервлет.

@Test
public void test() throws ParseException, IOException {

  HttpClient client = new DefaultHttpClient();
  HttpPost post = new HttpPost("http://localhost:8080/WebService/MakeBaby");

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

  nameValuePairs.add(new BasicNameValuePair("father_name", "Foo"));
  nameValuePairs.add(new BasicNameValuePair("mother_name", "Bar"));

  post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
  HttpResponse response = null;

  try {
    response = client.execute(post);
  } catch (ClientProtocolException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  }

  String stringifiedResponse = EntityUtils.toString(response.getEntity());

  System.out.println(stringifiedResponse);

  assertNotNull(stringifiedResponse);
}

Следующая строка генерирует исключение NullPointerException:

post.setEntity(new UrlEncodedFormEntity(nameValuePairs));

Есть ли что-то, что мне не хватает?

4b9b3361

Ответ 1

Извините за глупый вопрос, просто решите его, добавив формат utf-8.

post.setEntity(new UrlEncodedFormEntity(nameValuePairs, "utf-8"));

Создание UrlEncodedFormEntity без передачи формата будет использовать DEFAULT_CONTENT_CHARSET, который ISO-8859-1

Что меня озадачивает... что заставляет его бросать NullPointerException?

Ответ 2

Не глупый вопрос. Я думаю, что путаница в том, что в httpclient 4.1 не требуется формат кодирования. Это сработало:

HttpEntity entity = new UrlEncodedFormEntity(params);
method.setEntity(entity);

Когда я изменил зависимость к httpclient 4.2, чтобы получить доступ к URIBuilder, я получил:

java.lang.NullPointerException
at org.apache.http.entity.StringEntity.<init>(StringEntity.java:70)
at org.apache.http.client.entity.UrlEncodedFormEntity.<init>(UrlEncodedFormEntity.java:78)
at org.apache.http.client.entity.UrlEncodedFormEntity.<init>(UrlEncodedFormEntity.java:92)...

С 4.2, как вы заметили, конструктору требуется кодировка. Смутно, документ указывает, что старый конструктор по-прежнему доступен, но он больше не работает.

public UrlEncodedFormEntity (параметры списка) doc