21

我正在创建一个单元测试来试用我刚刚创建的 servlet。

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

有什么我想念的吗?

4

2 回答 2

33

抱歉这个愚蠢的问题,刚刚通过添加 utf-8 格式解决了它。

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

创建一个UrlEncodedFormEntity不传递格式将使用DEFAULT_CONTENT_CHARSETwhich isISO-8859-1

这让我感到困惑......是什么导致它抛出NullPointerException

于 2012-06-08T02:33:57.223 回答
10

根本不是一个愚蠢的问题。我认为令人困惑的是,在 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,构造函数似乎需要编码。令人困惑的是,文档指定旧的构造函数仍然可用,但它似乎不再工作了。

公共 UrlEncodedFormEntity(列表参数)文档

于 2012-06-26T16:29:03.173 回答