【问题标题】:Can someone please clarify @RequestBody有人可以澄清@RequestBody
【发布时间】:2017-01-28 09:34:07
【问题描述】:

我已经对@RequestBody 进行了一些阅读和研究,但我仍然无法理解它的目的。

给定场景:

  • RESTful API 只接受用户的bookName 并返回图书的authorName
  • @RequestBody 注释被添加到以bookName 为参数的getAuthor 方法上。

根据我在回答的similar 问题中读到的内容,这在这种情况下如何应用?将A 转换为B 然后将B 转换为A 是什么意思,以便用户可以将其视为JSON 对象。我很困惑!

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    来自 javadoc:

    指示方法参数的注解应绑定到正文 的网络请求。请求的主体通过 HttpMessageConverter 解析方法参数取决于 请求的内容类型。可选地,自动验证可以是 通过使用 @Valid 注释参数来应用。

    在您的示例中,使用@RequestBody 毫无意义。你要获取一本书对应的作者姓名

    您发送 GET/books/myBook/author

    控制器是

    @RestController
    public class BooksRestController{
    
        @RequestMapping(value="/books/{bookName}/author", method=RequestMethod.GET)
        public Map<String,String> getAuthor(@PathVariable bookName){
            ...
            Map<String,String> author = new HashMap<String,String>();
            author.put("author",bookAuthor);
            return author;
        }
    }
    

    回复将是{"author":"whoever"}

    现在假设您要创建一本书。那时您将使用@RequestBody,将在 HTTP POST 正文中发送的 JSON 自动解析为 Book 对象。

    请求: POST /books - 正文 {"name" : "SomeBook", "author":"SomeAuthor"}

    控制器:

    @RestController
    public class BooksRestController{
    
        @RequestMapping(value="/books", method=RequestMethod.POST)
        @ResponseStatus(HttpStatus.CREATED)
        public Book createBook(@RequestBody Book book){
            ...
            //save book
            book = bookService.save(book);
            return book;
            //Book is going to be serialized as JSON because of the implicit 
            //@ResponseBody annotation from @RestController
        }
    

    Book.class:

    public class Book{
        private String name;
        private String author;
        //getters setters;
    }
    

    【讨论】:

    • 非常感谢您的解释,简洁明了。您提到:“现在假设您要创建一本书。那时您将使用 @RequestBody 自动将 HTTP POST 正文中发送的 JSON 解析为 Book 对象。”它是否也将其转换回 JSON 对象并在浏览器上显示/返回给用户?
    • 不,要实现这一点,您需要在方法的返回参数中指定@ResponseBody。但是,正如您在示例中看到的那样,控制器使用 @RestController 进行注释,这隐含地假定了该注释(来自 javadoc:Types that carry this annotation are treated as controllers where @RequestMapping methods assume @ResponseBody semantics by default.)。如果您使用的是@Controller,则必须自己添加注释。
    猜你喜欢
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多