Создание 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));
Есть ли что-то, что мне не хватает?
Ответы
Ответ 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