0

0

构建一个基于 Spring 的 RESTful Web Service

php中文网

php中文网

发布时间:2016-06-01 09:46:43

|

2010人浏览过

|

来源于php中文网

原创

目标

构建一个service,接收如下http get请求:

http://localhost:8080/greeting

并返回如下JSON格式的问候语:

{"id":1,"content":"Hello, World!"}

 

你也可以通过指定查询字符串中的可选参数name来定制问候语:

http://localhost:8080/greeting?name=User

参数name的值覆盖了默认值“World”,得到的响应为:

{"id":1,"content":"Hello, User!"}

 

准备工作

  • 大约15分钟
  • 一个文本编辑器或IDE
  • JDK1.6或更高
  • Gradle 1.8+或Maven 3.0+
  • 你也可以使用STS(Spring Tool Suite)直接import该工程

 

如何完成

如同所有的Spring入门教程,你可以选择一步一步的自己实现,也可以跳过基本的设置步骤。最终,你都将得到一份可以正常运行的代码。

如果选择按步实现,继续下一节。

如果选择跳过基本的安装部分,则执行以下命令从github获取代码:

git clone https://github.com/spring-guides/gs-rest-service.git

切换当前目录到gs-rest-service/initial,跳到 Create a resource representation class步骤 。

完成后,可以与gs-rest-service/complete中的代码对比一下,确保正确。

 

建立工程

首先建立一个基本的构建脚本。基于Spring构建应用时,可以用使用任何的构建系统。这里我们以Gradle和Maven为例。如果不熟悉它们,请参考Building Java Projects with Gradle或者Building Java Projects with Maven

 

建立目录结构

在你选定的工程目录下,建立如下子目录结构;例如,在*nix系统中使用mkdir -p src/main/java/hello命令:

└── src
    └── main
        └── java
            └── hello

 

创建Gradle构建文件

下面是初始的gradle构建文件。你也可以使用Maven,Maven的配置文件pom.xml可以参考这里。如果你使用STS(Spring Tool Suite),可以直接导入该工程。

build.gradle

