Java 如何从从HTTPClient调用的Servlet获取对HTTPClient的响应?

Java 如何从从HTTPClient调用的Servlet获取对HTTPClient的响应?,java,Java,我能够使用HttpClient成功地发布到servlet。但是,我需要一个布尔参数从servlet返回到HttpClient,我不确定如何执行相同的操作 早些时候,我使用的是common-httpclient-3.1.jar。然而,后来我知道httpclient的版本升级到了4.0,这有助于处理来自HttpResponse的响应。现在我正在使用httpclient.4.0.3、httpcore-4.1和httpmime-4.1.1。我正在尝试的代码如下所示 HttpClient client =

我能够使用HttpClient成功地发布到servlet。但是,我需要一个布尔参数从servlet返回到HttpClient,我不确定如何执行相同的操作

早些时候,我使用的是common-httpclient-3.1.jar。然而,后来我知道httpclient的版本升级到了4.0,这有助于处理来自HttpResponse的响应。现在我正在使用httpclient.4.0.3、httpcore-4.1和httpmime-4.1.1。我正在尝试的代码如下所示

HttpClient client = new DefaultHttpClient();
HttpPost method = new HttpPost("http://localhost:9090/drools-guvnor/KeystoneServlet");
HttpEntity entity = method.getEntity();
List<BasicNameValuePair> nvps = new ArrayList<BasicNameValuePair>();
nvps.add(new BasicNameValuePair("directory", directory));
nvps.add(new BasicNameValuePair("username", username));
nvps.add(new BasicNameValuePair("password", password));
method.setEntity(new UrlEncodedFormEntity(nvps));
ResponseHandler responseHandler = new BasicResponseHandler();
HttpResponse response = client.execute(method, responseHandler);
System.out.println("responseBody: "+responseHandler.handleResponse(response));
HttpClient=newdefaulthttpclient();
HttpPost方法=新的HttpPost(“http://localhost:9090/drools-guvnor/Keysoneservlet”);
HttpEntity=method.getEntity();
List nvps=new ArrayList();
添加(新的BasicNameValuePair(“目录”,目录));
添加(新的BasicNameValuePair(“用户名”,username));
添加(新的BasicNameValuePair(“密码”,password));
setEntity(新的UrlEncodedFormEntity(nvps));
ResponseHandler ResponseHandler=新BasicResponseHandler();
HttpResponse response=client.execute(方法,responseHandler);
System.out.println(“responseBody:+responseHandler.HandlerResponse(response));
在KeyStoneServlet中,我能够成功地获得参数目录、用户名和密码。进一步使用这些参数,我将进行进一步的处理,并能够检索一个布尔参数,我希望它作为对HttpClient的响应返回。然而,我不知道如何才能做到这一点。上面的responseBody SOP是空白的,没有显示任何内容


我们将非常感谢您提供的任何帮助。

有很多方法可以从servlet返回数据。。JSON、XML、纯文本。你所要做的就是:

response.setContentType("text/xml");
PrintWriter pw=response.getWriter();
pw.write(<reponse data string xml>);
response.setContentType(“text/xml”);
PrintWriter pw=response.getWriter();
write();
在httpclient上接收数据并对其进行解析。如果您只需要布尔值,那么一个表示true/false的字符串就可以了。。但是,如果您想从servlet中抛出一个异常,该怎么办?在这种情况下,XML更加健壮

如果不想解析xml或文本并处理响应,请尝试使用web服务

编辑:回应评论:

在servlet中,您可以访问HTTPResponse对象。让我们使用response来表示这个对象

response.setContentType("text/plain");
PrintWriter pw=response.getWriter();
pw.write(<true or false based on your processing>);
response.setContentType(“text/plain”);
PrintWriter pw=response.getWriter();
write();
现在在您的客户机代码中,我没有与httpclient 4进行过很多工作。。这就是httpclient 3-

HttpClient client = new DefaultHttpClient();
HttpPost method = new HttpPost("http://localhost:9090/drools-guvnor/KeystoneServlet");
HttpEntity entity = method.getEntity();
List<BasicNameValuePair> nvps = new ArrayList<BasicNameValuePair>();
nvps.add(new BasicNameValuePair("directory", directory));
nvps.add(new BasicNameValuePair("username", username));
nvps.add(new BasicNameValuePair("password", password));
method.setEntity(new UrlEncodedFormEntity(nvps));
HttpResponse httpResponse = client.execute(method);
int statusCode = httpResponse.getStatusLine().getStatusCode(); 
if (statusCode == HttpStatus.SC_OK) {
    InputStream is = httpResponse.getEntity().getContent();

    //convert your stream into a string and convert it into a boolean
}
HttpClient=newdefaulthttpclient();
HttpPost方法=新的HttpPost(“http://localhost:9090/drools-guvnor/Keysoneservlet”);
HttpEntity=method.getEntity();
List nvps=new ArrayList();
添加(新的BasicNameValuePair(“目录”,目录));
添加(新的BasicNameValuePair(“用户名”,username));
添加(新的BasicNameValuePair(“密码”,password));
setEntity(新的UrlEncodedFormEntity(nvps));
HttpResponse HttpResponse=client.execute(方法);
int statusCode=httpResponse.getStatusLine().getStatusCode();
if(statusCode==HttpStatus.SC\u OK){
InputStream is=httpResponse.getEntity().getContent();
//将流转换为字符串并将其转换为布尔值
}
抱歉,我没有要检查的httpclient 4。。但我相信上述方法应该有效


我不建议将纯文本发送回去。相反,使用XML并以与上面相同的方式处理它

你所说的“上面的响应库SOP是空白的”是什么意思?servlet代码是什么样子的?布尔结果=localAuth.Login(目录,新对象[]{username,password});System.out.println(“来自身份验证的结果:-”+结果);我想将这个布尔参数返回给HttpClientSethu,如果您能告诉我如何将我在servlet中使用的布尔参数返回给HttpClient boolean result=localAuth.Login(目录,新对象[]{username,password});System.out.println(“来自身份验证的结果:-”+结果);HttpResponse给了我一些我无法理解的空响应。我为HttpServletResponse设置了属性……。虽然在这方面我也只能设置字符串而不能设置布尔值。谢谢你回答Sethu。您在回复中提到了HttpPost,并且您正在使用httpclient3。我觉得我应该用PostMethod…如果我错了,请纠正我。此外,设置实体在httpclient3中不存在,因此您提供的代码段很难工作:(我还担心如何将servlet中的boolean参数返回到HttpClient。我已经再次编辑了我的答案…根据以下链接: