我有一个存储在变量request_str中的字符串,我想将该数据传递给SimpleHTTP python Web服务器。我不确定如何将我拥有的AJAX实际连接到simpleHTTP服务器。
这是我到目前为止设置的ajax
$.ajax({
url: "SOMEPLACE",
data: {
"key": request_str.toUpperCase()
}
});
这是我正在使用的SimpleHTTP服务器的python代码。
"""
Serves files out of its current directory
Dosen't handle POST request
"""
import SocketServer
import SimpleHTTPServer
PORT = 9090
def move():
""" sample function to be called via a URL"""
return 'hi'
class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_GET(self):
#Sample values in self for URL: http://localhost:9090/jsxmlrpc-0.3/
#self.path '/jsxmlrpc-0.3/'
#self.raw_requestline 'GET /jsxmlrpc-0.3/ HTTP/1.1rn'
#self.client_address ('127.0.0.1', 3727)
if self.path=='/move':
#This URL will trigger our sample function and send what it returns back to the browser
self.send_response(200)
self.send_header('Content-type','text/html')
self.end_headers()
self.wfile.write(move()) #call sample function here
return
else:
#serve files, and directory listings by following self.path from
#current working directory
SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
httpd = SocketServer.ThreadingTCPServer(('localhost', PORT),CustomHandler)
print "serving at port", PORT
httpd.serve_forever()
我问如何使用GET进行设置的原因是因为服务器的设置方式。如果我能得到明确的解释,我愿意接受建议并将其更改为POST。有人告诉我,我应该json数据,但我不确定这意味着什么。
期待您的帮助!
答案 0 :(得分:1)
我假设您正在使用JQuery,因为该$函数。参考JQuery文档:http://api.jquery.com/jquery.ajax/
会很有帮助url字段是请求发送到的位置。与任何网址一样,您可以直接在网址中输入GET变量:
$.ajax() { url: 'SOMEPLACE?foo=bar&hello=world };
但是JQuery ajax对象也有一个数据字段。从文档页面:“[数据字段]转换为查询字符串,如果还不是字符串。它将附加到GET请求的URL”。因此,提交请求的另一种方式,也就是json的数据意味着:
$.ajax() { url: 'SOMEPLACE', data: {foo: 'bar', hello: 'world'}};
另请注意,默认情况下,JQuery ajax请求是GET。您可以使用类型字段更改它。
$.ajax() { url: 'SOMEPLACE', data: {var1: 'val1', var2: 'val2'}, type: 'POST'};
至于服务器端python: 我不认为服务器正在寻找获取变量。它只是基于url中的路径的条件。因此,如果您通过JavaScript正确发送GET并且没有获得行为 - 那是因为服务器端缺少逻辑。
SimpleHTTPServer似乎就是这么简单。因此,为了提取GET变量,您将不得不进行一些字符串解析。考虑一些url解析函数:https://docs.python.org/2/library/urlparse.html#urlparse.parse_qs
答案 1 :(得分:1)
对于前端AJAX调用,Toby很好地总结了它。如果您想要执行GET请求,请执行
$.get("http://localhost:9090/endpoint?thing1=val", ....
然后在服务器端,你需要添加一些东西
"""
Serves files out of its current directory
Dosen't handle POST request
"""
import SocketServer
import SimpleHTTPServer
from urlparse import urlparse
PORT = 9090
def move():
""" sample function to be called via a URL"""
return 'hi'
class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_GET(self):
#Sample values in self for URL: http://localhost:9090/jsxmlrpc-0.3/
#self.path '/jsxmlrpc-0.3/'
#self.raw_requestline 'GET /jsxmlrpc-0.3/ HTTP/1.1rn'
#self.client_address ('127.0.0.1', 3727)
# Split get request up into components
req = urlparse(self.path)
# If requesting for /move
if req.path =='/move':
#This URL will trigger our sample function and send what it returns back to the browser
self.send_response(200)
self.send_header('Content-type','text/html')
self.end_headers()
self.wfile.write(move()) #call sample function here
return
else:
#serve files, and directory listings by following self.path from
#current working directory
SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
# Else if requesting /endpoint
elif req.path == '/endpoint':
# Print request query
print req.query
# Do other stuffs...
httpd = SocketServer.ThreadingTCPServer(('localhost', PORT),CustomHandler)
print "serving at port", PORT
httpd.serve_forever()
基本上,您只需要添加区分GET请求的方法和解析它们发送的查询数据的方法。 urlparse模块对此有帮助。有关如何使用它的更多文档,请参阅https://docs.python.org/2/library/urlparse.html