【问题标题】:Javascript AJAX call to SpringBoot controller and getting response in JSONJavascript AJAX 调用 SpringBoot 控制器并获得 JSON 响应
【发布时间】:2023-03-11 06:45:01
【问题描述】:

我正在尝试使用 JSON 访问我的 SpringBoot 控制器,为此我正在使用 AJAX。我希望我的控制器接收 AJAX 调用,提取 JSON,处理这些值并将 JSON 响应返回给脚本,然后我将以某种方式使用它。

我无法弄清楚如何对我的控制器进行编码以处理 AJAX,以及请求应该是 POST 还是 GET?

这是我的脚本代码:

<script>
    database.on('child_added', function (snapshot) {
        var data = {};
        data["FirstName"] = snapshot.val().FirstName;
        data["LastName"] = snapshot.val().LastName;
        data["Number"] = snapshot.val().Number;

        $.ajax({
          type: "GET",
          contentType: "application/json",
          url:"my-localhost/application/print",
          data: JSON.stringify(data),
          dataType: 'json',
          cache: false,
          success: function(){
            console.log("Successfully sent payload")
          },
          error: function(e){
            console.log("Error": , e)
          }
        });
</script>

这里是我的控制器。我不知道如何更改它以及如何更改它以及如何将响应发送回脚本:

@RestController
@RequestMapping("/application")
public class AppController
{
    @GetMapping("/print")
    public void print()
    {
        System.out.println("Hello World");
    }
}

【问题讨论】:

  • 使用public ResponseEntity&lt;T&gt; print(){} 而不是void

标签: javascript java ajax spring-boot


【解决方案1】:

我无法弄清楚如何对我的控制器进行编码以处理 AJAX,以及请求应该是 POST 还是 GET?

您的服务方法被注释为@GetMapping("/print"),所以它应该是GET 请求。我建议多阅读一些关于各种 HTTP 方法的内容,然后决定哪一种最适合您。

这里是我的控制器。我不知道如何更改它以及如何更改它以及如何将响应发送回脚本。

您应该返回封装了要发送回消费者的数据的对象。

【讨论】:

    【解决方案2】:

    只需三个步骤

    1. 创建 DTO 对象(属性名称必须与您的 JSON 对象名称一致)
    2. 用户 @RequestBody 在您的方法中
    3. 使用 @ReponseBody 并简单地返回对象。

    示例: 考虑一下您想要发送一些用户信息,做一些业务并将该用户返回到 javascript (UI)。

    • 为用户创建 DTO 类
        @JsonInclude(JsonInclude.Include.NON_NULL)
        @JsonIgnoreProperties(ignoreUnknown = true)
        public class UserDto {
    
        private Long id;
        private String name;
        private String family;
        private String password;
        private String username;
        private String nationalId;
        private String email;
        //Getters and Setters
        }
    
    • @RequestBody 和 User 类作为控制器的输入 方法。

    • 只返回用户对象。

     @RestController
     @RequestMapping("/application")
     public class AppController {
    
        //Changed to @PostMapping
        @PostMapping("/print")
        public User print(@RequestBody User user) {
    
            //Do whatever you want to user
            System.out.println("Hello World" + user.getUsername());
            return user;
    
        }
     }
    

    一些注意事项

    • @RequestBody,用作将发送的 JSON 转换为 java 类的转换器(Convert user JSON to User.class)

    • @ResponseBody,是@RequestBody的逆,它将java类转换为JSON(将User.class转换为用户JSON)

    • 当您向服务器发送数据时,最好使用 POST 而不是 GETGET OF POST

    • DTO 对象属性名称(family、id、...)必须与您的 JSON 属性名称。否则,您必须使用@JsonProperty。 Further information about JsonProperty

    • 当你使用 @RestController 时,你不需要使用 @ResponseBody 因为它在@RestContoller 的正文中

    【讨论】:

    • 如何从 AJAX 调用中获取控制器中的 JSON?
    • 您必须从您的成功回调方法中取回数据。像这样:成功:函数(数据){ console.log(数据); }
    • 我的意思是,如何在我的 spring 控制器中使用来自 AJAX 的 JSON?
    • 当您使用@RequestController 时,您的JSON 表单数据现在是java 类的形式。之后,您可以使用该类。例如,在上述示例中,我使用转换后的用户的用户名并将其打印出来。我的意思是在转换之后你可以在你转换的类上做任何你想做的事情,然后你可以把它返回到你的 javascript。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 2018-04-27
    • 1970-01-01
    • 2015-05-22
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多