当前位置:首页 > 科技  > 软件

如何通过 REST API 和 Spring MVC 提取电视节目详细信息?

来源: 责编: 时间:2023-10-18 17:58:44 373观看
导读表述性状态传输 (REST)是一种架构风格,它定义了一组用于创建 Web 服务的约束。REST API 是一种无需任何处理即可简单灵活地访问 Web 服务的方式。Spring MVC是一个用于构建 Web 应用程序的 Web MVC 框架。它是一个与 s

oGE28资讯网——每日最新资讯28at.com

表述性状态传输 (REST)是一种架构风格,它定义了一组用于创建 Web 服务的约束。REST API 是一种无需任何处理即可简单灵活地访问 Web 服务的方式。oGE28资讯网——每日最新资讯28at.com

Spring MVC是一个用于构建 Web 应用程序的 Web MVC 框架。它是一个与 spring boot、spring-security 等相同的 spring 模块。术语 MVC 代表模型-视图-控制器架构。REST API 调用如今被广泛用于获取各种信息,例如天气、邮政编码、secret、大学详细信息等.oGE28资讯网——每日最新资讯28at.com

在本文中,让我们尝试通过以下方式获取电视连续剧详细信息oGE28资讯网——每日最新资讯28at.com

http://api.tvmaze.com/search/shows?q=<任何电视连续剧名称>

例子:

https://api.tvmaze.com/search/shows?q=mahabharata


oGE28资讯网——每日最新资讯28at.com

JSON 输出:

[    {        "score": 0.54483813,        "show": {            "id": 60856,            "url": "https://www.tvmaze.com/shows/60856/the-mahabharata",            "name": "The Mahabharata",            "type": "Scripted",            "language": "English",            "genres": [],            "status": "Ended",            "runtime": null,            "averageRuntime": null,            "premiered": "1990-03-10",            "ended": "1990-03-24",            "officialSite": null,            "schedule": {                "time": "",                "days": []            },            "rating": {                "average": null            },            "weight": 5,            "network": {                "id": 269,                "name": "Star Plus",                "country": {                    "name": "India",                    "code": "IN",                    "timezone": "Asia/Kolkata"                },                "officialSite": null            },            "webChannel": null,            "dvdCountry": null,            "externals": {                "tvrage": null,                "thetvdb": 213551,                "imdb": "tt0097810"            },            "image": {                "medium": "https://static.tvmaze.com/uploads/images/medium_portrait/398/996547.jpg",                "original": "https://static.tvmaze.com/uploads/images/original_untouched/398/996547.jpg"            },            "summary": null,            "updated": 1646508699,            "_links": {                "self": {                    "href": "https://api.tvmaze.com/shows/60856"                },                "previousepisode": {                    "href": "https://api.tvmaze.com/episodes/2289706"                }            }        }    },    {        "score": 0.40868765,        "show": {            "id": 5016,            "url": "https://www.tvmaze.com/shows/5016/mahabharat",            "name": "Mahabharat",            "type": "Scripted",            "language": "Hindi",            "genres": [                "Drama",                "History"            ],            "status": "Ended",            "runtime": 20,            "averageRuntime": 20,            "premiered": "2013-09-16",            "ended": "2014-08-16",            "officialSite": "http://www.hotstar.com/#!/mahabharat-435-s",            "schedule": {                "time": "20:30",                "days": [                    "Monday",                    "Tuesday",                    "Wednesday",                    "Thursday",                    "Friday",                    "Saturday",                    "Sunday"                ]            },            "rating": {                "average": null            },            "weight": 37,            "network": {                "id": 269,                "name": "Star Plus",                "country": {                    "name": "India",                    "code": "IN",                    "timezone": "Asia/Kolkata"                },                "officialSite": null            },            "webChannel": null,            "dvdCountry": null,            "externals": {                "tvrage": 46350,                "thetvdb": 273350,                "imdb": "tt3212600"            },            "image": {                "medium": "https://static.tvmaze.com/uploads/images/medium_portrait/21/54241.jpg",                "original": "https://static.tvmaze.com/uploads/images/original_untouched/21/54241.jpg"            },            "summary": "<p>The story of the throne of Hastinapura, the kingdom ruled by the Kuru clan. The two collateral branches of the family that participate in the struggle of the throne of Hastinapura are the Kaurava and the Pandava. Although the Kaurava is the senior branch of the family, Duryodhana, the eldest Kaurava, is younger than Yudhisthira, the eldest Pandava. Both Duryodhana and Yudhisthira claim to be first in line to inherit the throne. The struggle culminates in the great battle of Kurukshetra, in which the Pandavas are ultimately victorious. The battle produces complex conflicts of kinship and friendship, instances of family loyalty and duty taking precedence over what is right, as well as the converse.</p>",            "updated": 1604823863,            "_links": {                "self": {                    "href": "https://api.tvmaze.com/shows/5016"                },                "previousepisode": {                    "href": "https://api.tvmaze.com/episodes/314287"                }            }        }    },    {        "score": 0.38368216,        "show": {            "id": 16607,            "url": "https://www.tvmaze.com/shows/16607/mahabharat",            "name": "Mahabharat",            "type": "Scripted",            "language": "Hindi",            "genres": [                "Drama"            ],            "status": "Ended",            "runtime": 45,            "averageRuntime": 45,            "premiered": "1988-10-02",            "ended": "1990-07-15",            "officialSite": null,            "schedule": {                "time": "",                "days": [                    "Sunday"                ]            },            "rating": {                "average": null            },            "weight": 24,            "network": {                "id": 1093,                "name": "DD National",                "country": {                    "name": "India",                    "code": "IN",                    "timezone": "Asia/Kolkata"                },                "officialSite": null            },            "webChannel": null,            "dvdCountry": null,            "externals": {                "tvrage": null,                "thetvdb": 84349,                "imdb": "tt0158417"            },            "image": {                "medium": "https://static.tvmaze.com/uploads/images/medium_portrait/55/138442.jpg",                "original": "https://static.tvmaze.com/uploads/images/original_untouched/55/138442.jpg"            },            "summary": "<p><b>Mahabharat</b> is a successful Indian television series based on the ancient Indian epic Mahabharata. The 94-episode series originally ran from 1988 to 1990. It was produced by B. R. Chopra and directed by his son, Ravi Chopra.</p>",            "updated": 1573325769,            "_links": {                "self": {                    "href": "https://api.tvmaze.com/shows/16607"                },                "previousepisode": {                    "href": "https://api.tvmaze.com/episodes/762035"                }            }        }    }]


