同一个URL使用POST和GET方法 - 控制器 - Spring

3

我有这个控制器:

@Controller
public class HelloWorldController {

    @RequestMapping("/hello.html")
    public ModelAndView helloWorld() {

        String message = "Hello World, Spring 3.0!";
        return new ModelAndView("hello", "message", message);
    }

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String viewLogin(Map<String, Object> model) {
        User user = new User();
        model.put("userForm", user);
        return "LoginForm";
    }

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String doLogin(@Valid  @ModelAttribute("userForm")  User userForm,
            BindingResult result, Map<String, Object> model) {

        if (result.hasErrors()) {
            return "login";
        }

        return "LoginSuccess";
    }
}

我有两种不同的HTTP方法来处理相同的URL /login。当点击第一个URL 'localhost:8080/project_name/login' 时,将使用 GET 方法来处理第一个方法,并将我重定向到/LoginForm
据我了解,由于请求/login始终使用GET,因此第二个方法处理程序将不会被执行。
如果我的理解是错误的,请告诉我如何执行第二个方法,谢谢。

2
你已经有了代码,为什么不让它运行起来看看它的表现呢?没错,你是对的。直接通过浏览器url调用url将会调用viewLogin处理程序而不是doLogin方法。当你有一个使用POST方法的登录表单并且在这个表单中点击提交按钮时,应该调用你的第二个方法。 - Marcus K.
@MarcusK。是的,这就是正确的解释。所以我们看到了其他页面,但URL保持不变,这就是为什么在提交表单时会执行另一个对/login的调用,但使用POST方法。谢谢! - Meninx - メネンックス
3个回答

3

登录请求总是使用GET方法。

我认为这是你感到困惑的地方。这是GET方法,因为浏览器默认使用GET调用。如果你想调用第二种方法,你可能需要编写自定义表单/JSP页面或查看Postman以将HTTP方法设置为POST。

你还可以使用命令行中的curl:

$ curl -d "param1=value1&param2=value2" -X POST http://localhost:3000/data

如果你想要通过浏览器自身进行POST请求,请查看这些浏览器插件: firefoxchrome
如果你不喜欢在浏览器中添加扩展程序,可以创建一个包含以下文本的书签,并使用它:

javascript:var%20my_params=prompt("输入参数","var1=aaaa&var2=bbbbb");%20var%20Target_LINK=prompt("输入目标链接",%20location.href);%20function%20post(path,%20params)%20{%20%20%20var%20xForm=%20document.createElement("form");%20%20%20xForm.setAttribute("method",%20"post");%20%20%20xForm.setAttribute("action",%20path);%20xForm.setAttribute("target",%20"_blank");%20%20%20for(var%20key%20in%20params)%20{%20%20%20if(params.hasOwnProperty(key))%20{%20%20%20%20%20%20%20%20var%20hiddenField%20=%20document.createElement("input");%20%20%20%20%20%20hiddenField.setAttribute("name",%20key);%20%20%20%20%20%20hiddenField.setAttribute("value",%20params[key]);%20%20%20%20%20%20%20%20%20xForm.appendChild(hiddenField);%20%20%20%20%20}%20%20%20}%20%20%20document.body.appendChild(xForm);%20%20xForm.submit();%20}%20%20%20parsed_params={};%20my_params.split("&").forEach(function(item)%20{var%20s%20=%20item.split("="),%20k=s[0],%20v=s1;%20parsed_params[k]%20=%20v;});%20post(Target_LINK,%20parsed_params);%20void(0);


1
从浏览器访问URL localhost:8080/project_name/login 会发起GET请求,因此将执行第一个/login GET方法。
要执行第二个方法,请从任何Rest客户端(例如PostManARC等)发起POST请求。

0

点击这里

浏览器默认选择 GET 方法。因此,如果您在 Postman 中尝试,您可以看到差异。您有选择 GET / POST 的选项。 实时的情况下,UI 会指定特定的 GET 请求/POST 请求,所以不用担心。

您可以使用 Postman 进行更好的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接