如何通過 REST API 和 Spring MVC 提取電視節(jié)目詳細(xì)信息?
表述性狀態(tài)傳輸 (REST)是一種架構(gòu)風(fēng)格,它定義了一組用于創(chuàng)建 Web 服務(wù)的約束。REST API 是一種無需任何處理即可簡單靈活地訪問 Web 服務(wù)的方式。
Spring MVC是一個用于構(gòu)建 Web 應(yīng)用程序的 Web MVC 框架。它是一個與 spring boot、spring-security 等相同的 spring 模塊。術(shù)語 MVC 代表模型-視圖-控制器架構(gòu)。REST API 調(diào)用如今被廣泛用于獲取各種信息,例如天氣、郵政編碼、secret、大學(xué)詳細(xì)信息等.
在本文中,讓我們嘗試通過以下方式獲取電視連續(xù)劇詳細(xì)信息。
http://api.tvmaze.com/search/shows?q=<任何電視連續(xù)劇名稱>
例子:
https://api.tvmaze.com/search/shows?q=mahabharata
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"
}
}
}
}
]
使用Spring框架,讓我們嘗試提取REST API并將其呈現(xiàn)在頁面上。
項目結(jié)構(gòu):
pom.xml 編寫:
<project xmlns="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
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.TVShow.TVShow_Rest_API</groupId>
<artifactId>TVShow_Rest_API</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>TVShow</name>
<url>http://maven.apache.org</url>
<properties>
<failOnMissingWebXml>false</failOnMissingWebXml>
<spring-version>5.1.0.RELEASE</spring-version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- Required for spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- JSTL Dependency -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl-api</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- Servlet Dependency -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- JSP Dependency -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
<!-- As REST API is extracted, this is required -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>TVShow</finalName>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.0-beta-1</version>
</plugin>
</plugins>
</build>
</project>
index.jsp 編寫:
這是項目部署到tomcat時渲染的頁面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>TVShow</title>
<link rel="stylesheet" >
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>
// for making the page styles are applied
<style type="text/css">
.main-form, .profile-area {
width: 500px;
}
.main-form {
margin: 50px auto 0px;
}
.profile-area {
margin: 10px auto;
}
.main-form section, .profile-area section {
margin-bottom: 15px;
background: #097969;
box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
color: white;
}
.main-form section {
padding: 30px;
}
.profile-area section {
padding: 30px 30px 30px;
}
.profile-area section > div {
text-align: center;
}
.main-form h3 {
margin: 0 0 15px;
}
.form-control, .btn {
min-height: 38px;
border-radius: 2px;
}
.btn {
font-size: 15px;
font-weight: bold;
}
.hideElement {
display: none;
}
</style>
</head>
<body>
<div class="main-form" id="main-form">
<section>
<div class="form-group">
// We need to input the search string in this box
<input id="searchStr" type="text" class="form-control" placeholder="Enter TVShow name here..." required="required">
</div>
<div class="form-group">
<button onclick="loadData()" class="btn btn-primary btn-block">Find TVShow Details</button>
</div>
</section>
</div>
<div class="profile-area hideElement" id="profile-area">
<section>
<div id="loader" class="hideElement">
<div class="spinner-border" role="status">
<span class="sr-only">Loading...</span>
</div>
</div>
<div id="profile" class="hideElement">
<br><br>
// parsed json object details are displayed here
<p><strong>TVShowScore : </strong><span id="scores"></span></p>
<p><strong>TVShow URL : </strong><span id="url"></span></p>
<p><strong>IMDB : </strong><span id="imdb"></span></p>
</div>
</section>
</div>
</body>
<script>
function loadData() {
document.getElementById("profile-area").classList.remove("hideElement");
document.getElementById("loader").classList.remove("hideElement");
document.getElementById("profile").classList.add("hideElement");
var searchStr = document.getElementById("searchStr").value;
if(searchStr != "" && searchStr != null ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var jsonResponse = JSON.parse(this.responseText);
document.getElementById("scores").innerHTML = jsonResponse.scores;
document.getElementById("url").innerHTML = jsonResponse.url;
document.getElementById("imdb").innerHTML = jsonResponse.imdb;
document.getElementById("loader").classList.add("hideElement");
document.getElementById("profile").classList.remove("hideElement");
}
};
// GET method which redirects the jsp to connect to
// the servlet with the search string
xhttp.open("GET", "getTVShowDetailsBySearchString?searchStr="+ searchStr, true);
xhttp.send();
console.log("done");
} else {
console.log("Enter search string to check...")
}
}
</script>
</html>
-----------------------------------
?著作權(quán)歸作者所有:來自51CTO博客作者demo007x的原創(chuàng)作品,請聯(lián)系作者獲取轉(zhuǎn)載授權(quán),否則將追究法律責(zé)任
如何通過 REST API 和 Spring MVC 提取電視節(jié)目詳細(xì)信息?
https://blog.51cto.com/demo007x/7917153
輸出:
在輸入框中輸入任何電視節(jié)目名稱后,我們將獲得以下詳細(xì)信息。
執(zhí)行過程:
從 JSP 頁面,使用搜索字符串調(diào)用“GET”方法,并將其重定向到 Spring Controller 類,其中 REST API URL http://api.tvmaze.com/search/shows?q= 被調(diào)用,它將創(chuàng)建上面給出的 JSON 數(shù)組,從中,我們使用下面的參數(shù):
"score", "url" and "imdb" values alone
Example:
"score": 0.42338097,
"url": "https://www.tvmaze.com/shows/16607/mahabharat",
"imdb": "tt0158417"
實際上,在這個頁面上,我們只檢索了 TVShowScore、TVShow URL 和 IMDB。但我們可以獲取 JSON 中提供的所有其他詳細(xì)信息。檢索數(shù)據(jù)和解析 JSON 輸出所需的代碼如下。實現(xiàn)流程的重要必要文件
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.net.HttpURLConnection;
import java.net.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;
@Controller
public 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;
}
}
-----------------------------------
?著作權(quán)歸作者所有:來自51CTO博客作者demo007x的原創(chuàng)作品,請聯(lián)系作者獲取轉(zhuǎn)載授權(quán),否則將追究法律責(zé)任
如何通過 REST API 和 Spring MVC 提取電視節(jié)目詳細(xì)信息?
https://blog.51cto.com/demo007x/7917153
結(jié)論
通過使用 Spring-webmvc,我們可以從 REST API 調(diào)用中獲取詳細(xì)信息。上面就是一個很好的例子。同樣,有很多開源 REST API 調(diào)用可供使用。這意味著我們可以使用它們來檢索數(shù)據(jù)。開源 REST API 調(diào)用的幾個示例。