oGE28资讯网——每日最新资讯28at.com

使用Spring框架,让我们尝试提取REST API并将其呈现在页面上。oGE28资讯网——每日最新资讯28at.com

项目结构:

oGE28资讯网——每日最新资讯28at.com

pom.xml%20编写:


oGE28资讯网——每日最新资讯28at.com

<project%20xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0%20 http://maven.apache.org/maven-v4_0_0.xsd">%20 <modelVersion>4.0.0</modelVersion>%20 <groupId>com.TVShow.TVShow_Rest_API</groupId>%20 <artifactId>TVShow_Rest_API</artifactId>%20 <packaging>war</packaging>%20 <version>0.0.1-SNAPSHOT</version>%20 <name>TVShow</name>%20 <url>http://maven.apache.org</url>%20 <properties>%20 <failOnMissingWebXml>false</failOnMissingWebXml>%20 <spring-version>5.1.0.RELEASE</spring-version>%20 </properties>%20 <dependencies>%20 <!--%20https://mvnrepository.com/artifact/org.springframework/spring-webmvc%20--> <dependency>%20 <groupId>org.springframework</groupId>%20 <artifactId>spring-webmvc</artifactId>%20 <version>${spring-version}</version>%20 </dependency>%20 <!--%20Required%20for%20spring-test%20--> <dependency>%20 <groupId>org.springframework</groupId>%20 <artifactId>spring-test</artifactId>%20 <version>${spring-version}</version>%20 </dependency>%20 <!--%20JSTL%20Dependency%20--> <dependency>%20 <groupId>javax.servlet.jsp.jstl</groupId>%20 <artifactId>javax.servlet.jsp.jstl-api</artifactId>%20 <version>1.2.1</version>%20 </dependency>%20 <dependency>%20 <groupId>taglibs</groupId>%20 <artifactId>standard</artifactId>%20 <version>1.1.2</version>%20 </dependency>%20 <!--%20Servlet%20Dependency%20--> <dependency>%20 <groupId>javax.servlet</groupId>%20 <artifactId>javax.servlet-api</artifactId>%20 <version>3.1.0</version>%20 <scope>provided</scope>%20 </dependency>%20 <!--%20JSP%20Dependency%20--> <dependency>%20 <groupId>javax.servlet.jsp</groupId>%20 <artifactId>javax.servlet.jsp-api</artifactId>%20 <version>2.3.1</version>%20 <scope>provided</scope>%20 </dependency>%20 <!--%20As%20REST%20API%20is%20extracted,%20this%20is%20required%20--> <dependency>%20 <groupId>com.google.code.gson</groupId>%20 <artifactId>gson</artifactId>%20 <version>2.8.6</version>%20 </dependency>%20 <dependency>%20 <groupId>commons-io</groupId>%20 <artifactId>commons-io</artifactId>%20 <version>2.5</version>%20 </dependency>%20 <dependency>%20 <groupId>junit</groupId>%20 <artifactId>junit</artifactId>%20 <version>4.12</version>%20 <scope>test</scope>%20 </dependency>%20 </dependencies>%20 <build>%20 <finalName>TVShow</finalName>%20 <sourceDirectory>src/main/java</sourceDirectory>%20 <plugins>%20 <plugin>%20 <artifactId>maven-compiler-plugin</artifactId>%20 <version>3.5.1</version>%20 <configuration>%20 <source>1.8</source>%20 <target>1.8</target>%20 </configuration>%20 </plugin>%20 <plugin>%20<groupId>org.apache.maven.plugins</groupId>%20<artifactId>maven-war-plugin</artifactId>%20<version>3.3.2</version>%20</plugin>%20 <plugin>%20 <groupId>org.codehaus.mojo</groupId>%20 <artifactId>tomcat-maven-plugin</artifactId>%20 <version>1.0-beta-1</version>%20 </plugin>%20 </plugins>%20 </build>%20</project>

 index.jsp%20编写:

