我试图建立一个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是获取调用。
答案 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告诉你构造函数是错误的,因为他找不到username
和password
字段的正确映射。