2009-11-12 6 views
0

J'utilise HTTP POST pour appeler un script cgi sur un serveur Web et envoyer des données en tant qu'arguments. Certains des arguments peuvent contenir un peu de données. Cela semble être un problème pour le serveur Web et je reçois l'erreur 414 (demande URI trop long) en conséquence.HTTP POST Erreur 414

Mon URI se termine à la recherche quelque chose comme ceci: http://somewebsite.com/cgi-bin/dosomething.py?function=doitnow&data=this est beaucoup de données et le serveur va se plaindre ...

est-il une autre façon pour moi d'appeler un script cgi sur un serveur Web et passez-lui une longue ficelle?

Merci.

Répondre

1

Vous n'envoyez pas votre demande en tant que POST si les données se retrouvent dans l'URL. Avec un POST, la demande ressemble à ceci (incomplet):

POST/HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 10 

data=Hello 

Mais l'URL regarderait toujours comme http://somewebsite.com/cgi-bin/dosomething.py.

À quoi ressemble la source de votre demande? Le HTML, c'est-à-dire, ou vous le mettez ensemble.

+1

Il n'y a rien intrinsèque à la méthode POST qui exige que tous les paramètres Les données doivent figurer dans le corps de la requête au lieu de la chaîne de requête. Un navigateur le fera avec des valeurs de champs de formulaire, oui. Et souvent, vous postez des choses comme des fichiers qui ne fonctionnent que dans le corps. Mais ce n'est pas vrai que "s'il y a des données dans l'URL, ce n'est pas une requête POST". –

+0

@Sixten: C'est un pari sûr, dans ce cas, et il semble que j'avais raison. Point pris, cependant. :) –

0

Vous devez effectuer une requête POST au lieu d'une requête GET.

0

Etes-vous sûr d'utiliser POST? On dirait une demande GET à moi.

<form method="post" action="....py"> <input type="hidden" name="function" value="doitnow"> <input type="hidden" name="data" value="data"> // dont forget the submit button </form>

1

Il y a plusieurs façons de le faire, en se fondant sur le fait que vous avez accès au CGI qui reçoit la demande. La meilleure option est d'envoyer votre data comme POST au lieu de GET. Si vous ne pouvez pas le faire pour une raison quelconque, vous pouvez essayer d'envoyer vos données avec une sorte de compression et de les décompresser au CGI. Si la communication se produit entre deux serveurs, le premier serveur peut enregistrer data dans un fichier et envoyer le nom de fichier au deuxième serveur, de sorte que le CGI récupère ce fichier au lieu de lire les données de l'URL.

Vous pouvez adapter le CGI pour recevoir les données en plusieurs parties, diviser les données et marquer chaque demande avec une autre variable, comme function=doitnow&data=bytes&chunk=1&total=2&id=somekey, function=doitnow&data=more-data&chunk=2&total=2&id=somekey

Comme je ne l'utilise pas vraiment trop Python, je ne » t savoir comment gérer POST ou GET valeurs, juste si est le cas, ci-dessous est un wrapper pour passer POST et GET valeurs à un script php:

#!/bin/sh 

echo "Content-Type: text/html;" 
echo 
echo 

#POST=`dd count=$CONTENT_LENGTH bs=1 2> /dev/null` 
POST=`dd bs=1 2> /dev/null` 
php -f 'dosomething.php' -- "$POST" "$QUERY_STRING"