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 如果您希望使用 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 WebClient 响应转换为 ResponseEntity?