在HTML页面上用JavaScript处理REST API的响应
使用通过JS发送请求以在简单的HTML页面上获取元数据的熟悉方法……
const getMangasWebMetaDataEvent = async () => {
const script = document.createElement('script');
script.src = WEB_DATA_SOURCE + '?callback=scriptWrapper';
document.getElementsByTagName('head')[0].appendChild(script);
}
我注意到来自我的Spring Boot的“REST API”的响应:{"status":true, "status":"some data"} 以以下信息结束:
A resource is blocked by OpaqueResponseBlocking, please check browser console for details.
“REST API”的响应头如下:
[Content-Type:"application/jsonp;charset=UTF-8", Content-Length:"72", Date:"Tue, 28 Apr 2026 16:38:50 GMT", Keep-Alive:"timeout=60", Connection:"keep-alive"]
然而,我最喜欢的“广播电台”的元数据的响应在浏览器中并不会产生类似的响应。接收到的元数据由HTML页面的JavaScript处理,一切正常。
({"return":"1","response":{"informationjson":{"status":"some data"}})
“radio station”的响应头如下:
[Date:"Tue, 28 Apr 2026 16:26:22 GMT", Content-Type:"application/jsonp", Transfer-Encoding:"chunked", Connection:"keep-alive", Server:"cloudflare", Set-Cookie:"\_sessionName=xxx; path=/; secure", Expires:"Thu, 19 Nov 1981 08:52:00 GMT", Cache-Control:"no-store, no-cache, must-revalidate", Pragma:"no-cache", cf-cache-status:"DYNAMIC", CF-RAY:"xxx"]
我应该如何通过“REST API”将其准备为JSONP,以便网站上的JavaScript在收到响应后能够处理它?
“REST API”简化方法:
@Async
@GetMapping(value = "/open/status", produces = "application/jsonp")
public CompletableFuture<Callable<String>> handlerMethod()
{
return CompletableFuture.completedFuture(() -> {
StatusDto statusDto = statusBuilder();
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.writeValueAsString(statusDto);
});
}
解决方案
你的API响应类型会导致浏览器抛出ORB异常,以保护你这个用户。请将响应类型从 application/jsonp 更新为 application/javascript
更多信息请参阅下列文章:本文 或者这个 Stack Overflow上的另一种解法。来自所链接文章的要点如下:
为了绕过同源策略,浏览器需要将请求返回的内容解释为脚本,因此响应的Content-Type应设置为
application/javascript。如果返回的内容是JSONP,但Content-Type是
application/json,浏览器将无法识别它并产生ORB(不透明响应阻塞)异常,提示 未在给定标识符的资源中找到数据。