我正在构建一个家庭网络电台服务器。基本上,设备与我的家庭服务器通信,将请求重定向到真正的网络无线电服务器。我解析返回的HTML以更改播放按钮的绑定,使它们在主服务器而不是设备上播放。它运作得很好。
我使用tornado
,我的主要处理程序是:
class MainHandler(tornado.web.RequestHandler):
def get(self, url):
query = ''
if self.request.query:
query = '?' + self.request.query
url = base_url + urllib.request.quote(url) + query # base url is the real server address
raw_data = opener.open(url).read()
data = filter_data(raw_data) # parse HTML with Beautiful soup
self.write(data)
def post(self, url): # exclusively AJAX calls
url = base_url + urllib.request.quote(url)
request = urllib.request.Request(url, data=self.request.body, method='POST')
data = opener.open(request).read().decode('utf-8')
try:
json.loads(data)
self.set_header('Content-Type', 'application/json')
except json.decoder.JSONDecodeError:
self.set_header('Content-Type', 'text/html; charset=utf-8')
self.write(data)
开场白是必需的:
cj = CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
我不明白它是如何工作的:我使用urllib.request
构建的请求没有标题,那么远程服务器如何回复?
问题在于它仅适用于Tornado请求的上下文。如果我尝试在它之外做同样的事情,它就不起作用了:
def get_song(radioUID):
url = base_url + 'fr/OnAir/GetCurrentSong' # same url that works in tornado
data = bytes(json.dumps({ 'radioUID': radioUID}), encoding='utf-8')
request = urllib.request.Request(url, data=data, method='POST')
response = opener.open(request).read().decode('utf-8')
print(response)
答案总是'false'
而不是预期的json对象。任何人都可以帮助我吗?