buildscript {
    repositories {
        maven { url "http://repo.spring.io/libs-snapshot" }
        mavenLocal()
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'

jar {
    baseName = 'gs-rest-service'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
    maven { url "http://repo.spring.io/libs-snapshot" }
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.0.0.RC1")
    compile("com.fasterxml.jackson.core:jackson-databind")
    testCompile("junit:junit:4.11")
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.8'
}

注意:本文使用了Spring Boot。

 

创建资源描述类(Create a resource representation class)

现在已经建立了工程和构建系统,下面创建你的web service。

首先考虑服务间的交互(service interactions)。

这个服务要处理/greeting的GET请求,其查询字符串包含一个可选的name参数。这个GET请求应该一个200 OK的响应,以及JSON结构的描述问候语的内容。格式如下:

{
    "id": 1,
    "content": "Hello, World!"
}

id域是问候语的唯一标识,content域是问候语的文本描述。

为了对问候语的描述进行建模,创建了一个资源描述类。提供了一个包含域(id和content)、构造方法和访问器(getter和setter)的pojo(pain old java object)类:

src/main/java/hello/Greeting.java

package hello;

public class Greeting {

    private final long id;
    private final String content;

    public Greeting(long id, String content) {
        this.id = id;
        this.content = content;
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }
}

注意:下面的步骤中,Spring使用了Jackson JSON库将Greeting类型的实例编码成JSON格式。

下面创建资源控制器(resource controller)来发送这些问候语。

 

创建资源控制器(Create a resource controller)

采用Spring构建RESTful web services时,采用控制器处理HTTP请求。控制器组件通过@Controller注解来标识,下面的GreetingController类处理/greeting的GET请求,并返回一个Greeting类的新的实例:

src/main/java/hello/GreetingController.java

package hello;

import java.util.concurrent.atomic.AtomicLong;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping("/greeting")
    public @ResponseBody Greeting greeting(
            @RequestParam(value="name", required=false, defaultValue="World") String name) {
        return new Greeting(counter.incrementAndGet(),
                            String.format(template, name));
    }
}

 

这个controller很简单,但是其内部做了大量工作,麻雀虽小,五脏俱全。我们一步一步的解释。

@RequestMapping注解确保对/greeting的HTTP请求映射到greeting()方法。

注意:上述例子中没有写明GET、PUT、POST等等。这是因为@RequestMapping注解默认情况下映射所有的HTTP操作。使用@RequestMapping(method=GET)指定只映射GET请求。

LangChain
LangChain

一个开源框架,用于构建基于大型语言模型(LLM)的应用程序。

下载

@RequestParam把查询字符串中name参数的值绑定到greeting()方法的name参数上。该查询参数不是必须的(required=false);如果请求时没有指定该参数,则使用其默认值“World”(defaultValue)。

方法体的实现创建并返回了一个新的Greeting对象,该对象的id属性每次自增1,content属性采用template和name组合而来。

传统的MVC控制器和上述RESTful web service控制器的一个关键区别在于:HTTP响应体的创建方式。前者采用视图层技术(view technology)实现把服务器端的数据渲染为HTML,后者则返回一个Greeting对象。对象数据将会直接以JSON格式写到HTTP响应中。

通过以下方式实现上述功能,greeting()方法的@ResponseBody注解告诉Spring MVC不需要使用服务器端视图层渲染问候语对象(the greeting object),取而代之的是,返回的问候语对象时一个response body,而且应该直接写出。

Greeting对象必须转换成JSON格式。由于Spring支持HTTP报文转换,你不需要手工进行转换。由于Jackson 2在classpath中,因而Spring的MappingJackson2HttpMessageConverter会自动将Greeting实例转换为JSON格式。

 

Make the application executable

虽然可以将这个service打包成传统的WAR文件,并部署到一个外部的应用服务器上,但是我们采用了一个更简单的方式:创建一个独立的(standalone)应用程序。把所有文件打包到一个可执行的JAR文件中,由古老的main()方法驱动。采用Spring提供的嵌入的Tomcat Servlet容器作为HTTP运行时环境,不需要部署一个外部的运行时环境实例。

src/main/java/hello/Application.java

package hello;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

 

main()方法调用了SpringApplication帮助类,把Application.class传递给它的run()方法作为参数。这样Spring就会去从Application读取注解,并作为Spring application context的一个组件进行管理。

@ComponentScan注解告诉Spring递归地搜索hello包和其子包中直接或间接标记为@Component的类。这确保Spring发现并注册GreetingController,由于它被标记为@Controller,而@Controller是一类@Component注解。

@EnableAutoConfiguration注解基于你的classpath的内容打开合理的默认行为。例如,由于应用程序依赖于嵌入版的Tomcat(tomcat-embed-core.jar),一个Tomcat服务器会自动建立并进行合理的默认配置。应用程序也依赖于Spring MVC(spring-webmvc.jar),一个Spring MVC DispatcherServlet会为你配置和注册–不需要web.xml!自动配置(Auto-configuration)是一种强大的灵活的机制。详请参考API文档。

 

构建可执行JAR(Build an executable JAR)

目前位置,Application类已经写完,下面通过构建系统把所有文件打包为一个可执行jar文件。这将便于对这个service在多种不同环境中进行发布、版本控制和部署。

下面是采用Gradle的步骤,如果采用Maven,可以在这里找到pom.xml文件,执行mvn clean package构建工程。

更新build.gradle文件的buildscript部分,如下:

buildscript {
    repositories {
        maven { url "http://repo.spring.io/libs-snapshot" }
        mavenLocal()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.0.0.RC1")
    }
}

再在build.gradle中添加如下语句:

apply plugin: 'spring-boot'

可以在这里看到最终版本的build.gradle文件。

Spring Boot gradle plugin收集classpath中的所有jar包,并构建一个单独的uber-jar,这使得更加便于执行和传输你的service。它也搜索public static void main()方法标志为一个可执行类。

下面执行如下命令生成一个单独的可执行JAR文件,该JAR文件包含所有必需的依赖的类和资源:

./gradlew build

如果你使用Gradle,可以使用如下语句执行生成的JAR文件:

java -jar build/libs/gs-rest-service-0.1.0.jar

如果使用Maven,使用如下语句:

java -jar target/gs-rest-service-0.1.0.jar

注意:上述过程将生成一个可执行JAR。你也可以选择构建一个WAR文件。

 

执行(Run the service)

如果采用Gradle,可以在命令行中执行如下命令来运行你的service:

./gradlew clean build && java -jar build/libs/gs-rest-service-0.1.0.jar

注意:如果采用Maven,可以执行如下语句mvn clean package && java -jar target/gs-rest-service-0.1.0.jar

日志输出。service将会启动并在数秒钟内运行。

 

测试(Test the service)

现在service已经启动,访问http://localhost:8080/greeting,你会看到:

{"id":1,"content":"Hello, World!"}

查询字符串中指定一个name参数,如http://localhost:8080/greeting?name=User。content的值从“Hello, World!”变为“Hello, User!”:

{"id":2,"content":"Hello, User!"}

这说明GreetingController类中的@RequestParam注解起作用了。name参数给定的默认值为“World”,但是可以通过在查询字符串中设定值覆盖它。

注意id属性从1变为2。这表明你在多次请求中访问了同一个GreetingController实例,它的counter域每次访问时会自增1。

 

小结(Summary)

恭喜!你已经开发出了一个基于Spring的RESTful web service。

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

616

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

194

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

91

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

54

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

598

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

56

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.7万人学习

C# 教程
C# 教程

共94课时 | 9.7万人学习

Java 教程
Java 教程

共578课时 | 68万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号