jQuery - La requête Ajax renvoie 200 OK mais l'événement d'erreur est déclenché?
Passez en revue un formulaire jQuery Ajax soumettre.
$(document).ready(function () { $("#hostingForm").submit(function (e) { e.preventDefault(e); var data = {} data["id"] = $("#id").val(); data["domain"] = $("#domain").val(); data["name"] = $("#name").val(); //... $.ajax({ type: "POST", contentType: "application/json", url: "{{home}}/hosting/update", data: JSON.stringify(data), dataType: 'json', timeout: 600000, success: function (data) { console.log("SUCCESS: ", data); }, error: function (e) { console.log("ERROR: ", e); } }); }); });
Passez en revue le côté serveur (Spring MVC) pour recevoir la requête Ajax.
@RestController @RequestMapping("/hosting") public class AdminHostingController { @Autowired HostingBo hostingBo; @RequestMapping(value = "/update", method = RequestMethod.POST) public String updateHosting(@RequestBody HostingForm hostingForm) { if(hostingForm!=null){ hostingBo.update(hostingForm, UpdatedBy.WEB); } return "success"; }
Le code Spring MVC ci-dessus fonctionne correctement, a mis à jour la base de données et renvoie une chaîne de "réussite".
1. Problème
Le côté client (soumission de formulaire jQuery Ajax) et le côté serveur (Spring MVC) fonctionnent correctement, mais l'événement d'erreur Ajax est déclenché?
Consultez la sortie suivante dans la console du navigateur:
ERROR: Object {readyState: 4, responseText: "success", status: 200, statusText: "OK"}
200 OK mais l'événement d'erreur est déclenché?
2. Solution
Dans jQuery.ajax()
, si le paramètredataType: 'json'
est spécifié, le serveur doit renvoyer une chaîne au format JSON valide, sinon une erreur est générée.
Note
Examinez la déclaration suivante desjQuery Ajax documentation – dataType
settings officiels:
«… Les données JSON sont analysées de manière stricte; tout JSON mal formé est rejeté et une erreur d'analyse est générée… »
To fix this, mettez à jour le côté serveur pour renvoyer une chaîne au format JSON:
@RestController @RequestMapping("/hosting") public class AdminHostingController { @Autowired HostingBo hostingBo; @RequestMapping(value = "/update", method = RequestMethod.POST) public String updateHosting(@RequestBody HostingForm hostingForm) { if(hostingForm!=null){ hostingBo.update(hostingForm, UpdatedBy.WEB); } //NEED JSON format return "{\"msg\":\"success\"}"; //return "success"; }
Réessayez, examinez à nouveau la console du navigateur, l'événement «succès» est déclenché.
SUCCESS: Object {msg: "success"}