Spring – REST XML 响应
REST API 的受欢迎程度与日俱增,因为它以方便的方式实现了应用程序的架构。 REST API 是“代表性状态转移”的首字母缩写词。它也称为 RESTful Web 服务。它也是一个“控制器”,但不同的是,Rest Controller 返回数据,而控制器返回“模型-视图-控制器”架构的视图。 REST API 可以用于所有 HTTP 方法,例如(GET、POST、PUT、PATCH、DELETE 等)。这些方法分别对应于创建、读取、更新和删除 (CRUD) 操作。它可以返回多种类型的数据。 JSON 被认为是 Web 应用程序之间数据传输的标准格式。
REST API 可以返回的数据类型如下:
- JSON(JavaScript 对象表示法)
- XML
- HTML
- XLT
- Python
- PHP
- 纯文本
Pre-requisite: Though JSON is the standard form to transfer data among applications, it comes with some disadvantages which are overcome in XML format data transferring.
XML 的优点如下:
- 它是一种使用标签进行数据定义的可扩展标记语言。
- 它支持命名空间。
- 它支持评论。
- 它支持各种编码。
- 最后但同样重要的是,XML 比 JSON 更安全。
注意:
- 由于浏览器中没有 JSON 解析器,JSON 的安全性较低。
- JSONP 很危险,因为它允许跨域交换数据。
REST API – XML 响应
- 当我们创建一个具有“Starter Web”依赖项的 Spring Boot 项目时,我们只能在 Jackson 库的帮助下获得以 JSON 格式返回数据的支持。
- 要嵌入对以 XML 格式返回数据的支持,我们需要第三方依赖项。
- 有许多库支持 XML 返回格式,例如——Jackson、JAXB 等。
方式1:使用杰克逊
Jackson 库已经存在于我们应用程序的 Spring 框架的类路径中。我们只需要向 Jackson 库添加一个可以处理 XML 数据响应的扩展。要添加扩展,请在项目构建中添加以下依赖项。
Maven – pom.xml
com.fasterxml.jackson.dataformat
jackson-dataformat-xml
添加上述依赖项并更新项目后,Jackson XML 扩展将被添加到类路径中,因此 Spring MVC 将自动为 XML 响应选择它。
A. 文件: pom.xml(项目配置)
例子:
XML
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.6.3
sia
GFG-RestXMLResponse
0.0.1-SNAPSHOT
GFG-RestXMLResponse
GeeksforGeeks
11
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
com.fasterxml.jackson.dataformat
jackson-dataformat-xml
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
org.projectlombok
lombok
Java
// Java Program to Illustrate Bootstrapping of Application
package gfg;
// Importing required classes
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// Annotation
@SpringBootApplication
// Class
public class GfgRestXmlResponseApplication {
// Main driver method
public static void main(String[] args)
{
SpringApplication.run(
GfgRestXmlResponseApplication.class, args);
}
}
Java
// Java Program Illustrating Object to be return as XML
// response
package gfg;
// Importing required classes
import lombok.Data;
// Annotation
@Data
// Class
public class EntityModel {
// Class data members
String ID;
String NAME;
String DOB;
String PINCODE;
}
Java
// Java Program Illustrating REST API returning XML response
package gfg;
// Importing required classes
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
// Annotations
@RestController
@RequestMapping(path = "/xml-output",
produces = "application/xml")
// Class
public class RestXMLResponseController {
@GetMapping("/get")
public ResponseEntity get()
{
EntityModel model = new EntityModel();
model.setID("1");
model.setNAME("Darshan.G.Pawar");
model.setDOB("05-09-2001");
model.setPINCODE("422 009");
HttpHeaders hearders = new HttpHeaders();
ResponseEntity entityModel
= new ResponseEntity<>(model, hearders,
HttpStatus.CREATED);
return entityModel;
}
// Annotation
@GetMapping("/get/{id}")
// Class
public ResponseEntity
getById(@PathVariable("id") String id)
{
EntityModel model = new EntityModel();
model.setID(id);
model.setNAME("Darshan.G.Pawar");
model.setDOB("05-09-2001");
model.setPINCODE("422 009");
HttpHeaders hearders = new HttpHeaders();
ResponseEntity entityModel
= new ResponseEntity<>(model, hearders,
HttpStatus.CREATED);
return entityModel;
}
}
Java
// Java Program Illustrating Getting REST API Response
package gfg;
// Importing required classes
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
// Class
public class ConsumeXMLResponse {
RestTemplate rest = new RestTemplate();
public ResponseEntity get(String id) {
return rest.getForEntity("http://localhost:8080/xml-output/get/{id}",
EntityModel.class, id);
}
}
Java
// Java Program to Illustrate Regular controller
package gfg;
// Importing required classes
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
// Annotation
@Controller
@RequestMapping("View")
// Class
public class OutputController {
// Annotation
@GetMapping("/get/{id}")
public String
getXMLOutput(@PathVariable("id") String id, Model model)
{
ConsumeXMLResponse response
= new ConsumeXMLResponse();
ResponseEntity responseEntity
= response.get(id);
EntityModel entity = responseEntity.getBody();
HttpHeaders headers = responseEntity.getHeaders();
model.addAttribute("xml", entity);
model.addAttribute("XMLheaders", headers);
return "View";
}
}
HTML
GeeksforGeeks
Hello Geek : REST XML Response
Id :
Replaceable text
Name :
Replaceable text
Date Of Birth :
Replaceable text
Pincode :
Replaceable text
Headers :
Java
package gfg;
import javax.xml.bind.annotation.XmlRootElement;
import lombok.Data;
@XmlRootElement
@Data
public class EntityModel {
String ID;
String NAME;
String DOB;
String PINCODE;
}
B.应用程序的引导
示例: GfgRestXmlResponseApplication。Java
Java
// Java Program to Illustrate Bootstrapping of Application
package gfg;
// Importing required classes
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// Annotation
@SpringBootApplication
// Class
public class GfgRestXmlResponseApplication {
// Main driver method
public static void main(String[] args)
{
SpringApplication.run(
GfgRestXmlResponseApplication.class, args);
}
}
C.作为 XML 响应返回的对象 (Java)
此类充当用户对象( bean ),其字段将分别映射到 XML 标记。它还需要使用“Lombok”库的“@Data”注释自动生成的 Getter/Setter 方法。要将 Lombok 库嵌入到项目中,请在项目构建中添加以下依赖项。
Maven – pom.xml
org.projectlombok
lombok
true
例子:
Java
// Java Program Illustrating Object to be return as XML
// response
package gfg;
// Importing required classes
import lombok.Data;
// Annotation
@Data
// Class
public class EntityModel {
// Class data members
String ID;
String NAME;
String DOB;
String PINCODE;
}
D. REST API 返回 XML 响应 (Java)
此 REST API 控制器配置为使用 @RequestMapping 注释的产生属性专门以 XML 格式返回数据。
例子:
Java
// Java Program Illustrating REST API returning XML response
package gfg;
// Importing required classes
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
// Annotations
@RestController
@RequestMapping(path = "/xml-output",
produces = "application/xml")
// Class
public class RestXMLResponseController {
@GetMapping("/get")
public ResponseEntity get()
{
EntityModel model = new EntityModel();
model.setID("1");
model.setNAME("Darshan.G.Pawar");
model.setDOB("05-09-2001");
model.setPINCODE("422 009");
HttpHeaders hearders = new HttpHeaders();
ResponseEntity entityModel
= new ResponseEntity<>(model, hearders,
HttpStatus.CREATED);
return entityModel;
}
// Annotation
@GetMapping("/get/{id}")
// Class
public ResponseEntity
getById(@PathVariable("id") String id)
{
EntityModel model = new EntityModel();
model.setID(id);
model.setNAME("Darshan.G.Pawar");
model.setDOB("05-09-2001");
model.setPINCODE("422 009");
HttpHeaders hearders = new HttpHeaders();
ResponseEntity entityModel
= new ResponseEntity<>(model, hearders,
HttpStatus.CREATED);
return entityModel;
}
}
输出 1:
输出 2:
E.消费XML响应。 Java (获取 REST API 响应)
- REST API 以 XML 格式返回的数据需要被消费和使用。
- Spring Framework 借助 Spring 的“RestTemplate”提供了一种使用 REST 响应的便捷方式。
- 它通过避免编写样板代码使我们受益。
- RestTemplate 为我们提供了特定于 HTTP 方法的方法。
- 这里对于 GET HTTP 请求,使用 'getForEntity()' 方法接受 URL 到 @GetMapping 方法,响应将被映射到的类和 URL 的附加对象参数。
- 此方法将返回一个 ResponseEntity<> 对象。
Java
// Java Program Illustrating Getting REST API Response
package gfg;
// Importing required classes
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
// Class
public class ConsumeXMLResponse {
RestTemplate rest = new RestTemplate();
public ResponseEntity get(String id) {
return rest.getForEntity("http://localhost:8080/xml-output/get/{id}",
EntityModel.class, id);
}
}
F.文件:OutputController。 Java (常规控制器)
此 MVC 控制器使用上述类来获取 REST API 返回的 XML 响应。此外,在获取数据后,它会返回一个修改后的视图(View.html)
例子:
Java
// Java Program to Illustrate Regular controller
package gfg;
// Importing required classes
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
// Annotation
@Controller
@RequestMapping("View")
// Class
public class OutputController {
// Annotation
@GetMapping("/get/{id}")
public String
getXMLOutput(@PathVariable("id") String id, Model model)
{
ConsumeXMLResponse response
= new ConsumeXMLResponse();
ResponseEntity responseEntity
= response.get(id);
EntityModel entity = responseEntity.getBody();
HttpHeaders headers = responseEntity.getHeaders();
model.addAttribute("xml", entity);
model.addAttribute("XMLheaders", headers);
return "View";
}
}
G.文件:View.html(显示 XML 响应)
HTML
GeeksforGeeks
Hello Geek : REST XML Response
Id :
Replaceable text
Name :
Replaceable text
Date Of Birth :
Replaceable text
Pincode :
Replaceable text
Headers :
输出:
方式2:使用JAXB
要使用 JAXB 库,请在构建的项目中添加以下依赖项。
文件: Maven – pom.xml
org.codehaus.mojo
jaxb2-maven-plugin
2.5.0
要使其工作,您必须在将映射到 XML 响应的对象上使用同一库的 @XmlRootElement 注释。
示例:实体模型。Java
Java
package gfg;
import javax.xml.bind.annotation.XmlRootElement;
import lombok.Data;
@XmlRootElement
@Data
public class EntityModel {
String ID;
String NAME;
String DOB;
String PINCODE;
}
注意:您还可以使用 Jersey 依赖项来开发 RESTful API。使用它的主要优点是它已经有一个最终使用 JAXB 库的 JAX-RS 库。