Question

Pour une méthode POST, les spécifications W3 indiquent:

  

Si une ressource a été créée sur le serveur d'origine, la réponse      DEVRAIT être 201 (Créé) et contenir une entité décrivant la      état de la demande et fait référence à la nouvelle ressource, et un emplacement      en-tête (voir section 10.4).

http: //www.ietf. org / internet-drafts / draft-ietf-httpbis-p2-semantics-05.txt (section 8.5)

La réponse standard semble en réalité être l'envoi d'une redirection à la ressource nouvellement créée.

Je construis mon site avec ASP.NET MVC et j'ai essayé de suivre les spécifications. J'ai donc créé une classe ResourceCreatedResult :

public class ResourceCreatedResult : ActionResult
{
    public string Location { get; set; }
    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.Clear();
        context.HttpContext.Response.StatusCode = 201;
        context.HttpContext.Response.ClearHeaders();
        context.HttpContext.Response.AddHeader("Location", Location);
    }
}

Et mon action ressemble à quelque chose comme ça:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreateNew(string entityStuff)
{
    Entity newEntity = new Entity(entityStuff);
    IEntityRepository entityRepository = ObjectFactory.GetInstance<IEntityRepository>();
    entityRepository.Add(newEntity);

    ActionResult result = new ResourceCreatedResult()
        { Location = Url.Action("Show", new { id = newEntity.Id }) };
    return result;
}

Cependant, IE, Firefox et Chrome ne parviennent pas tous à rediriger leurs ressources vers la nouvelle ressource. Est-ce que je me suis trompé en générant la réponse correcte ou les navigateurs Web ne s'attendent-ils pas à ce type de réponse, se fiant plutôt aux serveurs pour envoyer une réponse de redirection?

Était-ce utile?

La solution

Une redirection après publication ou une publication / redirection / récupération est une tâche indispensable à votre application pour être conviviale.

Modifier . C'est au-delà des spécifications HTTP. Si nous retournons simplement un 201 après un POST, le bouton Précédent du navigateur se comporte mal.

Notez que les demandes de services Web (qui ne répondent PAS à un navigateur) respectent complètement la norme et ne redirigent PAS après la publication.

Cela fonctionne comme ceci.

  1. Le navigateur affiche les données.

  2. Votre application valide les données. S'il n'est pas valide, vous répondez avec le formulaire afin qu'ils puissent le corriger et le POST.

  3. Votre application répond par une redirection.

  4. Le navigateur obtient la redirection et effectue une opération GET.

  5. Votre application voit le GET et y répond.

Maintenant - hop! - le bouton de retour fonctionne.

Autres conseils

Pour être explicite, les navigateurs (y compris les navigateurs modernes tels que Firefox 3 et IE8) ne "prennent pas l’indice". et suivez une réponse HTTP 201: Création avec une demande GET à l’URI fournie dans l’en-tête Location.

Si vous souhaitez que les navigateurs consultent l'URI indiqué dans l'en-tête Location, vous devez plutôt envoyer un statut HTTP 303: voir Autre .

Ma solution consiste à répondre par un message '201 Created' contenant une simple page avec un lien vers la nouvelle ressource et une redirection javascript à l'aide de location.replace ().

Cela permet au même code de fonctionner pour les requêtes d'API et de navigateur, fonctionne bien avec les boutons Retour et Actualiser et se dégrade gracieusement dans les anciens navigateurs.

Comme indiqué dans la spécification, la réponse DEVRAIT être un HTTP 201 avec une redirection. Il n’est donc pas obligatoire pour un fournisseur de navigateur d’implémenter la bonne réponse ...

Vous devriez essayer de passer à un code 30x pour voir s’il est correctement redirigé. Si tel est le cas, il s'agit d'un problème de navigateur. Sinon, cela pourrait provenir de votre code (je ne sais rien dans ASP.NET, je ne peux donc pas "valider" votre code)

Cela ne devrait-il pas compter uniquement lorsque quelque chose est " créé " et donc une simple redirection vers une action devrait être réellement suffisante?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top