2017-07-10 13 views
0

Ich möchte alle Felder aus Registrierungsformular senden und sie in PostgreSQL-Datenbank speichern. Ich benutze Spring MVC und jQuery. POST-Anfrage an/speichern funktioniert nur mit Postman. Wenn ich auf "Registrieren" -Button klicke, um das Formular abzuschicken, gibt es mir -Senden von POST-Anforderung an REST-Endpunkt mit Jquery

"Request method 'POST' not supported".

Kann mir jemand helfen?

Benutzer Controller:

@RestController 
public class UserController { 

@Autowired 
private UserService userService; 

@RequestMapping(method=RequestMethod.POST, value="/save", headers="Accept=application/x-www-form-urlencoded") 
public void registerUser(@RequestBody User user) { 
    userService.registerUser(user); 
} 
} 

Pagecontroller:

@Controller 
public class PageController { 

@RequestMapping("/login") 
public String login() { 
    return "index.html"; 
} 

} 

Modell:

@Entity 
@Data 
@Table(name="users") 
public class User { 

@Id @GeneratedValue 
private long id; 

@Column(name="sex") 
private String sex; 

@Column(name="skype") 
private String skype; 

@Column(name="username") 
private String userName; 

@Column(name="email") 
private String email; 

@Column(name="password") 
private String password; 

protected User(){}; 
} 

HTML:

<!doctype html> 
<html> 
<head> 
<title>Login/Register</title> 
<link 
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" 
rel="stylesheet" type="text/css"> 
<link href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font- 
awesome.min.css" rel="stylesheet" type="text/css"> 
<link rel="stylesheet" type="text/css" href="css/style.css"> 
<script src="js/login.js"></script> 
</head> 
<body> 
<br> 
<div class="row"> 
    <div class="container"> 
     <div class="login-register-form-section"> 
      <ul class="nav nav-tabs" role="tablist"> 
       <li class="active"><a href="#login" data- 
toggle="tab">Login</a></li> 
       <li><a href="#register" data-toggle="tab">Register</a></li> 
      </ul> 
      <div class="tab-content"> 
       <div role="tabpanel" class="tab-pane fade in active" 
id="login"> 
        <form class="form-horizontal" method="post" action=""> 
         <div class="form-group " > 
          <div class="input-group"> 
           <div class="input-group-addon"><i class="fa fa-user"></i></div> 
           <input type="text" name="login_email" class="form-control" placeholder="Username or email" required="required" value=""> 
          </div> 
         </div> 
         <div class="form-group "> 
          <div class="input-group"> 
           <div class="input-group-addon"><i class="fa fa-key"></i></div> 
           <input type="password" name="login_password" class="form-control" placeholder="Password" required="required"> 
          </div> 
         </div> 
         <div class="form-group"> 
          <input type="checkbox" id="rememberMe"> 
          <label for="rememberMe">Remember Me</label> 
          <a href="#" class="pull-right">Forgot password?</a> 
         </div> 
         <input type="submit" value="Login" class="btn btn-success btn-custom"> 
        </form> 
       </div> 
       <div role="tabpanel" class="tab-pane fade" id="register"> 
        <form class="form-horizontal" method="post" action=""> 
         <div class="form-group" id="sex"> 
          <div class="input-group"> 
           <div class="input-group-addon"><i class="fa fa-user"></i></div> 
           <select type="text" name="gender" class="form-control"> 
           <option>Male</option> 
           <option>Female</option> 
           </select> 
          </div> 
         </div> 
         <div class="form-group "> 
          <div class="input-group"> 
           <div class="input-group-addon"><i class="fa fa-male"></i></div> 
           <input type="text" name="register_username" class="form-control" placeholder="Username" required="required" value=""> 
          </div> 
         </div> 
         <div class="form-group "> 
          <div class="input-group"> 
           <div class="input-group-addon"><i class="fa fa-envelope"></i></div> 
           <input type="email" name="register_email" class="form-control" placeholder="Email" required="required" value=""> 
          </div> 
         </div> 
         <div class="form-group "> 
          <div class="input-group"> 
           <div class="input-group-addon"><i class="fa fa-skype"></i></div> 
           <input type="text" name="register_skype" class="form-control" placeholder="Skype name" required="required" value=""> 
          </div> 
         </div> 
         <div class="form-group "> 
          <div class="input-group"> 
           <div class="input-group-addon"><i class="fa fa-lock"></i></div> 
           <input type="password" name="register_password" class="form-control" placeholder="Password" required="required"> 
          </div> 
         </div> 
         <input type="submit" id="submitbtn" value="Register" class="btn btn-success btn-custom"> 
        </form> 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 

