2016-08-03 133 views
1

我想从HttpURLConnection中检索ResponseEntity的响应。我得到了406错误。如何从HttpURLConnection创建ResponseEntity?

预先感谢您。

@RequestMapping(value = "/retrive", method = { RequestMethod.GET }) 
    public ResponseEntity<?> retrive (HttpServletRequest request){ 
     //1. call a rest by rest client 
     URL u = new URL("http://localhost:8080/getHello"); 
     HttpURLConnection uc = (HttpURLConnection) u.openConnection(); 

     //2, create HttpHeaders for ResponseEntity 
     HttpHeaders responseHeaders = new HttpHeaders(); 
     for (int i = 0;; i++) { 
      String headerName = uc.getHeaderFieldKey(i); 
      String headerValue = uc.getHeaderField(i); 
      if(headerName != null && headerValue != null){ 
      responseHeaders.set(headerName, headerValue); 
      } 
      if (headerName == null && headerValue == null) { 
      break; 
      } 
     } 
     //3. create ResponseEntity 
     InputStream inputStream = uc.getInputStream(); 
     return new ResponseEntity<>(inputStream, responseHeaders, HttpStatus.OK); 
    } 

回答

0

也许,你需要的是将呼叫重定向到这个其他的网址?

@RequestMapping(path="/retrieve", method = RequestMethod.GET) 
    public void stack(HttpServletRequest request, HttpServletResponse response) throws IOException { 
     response.sendRedirect("http://download.thinkbroadband.com/1GB.zip"); 
    } 

这样,您就不会玩中间人阅读和写作内容。

否则,我还更新了以前的答案,它应该让你避免内存不足的错误:

@RequestMapping(value = "/retrieve", method = {RequestMethod.GET}) 
public void retrieve(HttpServletRequest request, HttpServletResponse response) throws IOException { 
    URL u = new URL("http://localhost:8080/getHello"); 
    OutputStream outputStream = response.getOutputStream(); 

    try (InputStream imageStream = u.openStream()) { 
     IOUtils.copy(imageStream, outputStream); 
    } 
} 

IOUtils.copy基本的读/写,而不是阅读数据块中的输入,整个响应一步到位。

您需要一个IOUtils公共-10:

<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.4</version> 
</dependency> 
+0

嗨亚历克斯, 感谢您的回复。 getHello服务返回一个字符串“hello”。 如果“byte []”太大,比我得到内存不足错误。我想直接检索(现在这个词是正确的:-))InputStream。 –

+0

更新了答案,并提供了一个sendRedirect建议 – alexbt

+0

谢谢您的回答和解决方案。 –

1

假设你正在试图建立某种反向代理的,那么你可以直接从输入流复制到输出流:

@RequestMapping(value = "/retrive", method = { RequestMethod.GET }) 
    public ResponseEntity<?> retrive (HttpServletRequest request, HttpServletResponse response){ 
    //1. call a rest by rest client 
    URL u = new URL("http://localhost:8080/getHello"); 
    HttpURLConnection uc = (HttpURLConnection) u.openConnection(); 

    //2, create HttpHeaders for ResponseEntity 
    HttpHeaders responseHeaders = new HttpHeaders(); 
    for (int i = 0;; i++) { 
     String headerName = uc.getHeaderFieldKey(i); 
     String headerValue = uc.getHeaderField(i); 
     if(headerName != null && headerValue != null){ 
     responseHeaders.set(headerName, headerValue); 
     } 
     if (headerName == null && headerValue == null) { 
     break; 
     } 
    } 

    try (InputStream inputStream = uc.getInputStream(); 
     OutputStream outputStream = response.getOutputStream(); 
     ) 
    { 
     IOUtils.copy(inputStream, outputStream); 
    } 
    //3. create ResponseEntity 
    return new ResponseEntity<>(responseHeaders, HttpStatus.OK); 
    } 
+0

Hi Denys,谢谢你为你的答案和解决方案。 –