这是项目部署到tomcat时渲染的页面oGE28资讯网——每日最新资讯28at.com

<!DOCTYPE%20html>%20<html%20lang="en">%20<head>%20 <meta%20charset="utf-8">%20 <meta%20http-equiv="X-UA-Compatible"%20content="IE=edge">%20 <meta%20name="viewport"%20content="width=device-width,%20initial-scale=1">%20 <title>TVShow</title>%20 <link%20rel="stylesheet"%20href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">%20 <script%20src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>%20 <script%20src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>%20 //%20for%20making%20the%20page%20styles%20are%20applied%20 <style%20type="text/css">%20 .main-form,%20.profile-area%20{%20 width:%20500px;%20 }%20 .main-form%20{%20 margin:%2050px%20auto%200px;%20 }%20 .profile-area%20{%20 margin:%2010px%20auto;%20 }%20 .main-form%20section,%20.profile-area%20section%20{%20 margin-bottom:%2015px;%20 background:%20#097969;%20 box-shadow:%200px%202px%202px%20rgba(0,%200,%200,%200.3);%20 color:%20white;%20 }%20 .main-form%20section%20{%20 padding:%2030px;%20 }%20 .profile-area%20section%20{%20 padding:%2030px%2030px%2030px;%20 }%20 .profile-area%20section%20>%20div%20{%20 text-align:%20center;%20 }%20 .main-form%20h3%20{%20 margin:%200%200%2015px;%20 }%20 .form-control,%20.btn%20{%20 min-height:%2038px;%20 border-radius:%202px;%20 }%20 .btn%20{%20 font-size:%2015px;%20 font-weight:%20bold;%20 }%20 .hideElement%20{%20 display:%20none;%20 }%20 </style>%20</head>%20<body>%20<div%20class="main-form"%20id="main-form">%20 <section>%20 <div%20class="form-group">%20 //%20We%20need%20to%20input%20the%20search%20string%20in%20this%20box%20 <input%20id="searchStr"%20type="text"%20class="form-control"%20placeholder="Enter%20TVShow%20name%20here..."%20required="required">%20 </div>%20 <div%20class="form-group">%20 <button%20onclick="loadData()"%20class="btn%20btn-primary%20btn-block">Find%20TVShow%20Details</button>%20 </div>%20 </section>%20</div>%20<div%20class="profile-area%20hideElement"%20id="profile-area">%20 <section>%20 <div%20id="loader"%20class="hideElement">%20 <div%20class="spinner-border"%20role="status">%20 <span%20class="sr-only">Loading...</span>%20 </div>%20 </div>%20 <div%20id="profile"%20class="hideElement">%20 <br><br>%20 //%20parsed%20json%20object%20details%20are%20displayed%20here%20 <p><strong>TVShowScore%20:%20</strong><span%20id="scores"></span></p>%20 <p><strong>TVShow%20URL%20:%20</strong><span%20id="url"></span></p>%20 <p><strong>IMDB%20:%20</strong><span%20id="imdb"></span></p>%20 </div>%20 </section>%20</div>%20</body>%20<script>%20 function%20loadData()%20{%20 document.getElementById("profile-area").classList.remove("hideElement");%20 document.getElementById("loader").classList.remove("hideElement");%20 document.getElementById("profile").classList.add("hideElement");%20 var%20searchStr%20=%20document.getElementById("searchStr").value;%20 if(searchStr%20!=%20""%20&&%20searchStr%20!=%20null%20)%20{%20 var%20xhttp%20=%20new%20XMLHttpRequest();%20 xhttp.onreadystatechange%20=%20function()%20{%20 if%20(this.readyState%20==%204%20&&%20this.status%20==%20200)%20{%20 var%20jsonResponse%20=%20JSON.parse(this.responseText);%20 document.getElementById("scores").innerHTML%20=%20jsonResponse.scores;%20 document.getElementById("url").innerHTML%20=%20jsonResponse.url;%20 document.getElementById("imdb").innerHTML%20=%20jsonResponse.imdb;%20 document.getElementById("loader").classList.add("hideElement");%20 document.getElementById("profile").classList.remove("hideElement");%20 }%20 };%20 //%20GET%20method%20which%20redirects%20the%20jsp%20to%20connect%20to%20 //%20the%20servlet%20with%20the%20search%20string%20 xhttp.open("GET",%20"getTVShowDetailsBySearchString?searchStr="+%20searchStr,%20true);%20 xhttp.send();%20 console.log("done");%20 }%20else%20{%20 console.log("Enter%20search%20string%20to%20check...")%20 }%20 }%20</script>%20</html>-----------------------------------©著作权归作者所有:来自51CTO博客作者demo007x的原创作品,请联系作者获取转载授权,否则将追究法律责任如何通过%20REST%20API%20和%20Spring%20MVC%20提取电视节目详细信息?https://blog.51cto.com/demo007x/7917153