jQuery:

jQuery(document).ready(
function($) { 

    $("#submitbtn").click(function(event) { 

     var data = {} 
     data["sex"] = $("#sex").val(); 
     data["skype"] = $("#register_username").val(); 
     data["username"] = $("#register_email").val(); 
     data["email"] = $("#register_skype").val(); 
     data["password"] = $("#register_password").val(); 

     $("#submitbtn").prop("disabled", true); 

     $.ajax({ 
       type: "POST", 
       contentType: "application/json", 
       url: "/save", 
       data: JSON.stringify(data), 
       dataType: 'json', 
       timeout: 600000, 
       success: function (data) { 
        console.log("DONE"); 
       }, 
       error: function (e) { 
        console.log("ERROR: ", e); 
        display(e); 
       } 
     }); 


    }); 

}); 
+0

Ändern Sie den Inhaltstyp in Ihrem Controller zu contentType: "application/json" – cralfaro

+0

gefällt das?headers = "Accept = application/json" – Michael

Antwort

0

Ok, das Problem ist, dass ich die dom Elemente nicht richtig ausgewählt habe, statt id = "email" habe ich name = "email" verwendet.

<input type="text" name="register_skype" ...... > 
0

Statt input type tun = 'submit' können Sie input type Versuchen Sie es mit = 'Taste'

die Zeile application/json in Ihrem Ajax-Aufruf, aber in Ihrem Controller data["username"] = $("#register_email").val(); to data["userName"] = $("#register_email").val();

+0

funktioniert nicht .... – Michael

+0

Ich denke, dass Ihre JSON-Feldnamen nicht übereinstimmen. In deiner Klasse hast du userName und in jquery hast du es als Benutzername. – sparrow

+0

Funktioniert nicht. Es scheint, dass es die Datei mit jQuery nicht sieht, denn wenn die Funktion fehlschlägt, sollte sie den Block "error:" ausführen, richtig? – Michael

0

Sie senden, sagen Sie, dass Ihr Endpunkt akzeptiert nur application/x-www-form-urlencoded.

Sie können Ihren Controller ändern application/json zu akzeptieren:

@RequestMapping(method=RequestMethod.POST, value="/save", headers="Accept=application/json") 

Tippfehler zu vermeiden, können Sie auch die @RequestMapping ‚s consumes Attribut verwenden könnte, und übergeben es eine MediaType Konstante:

@RequestMapping(method=RequestMethod.POST, value="/save", consumes=MediaType.APPLICATION_JSON_VALUE) 

Or Sie können Ihren Ajax-Aufruf umgestalten, um die serialisierten Formulardaten zu senden.

Wie unter @sparrow vorgeschlagen, möchten Sie möglicherweise auch das type-Attribut Ihrer Schaltfläche auf button ändern, um das standardmäßige Browser-Sendeverhalten zu vermeiden. Alternativ können Sie event.preventDefault(); innerhalb Ihrer Click-Handler-Funktion aufrufen, um das gleiche zu erreichen, aber es macht wenig Sinn, type="submit" zu verwenden, es sei denn, Sie möchten das standardmäßige Submit-Verhalten des Browsers verwenden.

+0

Habe es getan. Wenn ich jetzt klicke, passiert nichts, kein Fehler, keine Nachricht in der Konsole. – Michael

+0

Ich sehe aus, als ob die Datei mit jQuery nicht angezeigt wird. Ich weiß nicht warum. – Michael

+0

Es gibt kein Problem, wenn ich versuche, POST-Anfrage an URL:/Speichern mit Postman, es erfolgreich speichern Daten in der DB. – Michael

Verwandte Themen