2010-04-12 4 views
6

Je suis novice pour python, je suis en train de devoir tâche donc j'ai besoin de scanner le wifi et envoyer les données au serveur, le ci-dessous est le format que je dois envoyer, ce travail bien quand entrer manuellement dans la boîte de texte URL du navigateur,comment python http demande et la réponse fonctionne

http://223.56.124.58:8080/ppod-web/ProcessRawData?data={"userId":"2220081127-14","timestamp":"2010-04-12 10:54:24","wifi":{"ssid":"guest","rssi":"80"}} 

voici mon code:

import httplib 
import urllib 

params = urllib.urlencode('{\"userId\":\"20081127-14\",\"timestamp\":\"2010-04-12 10:54:24\",\"wifi\":{\"ssid\":\"guest\",\"rssi\":\"80\"}}') 

headers = {"Content-type":"application/x-www-form-urlencoded","Accept":"text/plain"} 
conn = httplib.HTTPConnection("http://223.56.124.58:8080") 
conn.request("POST","ppod-web/ProcessRawData?data=",params,headers) 
response = conn.getresponse() 
print response.status 
print "-----" 
print response.reason 
data = response.read() 
print data 
conn.close() 

grâce

+0

Si vous avez une nouvelle question, merci d'utiliser le bouton 'Nouvelle question'. :) Lien de question original: http://stackoverflow.com/revisions/f7804379-ffed-4ccb-bf96-b60865617396/view-source – badp

+0

Appuyé. Retourné l'édition. –

+0

J'ai besoin d'aide sur la génération de réponse pour faire ma réponse seulement une fois pendant la durée de vie de la charge de classe –

Répondre

10

Très probablement, la question avec le script que vous avez publié dans la question est que vous ne pouvez pas faire directement:

conn=httplib.HTTPConnection("http://223.56.124.58:8080/wireless") 

L'exception est déclenchée dans getaddrinfo(), qui appelle la fonction C getaddrinfo() qui retourne EAI_NONAME:

The node or service is not known; or both node and service are NULL; or AI_NUMERICSERV was specified in hints.ai_flags and service was not a numeric port-number string."

Il y a évidemment un problème avec les paramètres passés à getaddrinfo, et très probablement vous essayez d'obtenir informat ion pour l'hôte "223.56.124.58:8080/wireless". Oups!

En effet, vous ne pouvez pas vous connecter directement à une adresse URL. As the documentation clearly states and shows, connectez-vous au serveur :

conn = httplib.HTTPConnection("223.56.124.58", 8080) 

Ensuite, vous pouvez faire:

conn.request("POST", "wireless", params, headers) 

Qu'en est-le script que vous êtes en fait en utilisant?

conn.request("POST","http://202.45.139.58:8080/ppod-web",params,headers) 

Même si la connexion a été correctement formé, qui vous aurait Affectations à http://202.45.139.58:8080/http://202.45.139.58:8080/ppod-web. Qu'est-ce que vous voulez vraiment est probablement:

conn = httplib.HTTPConnection("202.45.139.58", 8080) 
conn.request("POST", "ppod-web", params, headers) 

L'erreur est affichée pour cette ligne parce que très probablement HTTPConnection est un objet paresseux et tente seulement de se connecter réellement au serveur lorsque vous appelez request().


Une fois que vous avez terminé la fixation ci-dessus, vous devez corriger params.

>>> urllib.urlencode({"wifi":{"ssid":"guest","rssi","80"}}) 
SyntaxError: invalid syntax 
>>> urllib.urlencode({"wifi":{"ssid":"guest","rssi":"80"}}) 
'wifi=%7B%27rssi%27%3A+%2780%27%2C+%27ssid%27%3A+%27guest%27%7D' 

obtenir ce que vous pensez que vous voulez obtenir, vous devez faire:

>>> urllib.urlencode({"data": {"wifi":{"ssid":"guest","rssi":"80"}}}) 
'data=%7B%27wifi%27%3A+%7B%27rssi%27%3A+%2780%27%2C+%27ssid%27%3A+%27guest%27%7D%7D' 
+0

salut bro, i ' m ayant 1 prob, quand j'utilise des données de méthode codées en dur peut envoyer au serveur, mais quand je n'utilise pas la méthode codée en dur je suis gettind erreur comme Traceback (dernier appel dernier): Fichier "scan.py" , ligne 71, dans request.add_data (urllib.urlencode (query_args)) fichier "/usr/lib/python2.6/urllib.py", ligne 1254, en urlencode augmentation TypeError TypeError : non non valide -string séquence ou l'objet de cartographie pouvez-vous m'aider fo r ceci, je change le code pour la référence comme ci-dessus merci – Apache

+0

J'ai besoin de l'aide sur la génération de réponse pour faire ma réponse seulement une fois pendant la durée de la charge de classe –

0

le retraçage ne vient pas du même code que vous avez collé.

Sur le retraçage d'erreur, il y a une ligne:

conn.request("POST","http://202.45.139.58:8080/ppod-web",params,headers) 

Il est la ligne 9 de http.py mais il est pas sur le code que vous avez collé.

Veuillez coller le code actuel.

+1

Merci d'avoir remarqué cela. – badp

+0

désolé nosklo, en fait je suis en train de tester avec des exemples de codes, je me suis trompé de coller, j'ai pu éditer le code, pouvez-vous m'aider pour le poste http pour différents paramètres comme ci-dessus , merci – Apache

1

Au lieu de:

conn = httplib.HTTPConnection("http://223.56.124.58:8080/wireless") 
conn.request("POST", "data", params, headers) 

essayer:

conn = httplib.HTTPConnection("223.56.124.58", port=8080) 
conn.request("POST", "/wireless", params, headers) 

Non sûr que si résoudra tous vos problèmes, mais au moins votre code sera conforme aux signatures de méthode/constructeur.