本教程提供了有关如何使用Spring Boot构建Restfull Web服务的分步指南。
先决条件:
- Eclipse IDE(最新版本)
- Maven的4
- Java 1.8
1.创建Maven Web项目
打开eclipse,然后创建一个新的Maven Web项目,并将其命名为SpringBootRest。
生成的项目的结构如下所示:
2. pom.xml
创建Web项目之后,第一步是在pom.xml内配置Spring Boot ,因此我们将以下内容添加为父依赖项:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.10.RELEASE</version>
</parent>
Spring Boot公开了一个名为spring-boot-starter-web的启动程序依赖项,该依赖项会自动导入开发和公开REST控制器所需的所有必需jar。 因此,我们将其添加为依赖项:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
在本教程中,我们使用Spring Boot提供的嵌入式tomcat,因此我们将包装属性设置为jar,从而将应用程序构建为可运行的jar文件:
<packaging>jar</packaging>
PS:如果要使用外部tomcat,请参阅“在外部tomcat上部署Spring Boot应用程序” 。
最后的配置步骤是添加Spring Boot插件:
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
从字面上看,这就是我们开始开发REST控制器所需要的。
以下是Spring Boot自动导入的jar:
这是整个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.programmer.gate</groupId><artifactId>SpringBootRest</artifactId><packaging>jar</packaging><version>0.0.1-SNAPSHOT</version><name>SpringBootRest</name><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.10.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
3. Application.java
第二步是创建Spring Boot初始化器类,这是我们应用程序的入口。 用@SpringBootApplication注释类等效于在传统的Spring应用程序中使用@Configuration,@EnableAutoConfiguration和@ComponentScan及其默认属性。
package com.programmer.gate;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application{public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
PS:默认情况下,servlet容器会自动扫描在初始化程序的同一程序包中定义的REST控制器,该程序包外部定义的任何控制器都将被忽略。
4.实施REST资源
我们将实现一个非常基本的支付API,向客户收取购买商品的费用。
感谢jackson库,我们的API仅接受JSON请求并以JSON响应进行响应,这使我们能够将请求和响应作为POJO类处理,而不必担心JSON / POJO转换。
以下是客户应在每个付款请求上提交的付款请求类别:
package com.programmer.gate;public class PaymentRequest {private int userId;private String itemId;private double discount;public String getItemId() {return itemId;}public void setItemId(String itemId) {this.itemId = itemId;}public double getDiscount() {return discount;}public void setDiscount(double discount) {this.discount = discount;}public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}}
这是从我们的服务返回的基本响应:
package com.programmer.gate;public class BaseResponse {private String status;private Integer code;public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}}
现在,我们定义下com.programmer.gate命名为PaymentController控制器:
package com.programmer.gate;import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/payment")
public class PaymentController {private final String sharedKey = "SHARED_KEY";private static final String SUCCESS_STATUS = "success";private static final String ERROR_STATUS = "error";private static final int CODE_SUCCESS = 100;private static final int AUTH_FAILURE = 102;@RequestMapping(value = "/pay", method = RequestMethod.POST)public BaseResponse pay(@RequestParam(value = "key") String key, @RequestBody PaymentRequest request) {BaseResponse response = new BaseResponse();if(sharedKey.equalsIgnoreCase(key)){int userId = request.getUserId();String itemId = request.getItemId();double discount = request.getDiscount();// Process the request// ....// Return success response to the client.response.setStatus(SUCCESS_STATUS);response.setCode(CODE_SUCCESS);}else{response.setStatus(ERROR_STATUS);response.setCode(AUTH_FAILURE);}return response;}
}
我们的控制器提供的唯一服务是pay()方法,该方法看起来非常简单,它使用预定义的共享密钥验证客户端请求,处理请求并以操作状态进行响应。
以下是控制器使用的常见注释:
- @RestController:此注释将类标记为资源,它隐式定义了@Controller和@ResponseBody mvc注释,当使用@RestController注释类时, 无需在方法返回的POJO类旁边编写@ResponseBody 。
- @RequestMapping:除了方法类型: GET / POST之外 ,此注释还定义了资源的url,在我们的示例中,我们将付款服务公开为POST ,可通过/ payment / pay访问。
- @RequestParam:此注释表示特定的请求参数,在我们的示例中,我们将名为key的请求参数映射到String类型的参数键 。
- @RequestBody:此批注表示请求的主体,在我们的示例中,我们将请求的主体映射到类型为PaymentRequest的POJO类(jackson处理JSON / POJO转换)
注意到响应以BaseResponse表示,不需要注释, 杰克逊将其隐式转换为JSON。
5.部署应用程序
以下是部署我们的应用程序的步骤:
- 右键单击pom.xml- >运行方式-> Maven安装
- Maven在目标文件夹内生成一个名为SpringBootRest-0.0.1-SNAPSHOT.jar的jar文件
- 打开cmd,然后使用以下命令运行jar: java -jar SpringBootRest-0.0.1-SNAPSHOT.jar
到这里,我们的应用程序启动,并准备在默认端口8080上处理请求。
6.测试服务
为了测试我们的API,我们使用来自chrome的Advanced REST客户端插件,并发起2个不同的请求:
成功的请求:在此请求中,我们将有效的共享密钥作为请求参数以及请求正文中的项目详细信息传递。 它是这样的:
这是我们的回应:
{"status": "success","code": 100
}
失败请求:此请求看起来与上面相似,但是共享密钥无效,这是我们从API中获得的:
{"status": "error","code": 102
}
就是这样,希望您发现它有用。
翻译自: https://www.javacodegeeks.com/2018/03/build-rest-web-service-using-spring-boot.html