在python中处理服务器端的HTTP GET输入参数

ykejflvf  于 2023-01-01  发布在  Python
关注(0)|答案(4)|浏览(213)

我用Python编写了一个简单的HTTP客户端和服务器,下面的第一个代码片段显示了我如何发送一个带有imsi参数的HTTP GET请求。在第二个代码片段中,我展示了我在服务器端的do_Get函数实现。我的问题是我如何从服务器代码中提取imsi参数,并向客户端发送一个响应,以通知客户端imsi是有效的。
谢谢。
P.S.:我验证了客户端成功发送请求。

    • 客户端代码片段**
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()
    • 服务器代码片段**
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)
ar7v8xwq

ar7v8xwq1#

您可以使用urlparse解析GET请求的查询,然后拆分查询字符串。

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

您可以使用以下命令对此进行确认

curl http://your.host/?imsi=Hello
vx6bjr1n

vx6bjr1n2#

BaseHTTPServer是一个相当低级的服务器。通常你想使用一个真实的的Web框架来为你做这种繁重的工作,但是既然你问了...
首先导入一个url解析库,在Python 2中,x是urlparse(在Python 3中,你会使用urllib.parse

import urlparse

然后,在do_get方法中解析查询字符串。

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

此外,您可以在客户机代码中使用urllib,这可能会容易得多。

nwsw7zdq

nwsw7zdq3#

cgi模块包含FieldStorage类,该类应该在CGI上下文中使用,但似乎也很容易在您的上下文中使用。

vatpfxk5

vatpfxk54#

如果在大多数情况下不想导入其他库,可以用途:

i = self.path.index ( "?" ) + 1
params = dict ( [ tuple ( p.split("=") ) for p in self.path[i:].split ( "&" ) ] )

相关问题