ES8.13.0 java client请求响应报错status: 200, [es/search] Failed to decode response

最近在做商城项目使用ES8.13.0做商品复杂的检索功能时,遇到一个报错如下:

2024-07-05 10:47:53.994 ERROR 10708 --- [nio-7500-exec-1] com.tfq.exception.RRExceptionHandler     : co.elastic.clients.transport.TransportException: node: http://127.0.0.1:9200/, status: 200, [es/search] Failed to decode responsejava.lang.RuntimeException: co.elastic.clients.transport.TransportException: node: http://127.0.0.1:9200/, status: 200, [es/search] Failed to decode responseat com.tfq.service.impl.MallSearchServiceImpl.search(MallSearchServiceImpl.java:64) ~[classes/:na]at com.tfq.app.SearchController.listPage(SearchController.java:23) ~[classes/:na]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_221]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_221]org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.23.jar:5.3.23]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96) [spring-boot-actuator-2.6.13.jar:2.6.13]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.23.jar:5.3.23]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) [spring-web-5.3.23.jar:5.3.23]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.23.jar:5.3.23]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) [tomcat-embed-core-9.0.68.jar:9.0.68]at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.68.jar:9.0.68]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_221]
Caused by: co.elastic.clients.transport.TransportException: node: http://127.0.0.1:9200/, status: 200, [es/search] Failed to decode responseat co.elastic.clients.transport.ElasticsearchTransportBase.decodeTransportResponse(ElasticsearchTransportBase.java:404) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.transport.ElasticsearchTransportBase.getApiResponse(ElasticsearchTransportBase.java:363) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.transport.ElasticsearchTransportBase.performRequest(ElasticsearchTransportBase.java:147) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.elasticsearch.ElasticsearchClient.search(ElasticsearchClient.java:1923) ~[elasticsearch-java-8.13.0.jar:na]at com.tfq.service.impl.MallSearchServiceImpl.search(MallSearchServiceImpl.java:59) ~[classes/:na]... 55 common frames omitted
Caused by: co.elastic.clients.json.JsonpMappingException: Error deserializing co.elastic.clients.elasticsearch.core.search.Hit: jakarta.json.JsonException: Jackson exception (JSON path: hits.hits[0]._source) (line no=1, column no=244, offset=-1)at co.elastic.clients.json.JsonpMappingException.from0(JsonpMappingException.java:134) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.JsonpMappingException.from(JsonpMappingException.java:121) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:218) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:148) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.ObjectBuilderDeserializer.deserialize(ObjectBuilderDeserializer.java:85) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.JsonpDeserializerBase$ArrayDeserializer.deserialize(JsonpDeserializerBase.java:318) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.JsonpDeserializerBase$ArrayDeserializer.deserialize(JsonpDeserializerBase.java:280) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:77) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.ObjectDeserializer$FieldObjectDeserializer.deserialize(ObjectDeserializer.java:78) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:192) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:148) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:77) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.ObjectBuilderDeserializer.deserialize(ObjectBuilderDeserializer.java:79) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.ObjectDeserializer$FieldObjectDeserializer.deserialize(ObjectDeserializer.java:78) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:192) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:148) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:77) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.ObjectBuilderDeserializer.deserialize(ObjectBuilderDeserializer.java:79) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:43) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:43) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.transport.endpoints.EndpointWithResponseMapperAttr$1.deserialize(EndpointWithResponseMapperAttr.java:56) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.transport.ElasticsearchTransportBase.decodeTransportResponse(ElasticsearchTransportBase.java:399) ~[elasticsearch-java-8.13.0.jar:na]... 59 common frames omitted
Caused by: jakarta.json.JsonException: Jackson exceptionat co.elastic.clients.json.jackson.JacksonUtils.convertException(JacksonUtils.java:39) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.jackson.JacksonJsonpMapper$JacksonValueParser.deserialize(JacksonJsonpMapper.java:142) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:77) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.JsonpMapperBase.deserialize(JsonpMapperBase.java:69) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.JsonpDeserializer$1.deserialize(JsonpDeserializer.java:108) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.NamedDeserializer.deserialize(NamedDeserializer.java:64) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.ObjectDeserializer$FieldObjectDeserializer.deserialize(ObjectDeserializer.java:78) ~[elasticsearch-java-8.13.0.jar:na]at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:192) ~[elasticsearch-java-8.13.0.jar:na]... 78 common frames omitted
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "skuId" (class com.tfq.vo.SearchResult), not marked as ignorable (7 known properties: "totalPages", "catalogVos", "brandVos", "products", "pageNum", "attrVos", "total"])at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 244] (through reference chain: com.tfq.vo.SearchResult["skuId"])at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61) ~[jackson-databind-2.17.0.jar:2.17.0]at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1153) ~[jackson-databind-2.17.0.jar:2.17.0]at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2241) ~[jackson-databind-2.17.0.jar:2.17.0]at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1793) ~[jackson-databind-2.17.0.jar:2.17.0]at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1771) ~[jackson-databind-2.17.0.jar:2.17.0]at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:316) ~[jackson-databind-2.17.0.jar:2.17.0]at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177) ~[jackson-databind-2.17.0.jar:2.17.0]at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342) ~[jackson-databind-2.17.0.jar:2.17.0]at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4881) ~[jackson-databind-2.17.0.jar:2.17.0]at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3104) ~[jackson-databind-2.17.0.jar:2.17.0]at co.elastic.clients.json.jackson.JacksonJsonpMapper$JacksonValueParser.deserialize(JacksonJsonpMapper.java:140) ~[elasticsearch-java-8.13.0.jar:na]... 84 common frames omitted2024-07-05 10:47:54.011  WARN 10708 --- [nio-7500-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [java.lang.RuntimeException: co.elastic.clients.transport.TransportException: node: http://127.0.0.1:9200/, status: 200, [es/search] Failed to decode response]

看第一个报错“status: 200, [es/search] Failed to decode response”在网上搜索是es请求设置Header有问题,搜了一圈发现设置了header并没有用。于是在仔细看第三个异常:

Error deserializing co.elastic.clients.elasticsearch.core.search.Hit: jakarta.json.JsonException: Jackson exception (JSON path: hits.hits[0]._source) 

发现是请求es返回的结果类没有使用jackson的Json注释导致不能序列化转json。在对应的返回类上添加注释:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;@Data
@JsonIgnoreProperties(ignoreUnknown=true)
public class SearchResult {/*** 查询的所有商品信息*/private List<SkuEsModel> products;/*** 当前页码*/private Integer pageNum;/*** 总记录数*/private Long total;
}

在service上发送请求即可获取对应es的索引product的查询数据。

public SearchResult search(SearchParam searchParam) {SearchResult result = null;ElasticsearchClient instance = elasticClient.getElasticsearchClient();//1.动态构建出查询需要的DSL语句//2.准备检索请求SearchRequest searchRequest = buildSearchRequest(searchParam);System.out.println("dsl:" + printDSL(searchRequest));//3.执行检索请求try {SearchResponse<SearchResult> response = instance.search(searchRequest, SearchResult.class);System.out.println("查询返回结果:"+response);//result = buildSearchResult();} catch(IOException e) {throw new RuntimeException(e);}//4.分析响应数据封装成我们需要的格式return result;
}/*** 准备检索请求* 1.模糊匹配,过滤(按照属性,分类,品牌,价格区间,库存),排序,分页,高亮,聚合分析** @return 检索请求*/private SearchRequest buildSearchRequest(SearchParam searchParam) {SearchRequest.Builder builder = new SearchRequest.Builder();builder.index(EsConstant.PRODUCT_INDEX);/*** 模糊匹配,过滤(按照属性,分类,品牌,价格区间,库存)*///1.1.bool - must查询BoolQuery.Builder boolQueryBuilder = QueryBuilders.bool();if(!StringUtils.isEmpty(searchParam.getKeyword())) {boolQueryBuilder.must(query -> query.match(f -> f.field("skuTitle").query(searchParam.getKeyword())));}//1.2.bool - filter - 按照三级分类id查询if(searchParam.getCatelog3Id() != null) {boolQueryBuilder.filter(query -> query.term(f -> f.field("catalogId").value(searchParam.getCatelog3Id().toString())));}builder.query(b -> b.bool(boolQueryBuilder.build()));//2.2.分页builder.from(((searchParam.getPageNum() - 1) * EsConstant.PRODUCT_PAGE_NUM));builder.size(EsConstant.PRODUCT_PAGE_NUM);return builder.build();
}

结合以上代码整合到对应系统即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/40420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WBCE CMS v1.5.2 远程命令执行漏洞(CVE-2022-25099)

前言 CVE-2022-25099 是一个影响 WBCE CMS v1.5.2 的严重安全漏洞&#xff0c;具体存在于 /languages/index.php 组件中。该漏洞允许攻击者通过上传精心构造的 PHP 文件在受影响的系统上执行任意代码。 技术细节 受影响组件&#xff1a;/languages/index.php受影响版本&…

如何在 Odoo 16 中向新视图添加字段

例如,让我们看看如何在新视图或新操作窗口中创建“many2one”字段。 请考虑下面的屏幕截图,它表示不包含任何字段的新视图类型或客户端操作窗口。 我们现在可以将与“res.partner”关联的“多对一”字段引入到我们的新视图或客户端操作窗口中。 为了实现这一点,在 XML 模板…

ShardingSphere

ShardingSphere 是一个开源的分布式数据库中间件生态系统&#xff0c;由 Apache 基金会孵化和维护。它的主要目标是帮助开发者解决分库分表、分布式事务和数据加密等分布式数据库应用中的常见问题。ShardingSphere 提供了多种组件&#xff0c;如 Sharding-JDBC、Sharding-Proxy…

Using a text embedding model locally with semantic kernel

题意&#xff1a;在本地使用带有语义核&#xff08;Semantic Kernel&#xff09;的文本嵌入模型 问题背景&#xff1a; Ive been reading Stephen Toubs blog post about building a simple console-based .NET chat application from the ground up with semantic-kernel. Im…

idea中maven全局配置

配置了就不需要每次创建项目都来设置maven仓库了。 1.先把项目全关了 2. 进入全局设置 3.设置maven的仓库就可以了

SpringBoot实现多数据源切换

1. 概述 随着项目规模的扩大和业务需求的复杂化&#xff0c;单一数据源已经不能满足实际开发中的需求。在许多情况下&#xff0c;我们需要同时操作多个数据库&#xff0c;或者需要将不同类型的数据存储在不同的数据库中。这时&#xff0c;多数据源场景成为必不可少的解决方案。…

【CentOS7.6】docker部署EMQX教程,本地镜像直接导入(附下载链接),没法在云服务器上魔法拉取镜像的快来

总览 先把下载链接放在这里吧&#xff0c;这是 EMQX 的 tar 包&#xff0c;能够直接导入 CentOS 的 docker&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rSGSLoVvj83ai6d5oolg8Q?pwd0108 提取码&#xff1a;0108 一、安装配置教程 1.将 EMQX-latest.tar 包导入…

服务器重装系统时数据丢失?有哪些方法可以避免

为了避免在服务器重装系统时数据丢失&#xff0c;可以采取以下预防措施&#xff1a; 1. 数据备份&#xff1a;在重装系统之前&#xff0c;备份所有重要的数据和配置文件。备份可以通过以下方式进行&#xff1a; - 使用外部存储设备(如USB硬盘、NAS等)进行备份。 - 利用备份软件…

学习成绩总是上不去?中学生把握好这5个环节,助你提高成绩

在中学时代&#xff0c;考试我们并不陌生。每隔一段时间&#xff0c;学校就会安排我们参加考试。学生时代&#xff0c;我们参加的考试有很多。对于中学生来说&#xff0c;考试成绩是我们一直关心的事情。很多学生非常努力的学习&#xff0c;成绩却上不去。这是非常可惜的&#…

[图解]企业应用架构模式2024新译本讲解19-数据映射器1

1 00:00:01,720 --> 00:00:03,950 下一个我们要讲的就是 2 00:00:04,660 --> 00:00:07,420 数据映射器这个模式 3 00:00:09,760 --> 00:00:13,420 这个也是在数据源模式里面 4 00:00:13,430 --> 00:00:14,820 用得最广泛的 5 00:00:16,250 --> 00:00:19,170…

【软件工程中的喷泉模型及其优缺点】

文章目录 一、喷泉模型是什么&#xff1f;二、喷泉模型的优点1. 灵活性和适应性2. 迭代开发3. 风险控制 三、喷泉模型的缺点1. 需求不明确性2. 可能造成资源浪费3. 需要良好的沟通与协作 一、喷泉模型是什么&#xff1f; 喷泉模型是一种迭代增量开发模型&#xff0c;其核心理念…

链篦机回转窑球团生产工艺

生球在回转窑氧化焙烧&#xff0c;回转窑头部设有燃烧器&#xff0c;燃料可以采用气体、固体、液体。 来自环冷机一冷却段的高温废气作为二次风进入窑内参与燃烧&#xff0c;烧成成品球进入环冷机。 环冷机采用鼓风冷却&#xff0c;热风风箱分为四段&#xff1a; 一段气体引至…

无人机有哪些关键技术?

一、控制技术 无人机的核心还是在控制上&#xff0c;飞控系统的可靠性、稳定性及可扩展性是其中重要的指标。可靠性上&#xff0c;除了器件选型之外&#xff0c;目前主要靠多余度来增加&#xff1b;稳定性主要体现在多场景下仍能保持良好的工作状态&#xff0c;主要靠算法来进…

QML-各类布局

Colunm布局 Column{id:colspacing: 30Repeater{id:repmodel: ListModel{}Button{width: 100height: 50text: "btn"index}}//开始时候移动move: Transition {NumberAnimation { properties: "x,y"; easing.type: Easing.OutBounce }}//添加时变化add:Transi…

【Nginx】docker运行Nginx及配置

Nginx镜像的获取 直接从Docker Hub拉取Nginx镜像通过Dockerfile构建Nginx镜像后拉取 二者区别 主要区别在于定制化程度和构建过程的控制&#xff1a; 直接拉取Nginx镜像&#xff1a; 简便性&#xff1a;直接使用docker pull nginx命令可以快速拉取官方的Nginx镜像。这个过程…

通透!手把教你如何从头构建一个机器学习模型

目录 1.业务理解 2.数据收集和准备 数据采集 探索性数据分析 (EDA) 和数据清理 特征选择 3.建立机器学习模型 选择正确的模型 分割数据 训练模型 模型评估 4.模型优化 5.部署模型 今天我将带领大家一步步的来构建一个机器学习模型。 我们将按照以下步骤开发客户流失…

赛博解压板

目录 开头程序程序的流程图程序的解压效果(暂无&#xff0c;但可以运行一下上面的代码)结尾 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们要看关于赛博解压板的一些东西。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #define ROW 6//ROW表示行数&#xff0c;可…

【ARM 常见汇编指令学习 7.1 -- LDRH 半字读取指令】

请阅读【嵌入式开发学习必备专栏】 文章目录 LDRH 使用介绍LDRH&#xff08;Load Register Half-word&#xff09;总结 LDRH 使用介绍 在ARMv9架构中&#xff0c;汇编指令LDRH用于从内存中载入数据到寄存器的指令&#xff0c;下面将分别对它进行详细介绍&#xff1a; LDRH&am…

【基础算法】UE中实现轮播

本期作者&#xff1a;尼克 易知微3D引擎技术负责人 当前N 总数M 从0到M-1 从1到M 感谢阅读&#xff0c;以上内容均由易知微3D引擎团队原创设计&#xff0c;以及易知微版权所有&#xff0c;转载请注明出处&#xff0c;违者必究&#xff0c;谢谢您的合作。申请转载授权后台回复【…

【WebKit屏幕方向API全解析】掌握现代Web应用的方向感应

标题&#xff1a;【WebKit屏幕方向API全解析】掌握现代Web应用的方向感应 WebKit作为许多现代浏览器的内核&#xff0c;提供了对HTML5和CSS3的广泛支持&#xff0c;包括对屏幕方向的控制。屏幕方向API&#xff08;Screen Orientation API&#xff09;允许Web应用知道屏幕的方向…