ResponseEntity,如何获取html中的body

Posted

技术标签:

【中文标题】ResponseEntity,如何获取html中的body【英文标题】:ResponseEntity, how to obtain the body in html 【发布时间】:2016-04-13 23:51:01 【问题描述】:

我想在浏览器中显示控制器返回的 ResponseEntity 的主体(使用 Spring):

return new ResponseEntity<>(l.getReachableDate(), HttpStatus.NOT_FOUND);

l.getReachableDate() 返回一个 Date 类型,我想以如下方式显示它:

<header>
    <h1><span>Url is not reachable from</span> <!-- body --> </h1>
</header>

我怎样才能让它显示出来?

【问题讨论】:

1) 为什么不使用普通的 Spring MVC 方式来渲染带有 JSP 模板的 html 文件? 2) 是不是你的 html 示例无效? HTML 标头不允许包含设计用于正文的 html 标记,例如 h1、span .... 嗨@Ralph。 1)我认为Spring中不允许使用JSP。 2)我不知道它是无效的还是不允许的,但它允许我。也许你是对的,虽然可以做到,但这不是一个好方法。 1) 是错误的。使用 spring 呈现 HTML 页面的典型方法是 MVC 模式(docs.spring.io/spring/docs/current/spring-framework-reference/… - 也可以查看图像)。所以 spring 控制器构建了一个模型(地图)并将其传递给渲染引擎,渲染引擎将模型的一些属性放入 html 模板中。 Spring支持不同的渲染引擎,最常见的是JSP,另外一个新的渲染引擎是Springs Thymeleaf。 (我不打算在没有 MVC 框架的情况下使用 JPS,这不是一种好的风格) @Ralph Okey,现在明白了。是的,我正在使用 Thymeleaf。我可以在返回 ModelAndView 的 html 中获取动态数据。但是,我没有得到返回 ResponseEntity 的解决方案,这就是我发帖的原因。我实际上正在尝试 prem kumar 的建议。我抛出一个异常,并在处理程序中返回一个 ModelAndView。这样我就可以显示数据了。 【参考方案1】:

我仍然不明白你为什么要这样做,但是这样它应该可以工作

@RequestMapping(value="/controller", method=GET)
public ResponseEntity<String> foo() 
    String content = 
           "<header>"
         + "<h1><span>Url is not reachable from</span>" +  l.getReachableDate() + "</h1>"
         + "</header>";
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.setContentType(MediaType.TEXT_HTML);

    return new ResponseEntity<String>(content, responseHeaders, HttpStatus.NOT_FOUND);


在一些cmets之后......

与其将用户重定向到资源未找到页面,不如使用ResourceNotFoundRuntimeException(扩展 RuntimeException)并注册 MVC 异常处理程序(这是 prem kumar 建议的,但没有自定义异常 html文本):

public class ResourceNotFoundRuntimeException extends RuntimeException
...

处理程序:

@ControllerAdvice
public class ExceptionHandlerController 

    @ExceptionHandler(ResourceNotFoundRuntimeException .class)
    public ResponseEntity<String> resourceNotFoundRuntimeExceptionHandling()
        String content = 
               "<header>"
             + "<h1><span>Url is not reachable from</span>" +  l.getReachableDate() + "</h1>"
             + "</header>";
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.setContentType(MediaType.TEXT_HTML);

        return new ResponseEntity<String>(content, responseHeaders, HttpStatus.NOT_FOUND);
    

【讨论】:

这样的东西是我想要的,但不起作用。 1) 我在 MediaType.TEXT_HTML 中收到不兼容的类型错误(它需要 MediaType,但它传递了字符串,在应该可以工作的 API 中进行了更改...)。 2) 我注释了内容类型行,但是浏览器as you can see 中没有显示所需的数据。你可以查看我的公开回购here 1) 你需要使用:org.springframework.http.MediaType 2) 您的 web、xml 中是否定义了 404 错误页面? 1) 已解决,谢谢 2) 不,我使用 response.sendRedirect("notReachable.html"); 重定向用户。我只想在我最近发送的图像中添加短语“Url is not reachable from ”。仍然没有显示任何内容。 3)我在其他页面中有相同的 html,它们可以工作。我认为有一个混淆:我有标签头和正文,而在正文中我有标签标题。 好吧,如果我不重定向他,它会显示在浏览器中,你是对的。但是我怎样才能让它显示在所需的页面中呢?【参考方案2】:

如果您希望使用 spring 从服务器端获取整个主体,那么您可以抛出自定义 ResourceNotFoundException 并使用 spring 异常处理程序处理它。

检查以下链接:

https://***.com/a/21115267/5039001

以下链接为您提供了不同的方法。

https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

如果你想为不同的 url 提供不同的 body,那么你可以在 ResourceNotFoundException 中有一个属性 html body,并将 body 作为构造函数参数传递并抛出异常。在异常处理程序中,您可以检索此正文并构建 http 响应消息。

public class ResourceNotFoundException extends RuntimeException
    private String htmlBody;
    public ResourceNotFoundException(String htmlBody)
        //super(...)
        this.htmlBody = htmlBody;
    

您现在可以全局重用此异常。请注意,您需要为此异常设置相应的异常处理程序,您可以访问上述共享链接。

【讨论】:

以上是关于ResponseEntity,如何获取html中的body的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Spring RestTemplate 中的对象获取列表

java - 如何将responseEntity映射到java中的自定义类

spring中的ResponseEntity理解

如何将 Spring WebClient 响应转换为 ResponseEntity?

Spring + Angular:如何以角度解析 ResponseEntity?

如何在 ResponseEntity 中返回布尔值?