J'ai écrit un simple client et serveur HTTP en Python pour expérimenter. Le premier extrait de code ci-dessous montre comment j'envoie une demande HTTP GET avec un paramètre nommé imsi. Dans le deuxième extrait de code, je montre mon do_Get implémentation de la fonction côté serveur. Ma question est de savoir comment extraire le paramètre imsi dans le code serveur et renvoyer une réponse au client afin de signaler au client que imsi est valide.
Merci.
P.S .: J'ai vérifié que le client envoie la demande avec succès.
extrait de code CLIENT
params = urllib.urlencode({'imsi': str(imsi)})
conn = httplib.HTTPConnection(Host + ':' + str(port))
#conn.set_debuglevel(1)
conn.request("GET", "/index.htm", 'imsi=' + str(imsi))
r = conn.getresponse()
extrait de code SERVER
import sys, string, cStringIO, cgi, time, datetime
from os import curdir, sep
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
class MyHandler(BaseHTTPRequestHandler):
# I want to extract the imsi parameter here and send a success response to
# back to the client.
def do_GET(self):
try:
if self.path.endswith(".html"):
#self.path has /index.htm
f = open(curdir + sep + self.path)
self.send_response(200)
self.send_header('Content-type','text/html')
self.end_headers()
self.wfile.write("<h1>Device Static Content</h1>")
self.wfile.write(f.read())
f.close()
return
if self.path.endswith(".esp"): #our dynamic content
self.send_response(200)
self.send_header('Content-type','text/html')
self.end_headers()
self.wfile.write("<h1>Dynamic Dynamic Content</h1>")
self.wfile.write("Today is the " + str(time.localtime()[7]))
self.wfile.write(" day in the year " + str(time.localtime()[0]))
return
# The root
self.send_response(200)
self.send_header('Content-type','text/html')
self.end_headers()
lst = list(sys.argv[1])
n = lst[len(lst) - 1]
now = datetime.datetime.now()
output = cStringIO.StringIO()
output.write("<html><head>")
output.write("<style type=\"text/css\">")
output.write("h1 {color:blue;}")
output.write("h2 {color:red;}")
output.write("</style>")
output.write("<h1>Device #" + n + " Root Content</h1>")
output.write("<h2>Device Addr: " + sys.argv[1] + ":" + sys.argv[2] + "</h1>")
output.write("<h2>Device Time: " + now.strftime("%Y-%m-%d %H:%M:%S") + "</h2>")
output.write("</body>")
output.write("</html>")
self.wfile.write(output.getvalue())
return
except IOError:
self.send_error(404,'File Not Found: %s' % self.path)
Vous pouvez analyser la requête d'une demande GET en utilisant urlparse, puis diviser la chaîne de requête.
from urlparse import urlparse
query = urlparse(self.path).query
query_components = dict(qc.split("=") for qc in query.split("&"))
imsi = query_components["imsi"]
# query_components = { "imsi" : "Hello" }
# Or use the parse_qs method
from urlparse import urlparse, parse_qs
query_components = parse_qs(urlparse(self.path).query)
imsi = query_components["imsi"]
# query_components = { "imsi" : ["Hello"] }
Vous pouvez le confirmer en utilisant
curl http://your.Host/?imsi=Hello
BaseHTTPServer est un serveur assez bas niveau. En général, vous voulez utiliser un véritable framework web qui fait ce genre de travail de grognement pour vous, mais puisque vous avez demandé ...
Importez d'abord une bibliothèque d'analyse d'url. Dans Python 2, x c'est rlparse . (Dans Python3, vous utiliseriez rllib.parse )
import urlparse
Ensuite, dans votre méthode do_get, analysez la chaîne de requête.
imsi = urlparse.parse_qs(urlparse.urlparse(self.path).query).get('imsi', None)
print imsi # Prints None or the string value of imsi
De plus, vous pourriez utiliser rllib dans votre code client et ce serait probablement beaucoup plus facile.
Le module cgi
contient la classe FieldStorage
qui est censée être utilisée dans le contexte CGI, mais semble également être facilement utilisée dans votre contexte.