📜  Spring – MVC RequestParam 注解

📅  最后修改于: 2022-05-13 01:55:00.799000             🧑  作者: Mango

Spring – MVC RequestParam 注解

@RequestParam 注释使 spring 能够提取可以作为查询、表单数据或任何任意自定义数据传递的输入数据。在这里,我们将看到在为基于 Web 的应用程序构建 RESTful API 时如何使用 @RequestParam。

应用程序的上下文:假设我们正在为“Geeksforgeeks”网络应用程序实现一个示例功能,用户可以在其中发布和检索可用于撰写文章的文章主题。在这里,为了简单起见,我们将使用 hashmaps 作为我们的数据库。我们使用静态块将默认条目加载到我们的 hashmap/DB 中。

插图:

static int ID = 1;

// Using hashmaps instead of repository for simplicity
public static Map articleTopics = new HashMap();
static 
{
    articleTopics.put(0, "GFG");
}

使用@RequestParam 的简单映射

假设我们有一个端点/api/v1/article ,它接受一个查询参数articleId ,用户将能够在给定文章 ID 的情况下获取文章主题。  如果给定的articleId不存在,我们将返回“Article not accepted”作为响应,状态为 404 Bad Request。

例子:

// Java Program to Illustrate Simple GET Mapping

// Annotation
@GetMapping("/api/v1/article")

// Method
public ResponseEntity
getArticleTopic(@RequestParam Integer articleId) 
{

    if (articleTopics.containsKey(articleId)) 
    {
        return ResponseEntity.ok(
                   articleId + " " + articleTopics.get(articleId));
    }

    return ResponseEntity.badRequest().body(
               "Article doesnot exists");
}

当我们试图获取数据库中已经存在的文章时,我们会得到所需的响应正文,其状态码为“200 OK”。

当我们试图获取数据库中不存在的文章时,我们得到“文章不存在”响应正文,状态码为 400 BAD REQUEST。

使用 @RequestParam 指定请求参数名称

假设我们有一个端点/api/v2/article用于发布文章主题,它采用查询参数 articleName 作为名称

例子

// Specifying the request parameter name

// Annotation 
@PostMapping("api/v2/article")
public ResponseEntity postArticleTopic(@RequestParam("name") String articleName) 
{
    if (articleTopics.containsValue(articleName)) 
    {
        return ResponseEntity.badRequest().body("Article already exists");
    }

    int currentArticleID = ID++;
    articleTopics.put(currentArticleID, articleName);
    return ResponseEntity.ok("Saved : [" + currentArticleID + "," + 
                            articleTopics.get(currentArticleID) + "]");
}

当我们试图获取数据库中不存在的文章时,我们保存请求并返回响应,状态码为 200 OK。

当我们试图获取数据库中已经存在的文章时,我们会得到“文章已经存在”响应正文,状态码为 400 BAD REQUEST。

使用带有默认值的 @RequestParam

假设我们有一个端点/api/v3/article用于获取带有查询参数 articleId 的文章主题。在这里,我们使用了defaultValue属性,如果没有提供值,则该属性采用默认值。

例子:

// Default value for Request Parameters

@GetMapping("/api/v3/article")
public ResponseEntity getArticleTopicOrDefault(@RequestParam(defaultValue = "0")Integer articleId) {
    if (!articleTopics.containsKey(articleId)) 
    {
        // If the provided articleId is not present in Database, then also return default
        articleId = 0;
    }
    // If no value is provided for id then return default
    return ResponseEntity.ok(articleId + " " + articleTopics.get(articleId));
}

如果查询参数没有提供值,则返回默认值。

如果提供的值在数据库中不存在,则也返回默认值。

使用@RequestParam 映射多值查询参数

假设我们有一个端点/api/v4/article用于发布文章主题,它将列表作为查询参数。

例子

// Mapping a multivalue parameter

@PostMapping("/api/v4/article")

public ResponseEntity getMultipleArticleTopics(@RequestParam List names) 
{
    for (String topic : names) 
    {
        articleTopics.put(ID++, topic);
    }
    return ResponseEntity.accepted().body("Saved : " + names);
}

执行:

Java
// Java Program to Illustrate Spring - MVC
// RequestParam Annotation
 
package com.example.springmvc.RequestParamAnnotation;
 
// Importing required classes
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
 
// Annotation
@RestController
 
// Class
public class Controller {
    static int ID = 1;
 
    // Using hashmaps instead of repository for simplicity
    public static Map articleTopics
        = new HashMap();
    static { articleTopics.put(0, "GFG"); }
 
    // Simple mapping
    @GetMapping("/api/v1/article")
 
    public ResponseEntity
    getArticleTopic(@RequestParam Integer articleId)
    {
 
        // Searching in map if not found return null;
        if (articleTopics.containsKey(articleId)) {
 
            return ResponseEntity.ok(
                articleId + " "
                + articleTopics.get(articleId));
        }
 
        return ResponseEntity.badRequest().body(
            "Article doesnot exists");
    }
 
    // Specifying the request parameter name
    @PostMapping("api/v2/article")
 
    public ResponseEntity postArticleTopic(
        @RequestParam("name") String articleName)
    {
        if (articleTopics.containsValue(articleName)) {
 
            return ResponseEntity.badRequest().body(
                "Article already exists");
        }
 
        int currentArticleID = ID++;
        articleTopics.put(currentArticleID, articleName);
 
        return ResponseEntity.ok(
            "Saved : [" + currentArticleID + ","
            + articleTopics.get(currentArticleID) + "]");
    }
 
    // Default value for Request Parameters
    @GetMapping("/api/v3/article")
 
    public ResponseEntity getArticleTopicOrDefault(
        @RequestParam(defaultValue = "0") Integer articleId)
    {
        if (!articleTopics.containsKey(articleId)) {
 
            // If the provided articleId is not present in
            // DB, then also return default
            articleId = 0;
        }
 
        // If no value is provided for ID
        // then return default
        return ResponseEntity.ok(
            articleId + " " + articleTopics.get(articleId));
    }
 
    // Mapping a multivalue Container
    r @PostMapping("/api/v4/article")
    public ResponseEntity getMultipleArticleTopics(
        @RequestParam List names)
    {
        for (String topic : names) {
            articleTopics.put(ID++, topic);
        }
 
        return ResponseEntity.accepted().body("Saved : "
                                              + names);
    }
}



依赖: Gradle

dependencies 
{
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'javax.validation:validation-api:2.0.1.Final'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}