POST和GET用于相同的URL - Controller - Spring

时间:2018-05-19 13:11:45

标签: java spring http spring-mvc

我有这个控制器:

@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";
    }
}

我有2个方法对同一个网址/login使用不同的http方法 所以当点击第一个网址&#39; localhost:8080/project_name/login&#39;将处理GET的第一种方法,并将我重定向到/LoginForm

因此,根据我的理解,第二个方法处理程序将不会执行,因为/login的请求始终为GET.

如果我的理解是错误的,请向我解释第二种方法如何得到满足和感谢。

3 个答案:

答案 0 :(得分:3)

  

/ login的请求总是使用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 =提示符( “输入%20your%20parameters”, “VAR1 = AAAA&安培; VAR2 = BBBBB”);%20var%20Target_LINK =提示符( “输入%20destination”,%20location.href);% 20function%20post(路径,%20params)%20 {%20%20%20var%20xForm =%20document.createElement( “形式”);%20%20%20xForm.setAttribute( “方法”,20% “后”) ;%20%20%20xForm.setAttribute( “行动”,%20path);%20xForm.setAttribute( “目标”,%20 “_blank”);%20%20%20for(VAR%20key%20英寸%20params)% 20 {%20%20%20if(params.hasOwnProperty(键))%20 {%20%20%20%20%20%20%20%20var%20hiddenField%20 =%20document.createElement( “输入”); %20%20%20%20%20%20hiddenField.setAttribute( “姓名”,%20key);%20%20%20%20%20%20hiddenField.setAttribute( “值”,%20params [键]);% 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_pa​​rams = {};%20my_params.split( “&安培;”)的forEach(函数(项目)%20 {风险%20秒。 %20 =%20item.split( “=”),%20K = S [0],%20V = S 1;%20parsed_pa​​rams [K]%20 =%20V;});%20PO ST(TARGET_LINK,%20parsed_pa​​rams);%20void(0);

答案 1 :(得分:1)

来自浏览器的网址localhost:8080/project_name/login的点击将是GET通话;所以你的第一个/登录GET方法将被执行。

要执行第二个方法,请从PostManARC等任何Rest客户端进行POST调用。

答案 2 :(得分:0)

click here

你可以使用邮递员更好的方式