Je crée un test unitaire pour essayer le servlet que je viens de créer.
@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);
}
La ligne suivante génère une NullPointerException:
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
Y a-t-il quelque chose qui me manque?
Désolé pour la question stupide, je viens de la résoudre en ajoutant le format utf-8.
post.setEntity(new UrlEncodedFormEntity(nameValuePairs, "utf-8"));
Créer un UrlEncodedFormEntity
sans passer le format utilisera DEFAULT_CONTENT_CHARSET
lequel est ISO-8859-1
Ce qui me déroute ... qu'est-ce qui le fait lancer NullPointerException
?
Pas du tout une question stupide. Je pense que la confusion est que dans httpclient 4.1, aucun format d'encodage n'était requis - Cela a fonctionné:
HttpEntity entity = new UrlEncodedFormEntity(params);
method.setEntity(entity);
Quand j'ai changé la dépendance en httpclient 4.2 afin d'accéder à RIBuilder , j'ai obtenu:
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)...
Avec 4.2, il semble que le constructeur nécessite l'encodage, comme vous l'avez noté. De manière déroutante, le document spécifie que l'ancien constructeur est toujours disponible, mais il ne semble plus fonctionner.
public UrlEncodedFormEntity (Liste des paramètres) doc