2014-01-31 3 views
0

Я работаю с Apache Tomcat, и я хочу отправить данные на http-сервер и получить ответ от HTTP-сервера (из сервлета).JAVA HTTP Client и Serlvlet

Проблема:

Когда я использую HTTP клиент для передачи данных, кажется, данные не будут доставлены (параметры, посланные в не отображается сервлет). Когда я имитирую то же самое с помощью HTTP-браузера (Chrome), все кажется ОК.

Ниже приведены примеры моего сервлета и моего http-клиента.

Мой HTTP Servlet:

public class MyServlet extends HttpServlet { 
    public void doGet(HttpServletRequest req, HttpServletResponse res) 
      throws ServletException, IOException { 
     PrintWriter out = res.getWriter(); 
     out.println("This ervlet requires POST but received GET"); 
     out.close(); 
    } 

    protected void doPost(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/html"); 

     PrintWriter out = response.getWriter(); 
     for (String name : request.getParameterMap().keySet()) { 
      out.write("PARAMETER :" + name); 
      out.write("\n"); 
     } 

     for (Part name : request.getParts()) { 
      out.write("MULTIPART PARAMETER :" + name.getName()); 
      out.write("\n"); 
     } 

     String p1 = request.getParameter("input1"); 
     out.write("RECEIVED PARAMETER:" + p1); 
     out.write("\n"); 

     out.close(); 
    } 
} 

Мой HTTP-клиент

/** 
* Example how to use multipart/form encoded POST request. 
*/ 
public class ClientMultipartFormPost { 

    public static void main(String[] args) throws Exception { 
     CloseableHttpClient httpclient = HttpClients.createDefault(); 
     try { 
      HttpPost httppost = new HttpPost("http://example.com:8080" + 
        "/myservlet"); 

      FileBody bin = new FileBody(new File("file1.txt")); 
      StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN); 

      HttpEntity reqEntity = MultipartEntityBuilder.create() 
        .addPart("bin", bin) 
        .addPart("input1", comment) 
        .build(); 


      httppost.setEntity(reqEntity); 

      System.out.println("executing request " + httppost.getRequestLine()); 
      CloseableHttpResponse response = httpclient.execute(httppost); 
      try { 
       System.out.println("----------------------------------------"); 
       System.out.println(response.getStatusLine()); 
       HttpEntity resEntity = response.getEntity(); 
       if (resEntity != null) { 
        PrintWriter sWriter = new PrintWriter(System.out); 
        IOUtils.copy(resEntity.getContent(), sWriter, "UTF-8"); 
        sWriter.close(); 
       } 
       EntityUtils.consume(resEntity); 
      } finally { 
       response.close(); 
      } 
     } finally { 
      httpclient.close(); 
     } 
    } 

} 

ВЫВОД: выполнение запроса POST

http://example.com:8080/myservlet HTTP/1.1

---------------------------------------- HTTP/1.1 200 OK

ПОЛУЧЕННЫЕ ПАРАМЕТР: нулевой

Browser Client (тест) Broswer POST работает, как ожидалось:

<form name="input" action="http://example.com:8080/servlet" method="post"> 
<input type="text" name="input1"> 
<input type="submit" value="Submit"> 
</form> 

ВЫВОД: ПАРАМЕТР: input1

ПОЛУЧЕННЫЕ ПАРАМЕТР: AAAAAAAA

ОБНОВЛЕНИЕ: Браузер код:

Request URL:http://localhost:8080/servlet 
Request Method:POST 
Status Code:200 OK 
Request Headersview parsed 
POST /LyticsRemote/flexi HTTP/1.1 
Host: localhost:8080 
Connection: keep-alive 
Content-Length: 10 
Cache-Control: max-age=0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Origin: null 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102 Safari/537.36 
Content-Type: application/x-www-form-urlencoded 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: cs,en-GB;q=0.8,en;q=0.6 
Cookie: JSESSIONID=9BD73E186BC8A081AB87C8EF58483523 
Form Dataview sourceview URL encoded 
input1:aaa 
Response Headersview source 
Content-Length:41 
Content-Type:text/html;charset=ISO-8859-1 
Date:Fri, 31 Jan 2014 11:46:54 GMT 
Server:Apache-Coyote/1.1 
+0

Сравните заголовки, отправленные браузером, и отправленные HttpClient. – Stephan

+0

Могу ли я спросить вас, как отображать заголовки http? –

+0

Вы можете использовать инструмент, например WireShark (http://www.wireshark.org/), чтобы увидеть заголовки HttpClient. Те из Chrome легче увидеть: нажмите кнопку ** F12 **, щелкните по вкладке сети, а затем отправьте форму на свой сервлет, чтобы увидеть заголовки. – Stephan

ответ

0

Решение было добавить getParameters метод сервлета поэтому окончательный код:

public class FlexiServlet extends HttpServlet { 
    private FileItem fileItem; 

    public void doGet(HttpServletRequest req, HttpServletResponse res) 
      throws ServletException, IOException { 
     PrintWriter out = res.getWriter(); 
     out.println("This ervlet requires POST but received GET"); 
     out.close(); 
    } 

    protected void doPost(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/html"); 

     PrintWriter out = response.getWriter(); 
     boolean success = getParameters(request, out); 
     out.write(" XXXXXXXXXXXXXXXXX" + success); 
     out.write(" XXXXXXXXXXXXXXXXX" + fileItem); 
     out.write("\n"); 
     for (String name : request.getParameterMap().keySet()) { 
      out.write("PARAMETER :" + name); 
      out.write("\n"); 
     } 

     for (Part name : request.getParts()) { 
      out.write("MULTIPART PARAMETER :" + name.getName()); 
      out.write("\n"); 
     } 

     String p1 = request.getParameter("input1"); 
     out.write("RECEIVED PARAMETER:" + p1); 
     out.write("\n"); 

     out.close(); 
    } 

    public boolean getParameters(HttpServletRequest request, PrintWriter out) { 
     List fileItemsList = null; 
     try { 
      if (ServletFileUpload.isMultipartContent(request)) { 
       ServletFileUpload servletFileUpload = new ServletFileUpload(
         new DiskFileItemFactory()); 
       try { 
        fileItemsList = servletFileUpload.parseRequest(request); 
       } catch (FileUploadException ex) { 
       } 
       String optionalFileName = ""; 
       Iterator it = fileItemsList.iterator(); 
       while (it.hasNext()) { 
        FileItem fileItemTemp = (FileItem) it.next(); 
        if (fileItemTemp.isFormField()) { 
         // for other form fields that are not multipart 
         // if (fileItemTemp.getFieldName().equals("commonName")) 
         // { 
         // commonName = fileItemTemp.getString(); 
         // } 
         out.write("AAAAAAAAAAAA " + fileItemTemp.getFieldName()); 
        } else { 
         if (fileItemTemp.getFieldName().equals("media_file")) { 
          fileItem = fileItemTemp; 
         } 
         out.write("BBBBBBBBBBBBBB " + fileItemTemp.getFieldName()); 

        } 
       } 
      } 
     } catch (Exception e) { 
     } 
     return true; 
    } 
}