您好我正在使用HttpClient发送Http请求。我可以调用Servlet但返回405 status code.doPost method not allowed
。尝试获得相同的状态代码。
而且我也无法得到The Header作为回应。我是否需要将请求转发或包含在请求中。
//发送Http请求的代码
public void perform(Date now, long remainingRepetitions)
{
log.info("Starting the Job " + now);
System.out.println("Before try 2");
try {
HttpResponse response;
while(true){
HttpClient client = new DefaultHttpClient();
System.out.println("Http Client instantiated");
HttpPost request = new HttpPost("http://localhost:8080/Servlet");
System.out.println("Post Request created");
response = client.execute(request);
System.out.println("Http Status Code = " + response.getStatusLine().getStatusCode() );
Header headers[] = response.getAllHeaders();
for(Header h:headers){
System.out.println("New" +h.getName() + ": " + h.getValue());
}
if(response.getStatusLine().getStatusCode()==200 || response.getStatusLine().getStatusCode()== 405){
if(response.getLastHeader("JobStatus").equals("Success"))
{
break;
}
}
client.getConnectionManager().shutdown();
Thread.sleep(10000);
}
} catch (ClientProtocolException e) {
log.info(e);
} catch (IOException e) {
log.info(e);
} catch (Exception e) {
// TODO Auto-generated catch block
log.info("Exception Occured");
e.printStackTrace();
}finally{
System.out.println("finally");
}
// Servlet
private void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
System.out.println("Inside ProcessReqest");
try{
//some method call
resp.addHeader("JobStatus", "Success");
}catch(Exception e){
resp.addHeader("JobStatus", "Failure");
}
}
答案 0 :(得分:0)
我认为Servlet仅实现doGet().
当您调用POST
方法时,servlet应该实现doPost()
或service()
方法。
默认情况下,调用servlet的service方法时,它会调用相应的doXXX()
方法。如果HttpServlet的子类没有实现该方法,则HttpServlet中的doXXX()
方法将返回405 Method Not Supported status code
。
HttpServlet中的doPost()方法片段如下:
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_put_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
} else {
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
}
我认为在您的情况下,您已将doPost()
方法声明为私有。它的访问权是隐藏的。将其修改为受保护并尝试。
在子类中拥有较弱的访问权限是不正确的。通常,编译器在编译该servlet时应该给出错误。
答案 1 :(得分:0)
听起来您的服务器不支持POST方法。请尝试使用HttpGet请求。
POST用于向服务器发送数据,而GET用于请求信息。您的代码并未尝试发送任何数据,因此我认为HttpGet就是您想要的。
答案 2 :(得分:0)
如果这是来自客户端和servlet的代码,则doPost
方法是私有的,因此您的servlet不会响应POST
个请求。公开您的doPost
方法。
答案 3 :(得分:0)
我认为您应该从post
更改private
方法中的访问修饰符。这就是它不可见的原因。将修改器更改为protected
或public
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
System.out.println("Inside ProcessReqest");
try{
//some method call
resp.addHeader("JobStatus", "Success");
}catch(Exception e){
resp.addHeader("JobStatus", "Failure");
}
}
答案 4 :(得分:0)
问题是标题添加了
HttpServletResponse.setHeader(...)
或
HttpServletResponse.addtHeader(...)
是" servlet响应标头",而不是" HTTP标头"。
因此,在其中您还可以找到http标头,但客户端不会同时收到您设置的内容。
我建议您使用网址参数而不是标题。