2012-01-19 25 views
13

Tôi đã viết một máy khách HTTP và máy chủ đơn giản trong python để thử nghiệm. Đoạn mã đầu tiên dưới đây cho thấy cách tôi gửi một yêu cầu HTTP nhận được với một tham số cụ thể là imsi. Trong đoạn mã thứ hai, tôi hiển thị việc thực hiện hàm doGet của mình ở phía máy chủ. Câu hỏi của tôi là làm thế nào tôi có thể trích xuất các tham số imsi trong mã máy chủ và gửi một phản ứng lại cho khách hàng để báo hiệu cho khách hàng rằng imsi là hợp lệ. Cảm ơn.Xử lý tham số đầu vào HTTP GET ở phía máy chủ trong python

P .: Tôi đã xác minh rằng khách hàng gửi yêu cầu thành công.

đoạn mã KHÁCH HÀNG

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

đoạn mã MÁY CHỦ

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

bạn không nhận được 'args' được gửi cùng với yêu cầu' GET' chưa? – aayoubi

+0

Liên quan: https://stackoverflow.com/questions/2490162/parse-http-get-and-post-parameters-from-basehttphandler –

Trả lời

23

Bạn có thể phân tích cú pháp truy vấn của một yêu cầu GET sử dụng urlparse, sau đó tách chuỗi truy vấn.

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

Bạn có thể xác nhận điều này bằng cách sử dụng

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

& là một ký tự đặc biệt vỏ ... Cần phải được thoát để lệnh curl của bạn vượt qua cả hai params –

+0

Ah tất nhiên, cảm ơn cho đốm =) –

+1

Với Python 3, sử dụng 'từ urllib.parse import urlparse' source: https://stackoverflow.com/a/5239594/4669135 –

9

BaseHTTPServer là một máy chủ khá ở mức độ thấp. Nói chung, bạn muốn sử dụng một khuôn khổ web thực sự mà loại công việc grunt cho bạn, nhưng kể từ khi bạn yêu cầu ...

Lần đầu tiên nhập một thư viện phân tích cú pháp url. Trong Python 2, x nó là urlparse. (Trong Python3, bạn sẽ sử dụng urllib.parse)

Sau đó, trong phương thức do_get của bạn, phân tích cú pháp chuỗi truy vấn.

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

Ngoài ra, bạn có thể đang sử dụng urllib trong mã khách hàng của mình và có thể sẽ dễ dàng hơn nhiều.

0

cgi mô-đun chứa FieldStorage lớp được cho là được sử dụng trong ngữ cảnh CGI, nhưng dường như cũng dễ dàng được sử dụng trong ngữ cảnh của bạn.