输出:

oGE28资讯网——每日最新资讯28at.com

在输入框中输入任何电视节目名称后,我们将获得以下详细信息。oGE28资讯网——每日最新资讯28at.com

执行过程:

从 JSP 页面,使用搜索字符串调用“GET”方法,并将其重定向到 Spring Controller 类,其中 REST API URL http://api.tvmaze.com/search/shows?q= 被调用,它将创建上面给出的 JSON 数组,从中,我们使用下面的参数:oGE28资讯网——每日最新资讯28at.com


oGE28资讯网——每日最新资讯28at.com

"score", "url" and "imdb" values aloneExample:"score": 0.42338097,    "url": "https://www.tvmaze.com/shows/16607/mahabharat",      "imdb": "tt0158417"

实际上,在这个页面上,我们只检索了 TVShowScore、TVShow URL 和 IMDB。但我们可以获取 JSON 中提供的所有其他详细信息。检索数据和解析 JSON 输出所需的代码如下。实现流程的重要必要文件oGE28资讯网——每日最新资讯28at.com

AppConfig.java 编写:

import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; @Configuration@EnableWebMvc@ComponentScan(basePackages = { "com.TVShow.TVShow_Rest_API" }) public class AppConfig { 	@Bean	public InternalResourceViewResolver resolver() { 		InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 		resolver.setViewClass(JstlView.class); 		resolver.setPrefix("/"); 		resolver.setSuffix(".jsp"); 		return resolver; 	} }

SpringMvcDispatcherServletInitializer.java:

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class SpringMvcDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 	@Override	protected Class<?>[] getRootConfigClasses() { 		return null; 	} 	@Override	protected Class<?>[] getServletConfigClasses() { 		return new Class[] { AppConfig.class }; 	} 	@Override	protected String[] getServletMappings() { 		return new String[] { "/" }; 	} }

