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

问题描述 投票:0回答:2

我正在尝试使用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参数未正确发送,因此我不允许访问。

谁能告诉我哪里出错了?非常感谢帮助。

python post http-headers urllib2
2个回答
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

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)
© www.soinside.com 2019 - 2024. All rights reserved.