Spring Boot RESTFul application

Spring Boot RESTFul风格 应用程序

在本教程中,我们将创建一个简单的弹簧引导RESTful应用程序。我们的应用程序将被部署在一个嵌入式Tomcat服务器。

我们展示如何返回JSON和XML格式的数据从我们的web服务。

春天的引导

春天是一个流行的Java应用程序创建企业应用程序的框架。春天的引导是一种创建独立的、基于工业生产弹簧的应用程序以最小的努力。

RESTFul应用程序

RESTFul应用程序创建了一个系统(API)遵循REST架构风格,用于设计网络应用程序。RESTful应用程序使用HTTP请求执行CRUD(创建/读取/更新/删除)操作资源。

弹簧引导宁静的简单的例子

下面的代码示例创建了一个web服务,它从CSV文件中读取数据并将其以JSON格式返回给客户机。

$ tree
.
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── zetcode
    │   │           ├── Application.java
    │   │           ├── bean
    │   │           │   └── Country.java
    │   │           ├── controller
    │   │           │   └── MyController.java
    │   │           └── service
    │   │               ├── CountryService.java
    │   │               └── ICountryService.java
    │   └── resources
    │       ├── application.yml
    │       └── countries.csv
    └── test
        └── java

这是项目结构。

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>com.zetcode</groupId>
    <artifactId>SpringBootRest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>SpringBootRest</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <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.3.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>com.opencsv</groupId>
            <artifactId>opencsv</artifactId>
            <version>3.8</version>
        </dependency>         
    </dependencies>    

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>            
        </plugins>
    </build>

</project>

这是Maven构建文件。的 opencsv用于处理CSV数据。的 spring-boot-starter-web是构建web的起动器和基于rest的应用程序。应用程序打包成一个可执行的JAR文件。与创建可执行JAR spring-boot-maven-plugin.

application.yml
server:
  port: 8086
  contextPath: /rest

 application.yml文件包含各种弹簧启动应用程序的配置设置。我们已经为服务器端口映射和上下文路径(应用程序名称)。该文件位于 src/main/resources目录中。

countries.csv
Country, Population
Slovakia,5429000
Norway,5271000
Croatia,4225000
Russia,143439000
Mexico,122273000
Vietnam,95261000
Sweden,9967000
Iceland,337600
Israel,8622000
Hungary,9830000
Germany,82175700
Japan,126650000

 countries.csv位于 src/main/resources目录,包含在我们的应用程序中使用的数据。

Country.java
package com.zetcode.bean;

public class Country {

    private String name;
    private int population;

    public Country() {
    }

    public Country(String name, int population) {

        this.name = name;
        this.population = population;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPopulation() {
        return population;
    }

    public void setPopulation(int population) {
        this.population = population;
    }
}

的字段 countries.csv文件被映射到 Country类。

ICountryService.java
package com.zetcode.service;

import com.zetcode.bean.Country;
import java.util.ArrayList;

public interface ICountryService {
    
    public ArrayList<Country> findAll();
}

这是 ICountryService接口。它包含一个方法调用 findAll().

CountryService.java
package com.zetcode.service;

import com.opencsv.CSVReader;
import com.zetcode.bean.Country;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.stereotype.Service;

@Service
public class CountryService implements ICountryService {

    private final ArrayList<Country> countries;

    public CountryService() {

        countries = new ArrayList();
    }

    @Override
    public ArrayList<Country> findAll() {

        FileInputStream fis = null;

        try {

            String fileName = "src/main/resources/countries.csv";

            fis = new FileInputStream(new File(fileName));
            CSVReader reader = new CSVReader(new InputStreamReader(fis));
            String[] nextLine;
            reader.readNext();
            s
            while ((nextLine = reader.readNext()) != null) {

                Country newCountry = new Country(nextLine[0],
                        Integer.valueOf(nextLine[1]));
                countries.add(newCountry);
            }

        } catch (FileNotFoundException ex) {
            Logger.getLogger(CountryService.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(CountryService.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException ex) {
                Logger.getLogger(CountryService.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return countries;
    }
}

这是实现的 ICountryService合同。它包含了 findAll()读取数据的方法 countries.csv文件,并返回一个列表 Country对象。

MyController.java
package com.zetcode.controller;

import com.zetcode.bean.Country;
import com.zetcode.service.ICountryService;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @Autowired
    private ICountryService countryService;

    @RequestMapping("/countries")
    public List<Country> listCountries() {
        
        return countryService.findAll();
    }
}

这是春天的控制器类启动基于rest的应用程序。的 @RestController注释创建一个RESTful控制器。在传统的MVC控制器使用 ModelAndViewRESTful控制器仅返回对象和对象数据直接写入HTTP响应在JSON或XML格式。

@Autowired
private ICountryService countryService;

我们注入 CountryService countryService变量。

@RequestMapping("/countries")
public List<Country> listCountries() {

    return countryService.findAll();
}

 @RequestMapping注释用于web请求映射到春天的控制器方法。在这里我们映射的请求 /countries控制器的道路 listCountries()方法。默认请求一个GET请求。

我们不需要转换 Country域对象手工JSON。因为杰克逊2类路径中,春天的选择MappingJackson2HttpMessageConverter自动转换 Country实例JSON。

Application.java
package com.zetcode;

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);
    }
}

 Application设置弹簧启动应用程序。的 @SpringBootApplication支持自动配置和组件扫描。

$ mvn package

 mvn package命令,我们构建应用程序。

$ mvn spring-boot:run

 mvn spring-boot:run命令,我们运行应用程序。嵌入应用程序部署在Tomcat服务器。

$ curl localhost:8086/rest/countries
[{"name":"Slovakia","population":5429000},{"name":"Norway","population":5271000},
{"name":"Croatia","population":4225000},{"name":"Russia","population":143439000},
{"name":"Mexico","population":122273000},{"name":"Vietnam","population":95261000},
{"name":"Sweden","population":9967000},{"name":"Iceland","population":337600},
{"name":"Israel","population":8622000},{"name":"Hungary","population":9830000},
{"name":"Germany","population":82175700},{"name":"Japan","population":126650000}]

 curl命令,我们测试应用程序。

返回XML数据

JSON返回XML数据相反,我们需要添加一个依赖项和修改控制器。

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>      

我们添加 jackson-dataformat-xml的依赖关系。

MyController.java
package com.zetcode.controller;

import com.zetcode.bean.Country;
import com.zetcode.service.ICountryService;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @Autowired
    private ICountryService countryService;

    @RequestMapping(value="/countries", method=RequestMethod.GET, 
            produces=MediaType.APPLICATION_XML_VALUE)
    public List<Country> listCountries() {
    
        return countryService.findAll();
    }
}

我���选择的 MediaType.APPLICATION_XML_VALUE告诉控制器返回的XML数据类型。

在本教程中,我们已经创建了一个弹簧引导RESTful应用程序返回JSON和XML数据。你可能也会感兴趣的相关教程:弹簧引导H2其他教程,介绍Spring web应用程序,独立的Spring应用程序,OpenCSV教程,使用HikariCP连接池,JdbcTemplate在一个典型的Spring应用程序.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值