1

您好我正在使用 HttpClient 发送 Http 请求。我可以调用 Servlet 但返回405 status code.doPost method not allowed。尝试获得相同的状态码。

而且我也无法得到标题作为回应。我是否需要将请求转发或包含回请求。

//发送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");
        }

// 小服务程序

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");
        }
    }
4

5 回答 5

0

我认为 Servlet 仅doGet().在调用POST方法时才实现,doPost()或者service()方法应该由 servlet 实现。

默认情况下,当调用 servlet 的服务方法时,它会调用相应的doXXX()方法。如果 HttpServlet 的子类没有实现该doXXX()方法,则 HttpServlet 中的方法返回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 时,编译器应该会给出错误。

于 2013-03-29T06:59:15.507 回答
0

听起来您的服务器不支持 POST 方法。尝试改用 HttpGet 请求。

POST 用于向服务器发送数据,而 GET 用于请求信息。您的代码没有尝试发送任何数据,所以我认为 HttpGet 是您想要的。

http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/methods/HttpGet.html

于 2013-03-29T07:00:16.880 回答
0

如果这是来自您的客户端和 servlet 的代码,则该doPost方法是私有的,因此您的 servlet 将不会响应POST请求。公开你的doPost方法。

于 2013-03-29T07:01:43.150 回答
0

我认为您应该将post方法中的访问修饰符从private. 这就是它不可见的原因。将修饰符更改为protectedpublic

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");
    }
}
于 2013-03-29T07:01:57.723 回答
0

问题是添加的标题

HttpServletResponse.setHeader(...)

或者

HttpServletResponse.addtHeader(...)

是“servlet 响应头”,而不是“HTTP 头”。

因此,在其中您还可以找到 http 标头,但是您设置的内容不会与它们一起被客户端接收。

我建议您使用 URL 参数而不是标题。

于 2013-09-18T09:50:08.840 回答