2014-05-15 3 views
0

J'essaye de remplir une base de données avec les résultats obtenus par mon script python. J'envoie les données gzippées dans la requête POST. Un script PHP agit au milieu comme des services Web et a besoin d'extraire les données gzip et d'obtenir 'sql-query' et d'effectuer le processus supplémentaire.Comment extraire une requête POST gzip en PHP envoyé via Python

C'est ce que je suis en train de faire sur le côté Python:

Sending a POST request using urllib: 

# Data to be sent in POST request, it can be a SQL UPDATE/INSERT or SELECT 
dictheaders = {'sql': "UPDATE 'logs' SET 'some_value' = Failed"} 

# Encode the data 
data = urllib.urlencode(dictheaders) 

# Gzip compress the encoded data 
IO = StringIO.StringIO() 
gzip_data = gzip.GzipFile(fileobj=IO, mode='w') 
gzip_data.write(data) 
gzip_data.close() 
gzip_data = IO.getvalue() 

# This is the POST request being sent to a PHP web services file which 
# needs to extract the gzipped query and then execute the query on SQL 
f = urllib2.urlopen('http://x.x.x.x/example.php', gzip_data) 

Voici les changements que j'ai essayé sur le côté PHP:

$postdata = file_get_contents("php://input"); 
$a = gzinflate(substr(substr($postdata, 10), 0, -8)); 
$sql = $a['sql']; 

Le code ci-dessus ne semble pas être compatible avec mon code Python. Est-ce la bonne façon d'extraire la requête gzip POST en PHP?

+0

La plupart des serveurs Web gèrent eux-mêmes la compression. Du côté de Python: http://stackoverflow.com/a/3947241/539465 –

+0

Vous rendez-vous compte que vous essayez d'envoyer l'objet 'set' en tant qu'en-tête (' dictheaders = {'sql', 'SELECT * FROM employees'} 'est un' set')? – vaultah

Répondre

1

Vous avez utilisé gzip.GzipFile, qui écrit un en-tête de fichier gzip dont vous avez besoin pour supprimer les données avant de les transmettre au gzinflate; puis, par l'apparence de votre code, vous voulez sans doute faire quelque chose comme parse_str là-dessus:

$str = gzinflate(substr($postdata, 10, -8)); 
parse_str($str, $a); 
echo $a['sql']; 

Aussi, dans votre code Python, il y a soit une faute de frappe ou une erreur fondamentale sur cette ligne:

dictheaders = {'sql', 'SELECT * FROM employees'}

Essayez ceci:

dictheaders = {'sql': 'SELECT * FROM employees'}

+0

Ce qui manquait ':' était une faute de frappe, BTW changements suggérés par vous avez travaillé pour moi. Merci. – user1945383

+0

Vous devriez également regarder la réponse de Ryan P. - il vaudrait mieux ne jamais ajouter l'en-tête du fichier. – TML

+1

Oui De toute évidence, j'ai aussi regardé la suggestion de Ryan. J'ai essayé cela et semble fonctionner correctement. – user1945383

1

Essayer de remplacer ceci:

# Gzip compress the encoded data 
IO = StringIO.StringIO() 
gzip_data = gzip.GzipFile(fileobj=IO, mode='w') 
gzip_data.write(data) 
gzip_data.close() 
gzip_data = IO.getvalue() 

avec ceci:

gzip_data = zlib.compress(data) 

Pas besoin de faire un fichier gzip quand tout ce que vous voulez vraiment est de compress les données. Le côté PHP est bon, il suffit de supprimer le substr car ils ne sont plus nécessaires. Cependant, vous traitez la chaîne non compressée comme un tableau, ce qui ne fonctionnera pas. Vous devez décoder la chaîne de requête du côté PHP. Personnellement, j'utilise simplement JSON pour ce genre de choses.

Questions connexes