web-dev-qa-db-fra.com

Comment forcer un navigateur Web à utiliser POST quand avoir une url?

Comment forcer un navigateur Web à utiliser POST lors de l'obtention d'une URL?

34
Daniel Kivatinos

Utilisez un formulaire HTML qui spécifie post comme méthode:

<form method="post" action="/my/url/">
    ...
    <input type="submit" name="submit" value="Submit using POST" />
</form>

Si vous aviez pour que cela se produise en tant que lien (non recommandé), vous pourriez avoir un gestionnaire onclick créer de manière dynamique un formulaire et le soumettre.

<script type="text/javascript">
function submitAsPost(url) {
    var postForm = document.createElement('form');
    postForm.action = url;
    postForm.method = 'post';
    var bodyTag = document.getElementsByTagName('body')[0];
    bodyTag.appendChild(postForm);
    postForm.submit();
}
</script>
<a href="/my/url" onclick="submitAsPost(this.href); return false;">this is my post link</a>

Si vous avez besoin de l'appliquer côté serveur, vous devez vérifier la méthode HTTP et, si elle n'est pas égale à POST, envoyer un code de réponse HTTP 405 (méthode non autorisée) en arrière au navigateur et quitter. Cela dépendra de votre langage/framework de programmation, etc.

30
Asaph
<form method="post">

Si vous obtenez une URL, vous l'obtenez, pas le POST. Vous ne pouvez certainement pas faire en sorte qu'un navigateur envoie une demande POST via sa barre d'adresse.

21
Jonathan Feinberg

D'après votre question, j'ai l'impression que vous espériez simplement envoyer une demande de publication dans la barre d'adresse du navigateur.

Il vous suffit de taper ce qui suit dans la barre d’adresse en remplaçant la valeur «action» par l’url que vous préférez.

data:text/html,<body onload="document.body.firstChild.submit()"><form method="post" action="http://stackoverflow.com">

Il est invalide, mais le navigateur (du moins tous ceux que j'ai testés jusqu'à présent) sait ce que vous voulez dire, et je voulais le garder aussi bref que possible.

Si vous souhaitez publier des valeurs, ajoutez autant d'entrées que vous le souhaitez, en remplaçant le nom et la valeur de chaque entrée par ce que vous voulez.

<input value="[email protected]" name="email">
<input value="passwordsavedinhistory" name="password">

Il est important de noter que les informations sensibles que vous publiez seront visibles dans:

  • votre histoire
  • votre barre d'adresse
  • la saisie semi-automatique de votre navigateur.
  • éventuellement d'autres sites que vous visitez depuis le même onglet
  • probablement beaucoup d'autres choses aussi

C'est un très mauvais moyen d'envoyer une demande de publication, et toutes les autres réponses sont bien meilleures, mais c'est quand même cool que vous puissiez le faire.

10
Ryan White

Si vous essayez de tester quelque chose, je vous suggère d'utiliser Fiddler pour créer vos requêtes http. Cela vous permettra de spécifier le verbe d'action (GET, POST, PUT, DELETE, etc.) ainsi que le contenu de la requête. Si vous essayez de tester une demande très spécifique à partir d'un lien mais avec POST à la place, vous pouvez alors surveiller les demandes de votre navigateur et la relâcher uniquement avec l'action POST modifiée.

4
user199845

vous ne pouvez forcer aucun navigateur Web à envoyer l'URL avec l'en-tête POST. Mais pour tester une URL de demande POST, je peux suggérer l'extension "POSTER" de chrome et mozilla

4
yeakbaba

La fonction submitAsPost () ci-dessus est une solution bonne et élégante, mais elle pose un problème - si l'URL est trop longue, certains navigateurs (y compris Firefox et IE) renverront une erreur. Puisque beaucoup d’entre nous utilisent POST pour contourner cette limitation même, je suggère cette solution:

// submit a URL using post
function submitAsPost(url) {
    var bodyTag = document.getElementsByTagName('body')[0];
    var postForm = document.createElement('form');
    bodyTag.appendChild(postForm);
    postForm.method = 'POST';

    var serverAndParams = url.split("?");
    postForm.action = serverAndParams[0];
    var params = null;
    try
    {
      var paramsAndHash = serverAndParams[1].split("#");
      params = paramsAndHash[0]; 
      var attrList = params.split("&");
      for (var i = 0; i < attrList.length; i++)
      {
        try
        {
          var keyValue = attrList[i].split("=");
          var el = document.createElement('input');
          el.type="hidden";
          el.name=keyValue[0];
          var value = keyValue[1];
          value = value.replace(/\+/g, ' ');
          el.value=decodeURIComponent(value);
          postForm.appendChild(el);
        }
        catch(error){}
      } 
    }
    catch(error){}

    postForm.submit();
    bodyTag.removeChild(postForm);
}

Testé avec Firefox, Chrome et IE. 

3
Gregory

Vous pouvez utiliser un outil pour tester. Je pose toujours la même question que vous. Il existe de nombreux outils disponibles en ligne. Voici l'outil que j'utilise: http://www.hurl.it/

2
MarkZ

Je sais que cette question est ancienne mais quelqu'un peut trouver cela utile. Vous pouvez utiliser un outil de ligne de commande tel que cURL ( http://curl.haxx.se/ ) pour publier sur une URL.

Exemple:

curl -v  --basic --user username:password --request POST "http://www.theurltopostto.com"
1
Adam

C’est un peu tard dans le jeu, mais j’ai vu cela et constaté que HTML 5 avait apporté quelques modifications. Vous pouvez utiliser la balise input pour ajouter une méthode de calcul (en sélectionnant ainsi post). Cela a fonctionné pour moi.

voir: http://www.w3schools.com/tags/att_input_formmethod.asp

1
Rodney

Si vous aviez le problème de faire:

request.open('POST',url,true);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send("data="+JSON.stringify(data));

et dans dev tools, vous voyez toujours que vous faites un GET, cela signifie que votre URL est au format suivant:

http://example.com/folder

Ce qui signifie qu'il devrait être:

http://example.com/folder/

C’est une erreur très bizarre qui n’est peut-être pas liée à votre question, mais je l’ai déjà eue quelques fois et cela devrait paraître, car cela a l'air très dangereux. Cela m'est arrivé lors de l'utilisation d'un serveur Apache 2 sur Ubuntu 14.04, avec peu de configuration.

0
zardilior

L'utilitaire " Fiddler " de Telerik (freeware) vous permet de "composer" une requête http et de l'envoyer à l'aide de la méthode de votre choix (Obtenir, Publier, Publier, Supprimer, etc.). informations détaillées sur la demande et la réponse qui peuvent s'avérer très utiles lors des tests et du débogage 

0
Cos Callis