如何从前端到Spring发出HTTP POST请求?

时间:2017-12-04 23:31:58

标签: javascript java spring rest http

我试图建立一个Web应用程序,将ReactJS作为前端,并通过Spring连接Java后端,但我是Spring的新手。

我现在在RestController中设置了两个不同的请求:

@RequestMapping(value = "/index")
public String index() {
        return "index string!";
}

@RequestMapping(method=RequestMethod.POST, value="/login")
public void login(@RequestParam("user") User user) {
        System.out.println(user);
}

我可以像这样从前端成功查询/索引:

fetch("http://localhost:3002/index").then(function(response) {
    console.log(response.text());
    return response;
});

这会打印一个包含字符串"索引字符串的Promise!" (我还不确定如何使用这个字符串,但这不是我的主要问题)

我想使用POST请求发送数据(应该是PUT吗?)供用户登录。我的计划是从请求中获取用户对象,并在Java代码中的其他地方对我的数据库进行验证。这是一个User对象:

public class User {
  private String username;
  private String password;

  public User(String uName, String pass) {
    username = uName;
    password = pass;
  }
}

这是前端的POST请求:

fetch('http://localhost:3002/login', {
        method: 'POST',
        body: {
          username: username,
          password: password
        }
    });

其中用户名和密码是从HTML解析的字符串。

我的理解是,Spring应该从请求的主体创建一个用户对象,让我使用它,但是我没有得到更多细节就得到400错误。

如何让这个400错误消失并成功将数据从我的前端传递到我的后端?

编辑:这是返回错误的前几行

VM10542:1 POST http://localhost:3002/login 400 ()
(anonymous) @   VM10542:1
func    @   LoginPage.js:26

LoginPage.js:26是获取调用。

1 个答案:

答案 0 :(得分:3)

首先,是的POST是这种呼叫的正确方法。

在您的情况下,您有两种选择:

以正文形式发送数据
这样端点实现将如下所示:

@RequestMapping(method=RequestMethod.POST, value="/login")
public void login(@RequestBody User user) { 
    System.out.println(user);
}

然后将其作为JSON发送

fetch('http://localhost:3002/login', {
  method: "POST",
  headers: {
    Accept: "application/json",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    username: "foo",
    password: "bar"
  })
});

或以params 发送 这样端点实现将如下所示:

@RequestMapping(method=RequestMethod.POST, value="/login")
public void login(@RequestParam("username") String username,
                  @RequestParam("password") String password) { 
    System.out.println(username + " " + password);
}

然后以params(不是最佳实现)发送它:

fetch('http://localhost:3002/login?username=' + username 
                                 + '&password=' + password, {
  method: "POST",
  headers: {
    Accept: "application/json",
    "Content-Type": "application/json"
  }
});

当然,你应该记住,简单发送密码并不是一个好主意,但我相信它是出于学习目的。在其他情况下,您可以查看HTTPS。

您也可以查看其他登录处理技术,例如初学者JWT,或者您可以介绍OAUTH。祝你好运!

编辑:

我没有注意到你的模型类是错误的。 我相信你需要让它看起来像这样:

class User {
    private String username;
    private String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }
}

所以Spring告诉你构造函数是错误的,因为他找不到usernamepassword字段的正确映射。