TVShowController.java:

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.HttpURLConnection; import java.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.StringTokenizer; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @Controllerpublic class TVShowController { 	@RequestMapping("/getTVShowDetailsBySearchString") 	public @ResponseBody	JsonObject getTVShowDetailsBySearchString(String searchStr) throws IOException { 		// According to the search string, JSONArray 		// or JSON Object is constructed. 		// In our case, it is producing JSONArray 		JsonArray jsonArray = new JsonArray(); 		jsonArray = getTVShowDetailsBySearchStr(searchStr); 		JsonObject finalJsonObject = new JsonObject(); 		ArrayList scoreList = new ArrayList(); 		ArrayList showUrlList = new ArrayList(); 		ArrayList showUrlLinks = new ArrayList(); 		ArrayList telecastedList = new ArrayList(); 		ArrayList imdbList = new ArrayList(); 		Iterator<JsonElement> objectIterator = jsonArray.iterator(); 		// Iterating 		while(objectIterator.hasNext()) { 			JsonElement object = objectIterator.next(); 			JsonObject jObj = object.getAsJsonObject(); 			// We have to get the score and 			// replace the special characters 			scoreList.add(jObj.get("score").toString().replaceAll("^/"|/"$", "")); 			// Similarly show 			showUrlList.add(jObj.get("show").toString().replaceAll("^/"|/"$", "")); 		} 				for (int i = 0;i < showUrlList.size();i++) {		 						StringTokenizer jsonTokenizer = new StringTokenizer(showUrlList.get(i).toString(),","); 			String expectedTag = null; 			int idx = 0; 			while (jsonTokenizer.hasMoreTokens()) { 				expectedTag = jsonTokenizer.nextToken(); 				if (expectedTag.contains("url")) { 					showUrlLinks.add(expectedTag.substring(7,expectedTag.length()-1).toString()); 				} 				if (expectedTag.contains("timezone")) { 					telecastedList.add(expectedTag.substring(12,expectedTag.length()-3).toString()); 				} 				if (expectedTag.contains("imdb")) { 					imdbList.add(expectedTag.substring(8,expectedTag.length()-2).toString()); 				} 		} 	} 		finalJsonObject.addProperty("scores", scoreList.toString()); 		finalJsonObject.addProperty("scoresize", scoreList.size()); 		finalJsonObject.addProperty("url", showUrlLinks.toString()); 		finalJsonObject.addProperty("urlsize", showUrlLinks.size()); 		finalJsonObject.addProperty("timezone", telecastedList.toString()); 		finalJsonObject.addProperty("imdb", imdbList.toString()); 		finalJsonObject.addProperty("imdbsize", imdbList.size()); 		// After retrieving the elements, 		// in an object , all are constructed 		return finalJsonObject; 	} 	private JsonArray getTVShowDetailsBySearchStr(String searchString) throws IOException { 		StringBuilder responseData = new StringBuilder(); 		JsonArray jsonArray = null; 		URL url = null; 		// http://api.tvmaze.com/search/shows?q=<searchstring> 		// is the url to access the TV show details 		url = new URL("http://api.tvmaze.com/search/shows?q=" + searchString); 				HttpURLConnection con = (HttpURLConnection) url.openConnection(); 		con.setRequestMethod("GET"); 		con.setRequestProperty("User-Agent", "Mozilla/5.0"); 		int responseCode = con.getResponseCode(); 		System.out.println("/nSending 'GET' request to URL : " + url); 		// System.out.println("Response Code : " + responseCode); 		try (BufferedReader in = new BufferedReader( 				new InputStreamReader(con.getInputStream()))) { 			String line; 			while ((line = in.readLine()) != null) { 				responseData.append(line); 			} 			// It is getting converted to 			// JSONArray by means of below code 			jsonArray = new Gson().fromJson(responseData.toString(), JsonArray.class);	 		} 		return jsonArray; 	} }-----------------------------------©著作权归作者所有:来自51CTO博客作者demo007x的原创作品,请联系作者获取转载授权,否则将追究法律责任如何通过 REST API 和 Spring MVC 提取电视节目详细信息?https://blog.51cto.com/demo007x/7917153

结论

通过使用 Spring-webmvc,我们可以从 REST API 调用中获取详细信息。上面就是一个很好的例子。同样,有很多开源 REST API 调用可供使用。这意味着我们可以使用它们来检索数据。开源 REST API 调用的几个示例。oGE28资讯网——每日最新资讯28at.com

oGE28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-14001-0.html如何通过 REST API 和 Spring MVC 提取电视节目详细信息?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 如何在 TypeScript 中使用类和继承

下一篇: Python并发编程:多线程技术详解

标签:
  • 热门焦点
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • 一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    7月14日消息,今日一名博主在社交媒体发布了一张疑似小米汽车电池信息的照片,显示该电池包正是宁德时代麒麟电池,容量为101kWh,电压为726.7V,可以预测小
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top