zoukankan      html  css  js  c++  java
  • [译]Spring Boot 构建一个RESTful Web服务

    翻译地址:https://spring.io/guides/gs/rest-service/

    构建一个RESTful Web服务

    本指南将指导您完成使用spring创建一个“hello world”RESTful Web服务的过程。

     

    你将会构建什么

    您将构建一个将接受HTTP GET请求的服务:

    您将构建一个将接受HTTP GET请求的服务:

    http://localhost:8080/greeting
    • 1
    • 1

    并且使用JSON的形式进行响应:

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

    你可以再HTTP GET请求的URL中自定义可选参数name

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

    参数name的值会覆盖默认的“World”,并且反映在响应的数据中

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

    你将需要什么

    • 大约15分钟
    • 你喜欢的文本编辑器或者IDE
    • JDK 1.8或更高版本
    • Maven 3.0+

    使用Maven构建

    创建目录结构

    在您选择的项目目录中,创建以下子目录结构;例如,在* nix系统上使用mkdir -p src / main / Java / hello

    └── src
        └── main
            └── java
                └── hello
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.springframework</groupId>
        <artifactId>gs-rest-service</artifactId>
        <version>0.1.0</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.2.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.jayway.jsonpath</groupId>
                <artifactId>json-path</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
        <repositories>
            <repository>
                <id>spring-releases</id>
                <url>https://repo.spring.io/libs-release</url>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>spring-releases</id>
                <url>https://repo.spring.io/libs-release</url>
            </pluginRepository>
        </pluginRepositories>
    </project>

    Spring Boot Maven插件提供了许多方便的功能:

    • 它收集类路径上的所有jar,并构建一个单独的,可运行的“über-jar”,这使得执行和运输服务更加方便。
    • 它搜索public static void main()方法来标记为可运行类。
    • 它提供了一个内置的依赖解析器,用于设置版本号以匹配Spring Boot依赖关系。你可以覆盖任何你想要的版本,但它会默认为Boot的选择的版本集。

    创建资源表示类

    现在您已经设置了项目和构建系统,您可以创建您的Web服务。

    通过考虑服务交互开始该过程。

    该服务将处理/greetingGET请求,可选地在查询字符串中使用名称参数。 GET请求应在表示问候语的正文中返回带有JSON的200 OK响应。它应该看起来像这样:

    {
        "id": 1,
        "content": "Hello, World!"
    }
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    id字段是greeting的唯一标识符,contentgreeting的文本表示

    要对greeting进行建模,请创建资源表示类。提供一个简单的java对象,其中包含idcontent数据的字段,构造函数和访问器:

     

    src/main/java/hello/Greeting.java
    • 1
    • 1
    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;
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    如下面的步骤所示,Spring使用Jackson JSON库自动将Greeting类型的实例编译成JSON。

    接下来,您将创建提供这些Greeting的资源控制器。

    创建资源控制器

    在Spring构建RESTful Web服务的方法中,HTTP请求由控制器处理。这些组件很容易通过@RestController注释来识别,而GreetingController通过返回一个Greeting类的新实例来处理/ greetingGET请求:

    src/main/java/hello/GreetingController.java

    package hello;
    
    import java.util.concurrent.atomic.AtomicLong;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GreetingController {
    
        private static final String template = "Hello, %s!";
        private final AtomicLong counter = new AtomicLong();
    
        @RequestMapping("/greeting")
        public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
            return new Greeting(counter.incrementAndGet(),
                                String.format(template, name));
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    这个控制器简洁且简单,接下来。让我们一步一步地分解它。

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

    上述示例不指定GET与PUT,POST等,因为@RequestMapping默认映射所有HTTP操作。使用@RequestMapping(method = GET)缩小此映射。

    @RequestParam将查询字符串参数名的值绑定到greeting()方法的name参数中。此查询字符串参数显式标记为可选(缺省情况下为required = true):如果请求中不存在,将使用defaultValue“World”

    方法体的实现创建并返回一个基于来自计数器的下一个值的具有idcontent属性的Greeting对象,并使用Greeting模板格式化给定的名称。

    传统的MVC控制器和上面的RESTful Web服务控制器之间的主要区别是创建HTTP响应主体的方式。这个RESTful Web服务控制器不是依赖于视图技术来执行服务器端将问候数据呈现给HTML,而是简单地填充并返回Greeting对象。对象数据将作为JSON直接写入HTTP响应。

    这个代码使用Spring 4的新的@RestController注释,它将类标记为一个控制器,每个方法都返回一个域对象,而不是一个视图。它是@Controller@ResponseBody的缩写。

    Greeting对象必须转换为JSON。感谢Spring的HTTP消息转换器支持,你不需要手动进行这种转换。因为Jackson 2在类路径上,所以Spring的MappingJackson2HttpMessageConverter会自动选择将Greeting实例转换为JSON。

    使应用程序可执行

    虽然可以将此服务打包为用于部署到外部应用程序服务器的传统WAR文件,但下面演示的较简单的方法创建了一个独立的应用程序。您将所有内容打包在单个可执行JAR文件中,由一个Java main()方法驱动。你使用Spring的支持将Tomcat servlet容器嵌入为HTTP运行时,而不是部署到外部实例。

    src/main/java/hello/Application.java

    package hello;
    
    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);
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    @SpringBootApplication是一个方便的注释,添加以下所有内容:

    • @Configuration将类标记为应用程序上下文的bean定义的源。
    • @EnableAutoConfiguration告诉Spring Boot基于类路径设置,其他bean和各种属性设置开始添加bean。
    • 通常你会为Spring MVC应用程序添加@EnableWebMvc,但是Spring Boot在类路径上看到spring-webmvc时会自动添加它。这将应用程序标记为Web应用程序,并激活关键行为,如设置DispatcherServlet
    • @ComponentScan告诉Spring在hello包中查找其他组件,配置和服务,使其能够找到控制器。

    main()方法使用Spring Boot的SpringApplication.run()方法来启动应用程序。你注意到没有一行XML?也没有web.xml文件。这个Web应用程序是100%纯Java,你不必处理配置任何管道或基础设施。

    构建可执行的JAR

    您可以使用Gradle或Maven从命令行运行应用程序。或者,您可以构建单个可执行文件,其中包含所有必需的依赖关系,类和资源,并运行它。这使得易于在整个开发生命周期中,跨不同环境等等将服务作为应用程序进行发布,版本和部署。

    如果您使用Gradle,可以使用./gradlew bootRun运行应用程序。或者,您可以使用./gradlew build构建JAR文件。然后可以运行JAR文件:

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

    如果使用Maven,可以使用./mvnw spring-boot:run运行应用程序。或者,您可以使用./mvnw clean package清洁程序包构建JAR文件。然后可以运行JAR文件:

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

    显示日志输出。服务应该在几秒钟内启动并运行。

    测试服务

    现在服务已启动,请访问http://localhost:8080/greeting,其中您将看到:

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

    使用http://localhost:8080/greeting?name=User提供name查询字符串参数。注意content属性的值如何从“Hello,World!”到“Hello User!”:

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

    这个更改演示了GreetingController中的@RequestParam安排是如预期的那样工作。 name参数的默认值为“World”,但始终可以通过查询字符串显式覆盖。

    还要注意id属性如何从1变为2.这证明你正在对多个请求的同一个GreetingController实例,并且它的计数器字段在每个调用按预期增加。

     

    翻译地址:https://spring.io/guides/gs/rest-service/

    构建一个RESTful Web服务

    本指南将指导您完成使用spring创建一个“hello world”RESTful Web服务的过程。

    你将会构建什么

    您将构建一个将接受HTTP GET请求的服务:

    http://localhost:8080/greeting
    • 1
    • 1

    并且使用JSON的形式进行响应:

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

    你可以再HTTP GET请求的URL中自定义可选参数name

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

    参数name的值会覆盖默认的“World”,并且反映在响应的数据中

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

    你将需要什么

    • 大约15分钟
    • 你喜欢的文本编辑器或者IDE
    • JDK 1.8或更高版本
    • Maven 3.0+

    使用Maven构建

    创建目录结构

    在您选择的项目目录中,创建以下子目录结构;例如,在* nix系统上使用mkdir -p src / main / Java / hello

    └── src
        └── main
            └── java
                └── hello
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.springframework</groupId>
        <artifactId>gs-rest-service</artifactId>
        <version>0.1.0</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.2.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.jayway.jsonpath</groupId>
                <artifactId>json-path</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
        <repositories>
            <repository>
                <id>spring-releases</id>
                <url>https://repo.spring.io/libs-release</url>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>spring-releases</id>
                <url>https://repo.spring.io/libs-release</url>
            </pluginRepository>
        </pluginRepositories>
    </project>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    Spring Boot Maven插件提供了许多方便的功能:

    • 它收集类路径上的所有jar,并构建一个单独的,可运行的“über-jar”,这使得执行和运输服务更加方便。
    • 它搜索public static void main()方法来标记为可运行类。
    • 它提供了一个内置的依赖解析器,用于设置版本号以匹配Spring Boot依赖关系。你可以覆盖任何你想要的版本,但它会默认为Boot的选择的版本集。

    创建资源表示类

    现在您已经设置了项目和构建系统,您可以创建您的Web服务。

    通过考虑服务交互开始该过程。

    该服务将处理/greetingGET请求,可选地在查询字符串中使用名称参数。 GET请求应在表示问候语的正文中返回带有JSON的200 OK响应。它应该看起来像这样:

    {
        "id": 1,
        "content": "Hello, World!"
    }
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    id字段是greeting的唯一标识符,contentgreeting的文本表示

    要对greeting进行建模,请创建资源表示类。提供一个简单的java对象,其中包含idcontent数据的字段,构造函数和访问器:

    src/main/java/hello/Greeting.java
    • 1
    • 1
    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;
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    如下面的步骤所示,Spring使用Jackson JSON库自动将Greeting类型的实例编译成JSON。

    接下来,您将创建提供这些Greeting的资源控制器。

    创建资源控制器

    在Spring构建RESTful Web服务的方法中,HTTP请求由控制器处理。这些组件很容易通过@RestController注释来识别,而GreetingController通过返回一个Greeting类的新实例来处理/ greetingGET请求:

    src/main/java/hello/GreetingController.java

    package hello;
    
    import java.util.concurrent.atomic.AtomicLong;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GreetingController {
    
        private static final String template = "Hello, %s!";
        private final AtomicLong counter = new AtomicLong();
    
        @RequestMapping("/greeting")
        public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
            return new Greeting(counter.incrementAndGet(),
                                String.format(template, name));
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    这个控制器简洁且简单,接下来。让我们一步一步地分解它。

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

    上述示例不指定GET与PUT,POST等,因为@RequestMapping默认映射所有HTTP操作。使用@RequestMapping(method = GET)缩小此映射。

    @RequestParam将查询字符串参数名的值绑定到greeting()方法的name参数中。此查询字符串参数显式标记为可选(缺省情况下为required = true):如果请求中不存在,将使用defaultValue“World”

    方法体的实现创建并返回一个基于来自计数器的下一个值的具有idcontent属性的Greeting对象,并使用Greeting模板格式化给定的名称。

    传统的MVC控制器和上面的RESTful Web服务控制器之间的主要区别是创建HTTP响应主体的方式。这个RESTful Web服务控制器不是依赖于视图技术来执行服务器端将问候数据呈现给HTML,而是简单地填充并返回Greeting对象。对象数据将作为JSON直接写入HTTP响应。

    这个代码使用Spring 4的新的@RestController注释,它将类标记为一个控制器,每个方法都返回一个域对象,而不是一个视图。它是@Controller@ResponseBody的缩写。

    Greeting对象必须转换为JSON。感谢Spring的HTTP消息转换器支持,你不需要手动进行这种转换。因为Jackson 2在类路径上,所以Spring的MappingJackson2HttpMessageConverter会自动选择将Greeting实例转换为JSON。

    使应用程序可执行

    虽然可以将此服务打包为用于部署到外部应用程序服务器的传统WAR文件,但下面演示的较简单的方法创建了一个独立的应用程序。您将所有内容打包在单个可执行JAR文件中,由一个Java main()方法驱动。你使用Spring的支持将Tomcat servlet容器嵌入为HTTP运行时,而不是部署到外部实例。

    src/main/java/hello/Application.java

    package hello;
    
    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);
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    @SpringBootApplication是一个方便的注释,添加以下所有内容:

    • @Configuration将类标记为应用程序上下文的bean定义的源。
    • @EnableAutoConfiguration告诉Spring Boot基于类路径设置,其他bean和各种属性设置开始添加bean。
    • 通常你会为Spring MVC应用程序添加@EnableWebMvc,但是Spring Boot在类路径上看到spring-webmvc时会自动添加它。这将应用程序标记为Web应用程序,并激活关键行为,如设置DispatcherServlet
    • @ComponentScan告诉Spring在hello包中查找其他组件,配置和服务,使其能够找到控制器。

    main()方法使用Spring Boot的SpringApplication.run()方法来启动应用程序。你注意到没有一行XML?也没有web.xml文件。这个Web应用程序是100%纯Java,你不必处理配置任何管道或基础设施。

    构建可执行的JAR

    您可以使用Gradle或Maven从命令行运行应用程序。或者,您可以构建单个可执行文件,其中包含所有必需的依赖关系,类和资源,并运行它。这使得易于在整个开发生命周期中,跨不同环境等等将服务作为应用程序进行发布,版本和部署。

    如果您使用Gradle,可以使用./gradlew bootRun运行应用程序。或者,您可以使用./gradlew build构建JAR文件。然后可以运行JAR文件:

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

    如果使用Maven,可以使用./mvnw spring-boot:run运行应用程序。或者,您可以使用./mvnw clean package清洁程序包构建JAR文件。然后可以运行JAR文件:

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

    显示日志输出。服务应该在几秒钟内启动并运行。

    测试服务

    现在服务已启动,请访问http://localhost:8080/greeting,其中您将看到:

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

    使用http://localhost:8080/greeting?name=User提供name查询字符串参数。注意content属性的值如何从“Hello,World!”到“Hello User!”:

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

    这个更改演示了GreetingController中的@RequestParam安排是如预期的那样工作。 name参数的默认值为“World”,但始终可以通过查询字符串显式覆盖。

    还要注意id属性如何从1变为2.这证明你正在对多个请求的同一个GreetingController实例,并且它的计数器字段在每个调用按预期增加。

  • 相关阅读:
    Java (三)APACHE Commons IO 常规操作
    JavaFX FileChooser文件选择器,缓存上一次打开的目录
    JavaFX FileChooser文件选择器、DirectoryChooser目录选择器
    javaFX 在窗口的标题栏显示当前时间,1秒更新一次时间
    Java 实现截屏
    composer安装包的时候触发PHP fatal error,提示允许的内存耗光
    箭头函数
    js中的寄生组合继承
    构造函数的原型
    在string.replace中使用具名组匹配
  • 原文地址:https://www.cnblogs.com/gmq-sh/p/6925104.html
Copyright © 2011-2022 走看看