【问题标题】:POST request using urllib2 doesn't correctly send data (401 error)使用 urllib2 的 POST 请求未正确发送数据(401 错误)
【发布时间】:2019-08-09 09:10:14
【问题描述】:

我正在尝试使用 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


    【解决方案1】:

    您是否尝试过删除问号而不使用 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
    

    【讨论】:

    • 是的,无论哪种方式,问号都没有区别,OrderedDict 是为了确保令牌是最后一个参数,否则它会对它们进行排序,因此部分 id 位于末尾,我认为这可能会导致问题。
    • 这不是 API 的工作方式。键的顺序无关紧要。您也应该尝试使用requests。我将它用于所有非 SSL 的 API,并且效果很好。
    【解决方案2】:

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

    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)
    

    【讨论】:

    • 我添加了一个请求示例。
    • 感谢更新,我使用了一种稍微不同的方法,仍在使用请求,我已经在上面发布了,以防一个有效,另一个不适用于任何用例
    • 我很困惑……你的还是我的?你发现了什么?
    • 我认为两者都有效 - 我的帖子有效,并且我已经切换到与您的类似的代码 - 似乎只有几种方法可以实现这一目标。
    猜你喜欢
    • 2018-05-26
    • 1970-01-01
    • 2018-05-14
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    相关资源
    最近更新 更多