使用urllib2的POST请求无法正确发送数据(401错误)

时间:2019-03-18 22:14:51

标签: python post http-headers urllib2

我正在尝试使用urllib2在Python 2中发出POST请求。我的代码当前如下;

url = 'http://' + server_url + '/playlists/upload?'
data = urllib.urlencode(OrderedDict([("sectionID", section_id), ("path", current_playlist), ("X-Plex-Token", plex_token)]))


req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
d = response.read()
print(d)

'url'和'data'返回的变量格式正确,我知道这是因为我可以将其输出复制到Postman中进行检查,并且POST可以正常工作(请参见下面的示例url)

http://192.168.1.96:32400/playlists/upload?sectionID=11&path=D%3A%5CMedia%5CPPP%5Ctmp%5Cplex%5CAmbient.m3u&X-Plex-Token=XXXXXXXXX

运行Python代码时,我返回401错误,大概是由于X-Plex-Token参数未正确发送,因此不允许访问。

谁能告诉我我要去哪里错了?非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您是否尝试过删除问号而不使用OrderedDict(不知道为什么需要这么做)?

url = 'http://' + server_url + '/playlists/upload'
data = urllib.urlencode({"sectionID":section_id), "path":current_playlist,"X-Plex-Token":plex_token})


req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
d = response.read()
print(d)

当然,无论如何,您应该使用请求代替

import requests
r = requests.post('http://{}/playlists/upload'.format(server_url), data = {"sectionID":section_id), "path":current_playlist,"X-Plex-Token":plex_token})
print r.url
print r.text
print r.json

答案 1 :(得分:0)

我最终切换到Python 3,因为我没有意识到默认情况下包括了请求模块。仍然不知道为什么上面的方法不起作用,但是可能与缺少标题有关

headers = {'cache-control': "no-cache"}

编辑: 这就是我现在正在使用的,如上所述,我可能不需要OrderedDict。

import requests

url = 'http://' + server_url + '/playlists/upload'
headers = {'cache-control': "no-cache"}
querystring = urllib.parse.urlencode(OrderedDict([("sectionID", section_id), ("path", current_playlist), ("X-Plex-Token", plex_token)]))

response = requests.request("POST", url, data = "", headers = headers, params = querystring)
print(response.text)