2012-01-19 11 views
13

Escribí un cliente y servidor HTTP simple en python para experimentar. El primer fragmento de código a continuación muestra cómo envío una solicitud de obtención de HTTP con un parámetro, es decir, imsi. En el segundo fragmento de código, muestro la implementación de mi función doget en el servidor. Mi pregunta es cómo puedo extraer el parámetro imsi en el código del servidor y enviar una respuesta al cliente para indicarle al cliente que imsi es válido. Gracias.Procesando el parámetro de entrada HTTP GET en el lado del servidor en python

P.S .: Comprobé que el cliente envía la solicitud con éxito.

código de cliente fragmento

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() 

código del servidor fragmento

import sys, string,cStringIO, cgi,time,datetime 
from os import curdir, sep 
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 

class MyHandler(BaseHTTPRequestHandler): 

# I WANT TO EXTRACT 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) 
+0

¿No obtiene el 'args' enviado con la solicitud' GET'? – aayoubi

+0

Relacionado: https://stackoverflow.com/questions/2490162/parse-http-get-and-post-parameters-from-basehttphandler –

Respuesta

23

Puede analizar la consulta de una solicitud GET usando urlparse, a continuación, dividir la cadena de consulta.

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"] } 

Puede confirmar esto utilizando

curl http://your.host/?imsi=Hello 
+1

& es un personaje especial de shell ... Necesita ser escapado para que su comando curl pase ambos params –

+0

Ah, por supuesto, gracias por detectar que =) –

+1

Con Python 3, use 'from urllib.parse import urlparse' fuente: https://stackoverflow.com/a/5239594/4669135 –

9

BaseHTTPServer es un servidor muy bajo nivel. En general, desea utilizar un marco web real que funcione para usted, pero desde que lo solicitó ...

Primero importe una biblioteca de análisis url. En Python 2, x es urlparse. (En python3, tendrá que utilizar urllib.parse)

import urlparse 

Luego, en el método de do_get, analizar la cadena de consulta.

imsi = urlparse.parse_qs(urlparse.urlparse(self.path).query).get('imsi', None) 
print imsi # Prints None or the string value of imsi 

También, usted podría estar utilizando urllib en su código de cliente y que probablemente sería mucho más fácil.

0

cgi módulo contiene FieldStorage clase que se supone que se utiliza en el contexto CGI, pero parece ser fácil de usar en su contexto también.

Cuestiones relacionadas