我正在尝试使用apache http-components客户端库从servlet进行http post调用,遇到以下错误。
java.lang.NoSuchMethodError:org.apache.http.entity.StringEntity。(Ljava / lang / String; Lorg / apache / http / entity / ContentType;)V org.apache.http.client。 entity.UrlEncodedFormEntity。(UrlEncodedFormEntity.java:77)
我试图在代码
中创建UrlEncodedEntity对象我查了另一篇帖子,他们说,这主要是因为构建路径不一致,我把所有的http组件库放在WEB_INF / lib里面(我希望这是正确的)libs的版本是4.4 。这是我写的代码。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out =response.getWriter();
out.println("Hit");
String serviceUrl = request.getParameter("url");
String data = request.getParameter("data");
String type = request.getParameter("type");
String dataType = request.getParameter("dataType");
if(null != serviceUrl && !serviceUrl.trim().equals("")) {
if(type.equalsIgnoreCase("POST")){
try {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://10.53.204.233:6504/app/service/"+serviceUrl);
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("type",type ));
nameValuePairs.add(new BasicNameValuePair("dataType",dataType ));
nameValuePairs.add(new BasicNameValuePair("data",data ));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8);
post.setEntity(entity);
HttpResponse responseTeamServer = client.execute(post);
BufferedReader rd = new BufferedReader(new InputStreamReader(responseTeamServer.getEntity().getContent()));
String line = "";
StringBuilder sb = new StringBuilder();
while ((line = rd.readLine()) != null) {
sb.append(line);
}
response.getWriter().write(sb.toString());
response.getWriter().flush();
response.getWriter().close();
}
catch (IOException e) {
e.printStackTrace();
}
} finally {
}
}
else{
}
}
else {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
}
}
对此方面的任何帮助或指示表示赞赏。 感谢
答案 0 :(得分:1)
您的代码已编译?你在运行时有这个问题吗?在这种情况下,您在类路径中有多个版本的库。
看到StringEntity类已从版本4开始导入,服务器/ lib可能具有加载的库的早期版本。
调试此方法的一种方法是添加 java -verbose:服务器启动脚本的类。它将输出包含加载类的路径(jar)文件的类信息。请注意,它会为每个加载的类打印出来,这可能是需要过滤的大量数据。
答案 1 :(得分:0)
正如javadoc所说,这个构造函数接受一个字符串作为第二个参数,而不是一个Charset对象