2013-03-29 3 views
1

Привет, я отправляю запрос Http с использованием HttpClient. Я могу вызвать Servlet, но возвращая 405 status code.doPost method not allowed. попробовал получить тот же код статуса.Http Response Header в java

А также я не могу получить заголовок в ответ. Нужно ли мне пересылать запрос или возвращать его обратно.

// Код для отправки запроса 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

Печатается ли «Inside ProcessReqest»? –

ответ

0

Я думаю, что Servlet реализует только doGet(). Когда вы звоните POST метод, либо doPost()service() или метод должен быть реализован сервлетом.

По умолчанию, когда вызывается метод службы сервлета, он вызывает соответствующий метод doXXX(). Если этот метод не реализован подклассом HttpServlet, метод doXXX() в HttpServlet возвращает 405 Method Not Supported status code.

Фрагмент из doPost() метод в HttpServlet ниже:

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() метод как частный. Это доступ скрыт. Измените его как защищенный и попробуйте.

Неправильно иметь более слабый доступ в подклассе. Как правило, компилятор должен был дать ошибку при компиляции этого сервлета.

+0

Спасибо за ответ. Он защищен кодом. Но все равно такая же ошибка 405. Поскольку я пытаюсь отправить запрос от одной войны к другой войне Еще одна проблема, я добавляю ответ в Servlet, используя response.addHeader («JobStatus», «Success»). Я пытаюсь читать в классе java клиента. Но я получаю некоторое количество мусора, например @ 1! 23ec. Помоги мне. Заголовки [] header = response.getHeaders(); for (header:) {// печатает другие другие заголовки, такие как Тип контента, длина и т. д., но не мои добавленные} –

0

Похоже, что ваш сервер не поддерживает метод POST. Вместо этого попробуйте использовать запрос HttpGet.

POST используется для отправки данных на сервер, тогда как GET используется для запроса информации. Ваш код не пытается отправить какие-либо данные, поэтому я считаю, что HttpGet - это то, что вы хотите.

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

0

Если это код как от клиента, и сервлета, метод doPost является частным, поэтому вы сервлет не будет реагировать на POST запросов. Сделайте свой метод doPost общедоступным.

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

проблема в том, что заголовки добавлены с

HttpServletResponse.setHeader(...) 

или

HttpServletResponse.addtHeader(...) 

являются "заголовки ответа сервлета", а не "HTTP заголовки" ,

Так что среди них вы найдете также заголовки http, но то, что вы установили, не получено клиентом вместе с ними.

Я предлагаю вам использовать параметры URL вместо заголовков.