【问题标题】:HTTP Post using urllib vs requests in PythonHTTP Post 使用 urllib 与 Python 中的请求
【发布时间】:2018-01-31 15:19:49
【问题描述】:

我正在尝试在 python3.6.2 中使用需要 HTTP(网络是 https)中的 Post 字段的 web api。 我试过 urllib.request.urlopen 但响应是

urllib.error.HTTPError:HTTP 错误 403:禁止

这是我使用的代码:

from urllib.parse import urlencode
from urllib.request import Request, urlopen
from hashlib import sha256
import time

key = 'xxxxxxxxxx'
secret_key = 'yyyyyyyyyyyy'
nonce = int(time.time())

signature = sha256((key + str(nonce) + secret_key).encode()).hexdigest()

url = "https://xxxxx/api/"
post_fields = {'key': key, 'nonce': nonce,
                'signature': signature}

request = Request(url, data=urlencode(post_fields).encode())
response = urlopen(request).read().decode()

但是我已经用这个代码尝试了requests library:

import requests
from hashlib import sha256
import time

key = 'xxxxxxxxxx'
secret_key = 'yyyyyyyyyyyy'
nonce = int(time.time())

signature = sha256((key + str(nonce) + secret_key).encode()).hexdigest()

url = "https://xxxxx/api/"
post_fields = {'key': key, 'nonce': nonce,
                        'signature': signature}
response = requests.post(url, post_fields)

它有效。 我真的很想知道不同之处,因为 urllib.request 可以在指定 data 参数时发送 post 请求。

【问题讨论】:

    标签: python


    【解决方案1】:

    两个 sn-ps 代码都发送正确的 POST 请求。它们之间的唯一区别是发送的标头。除了完全一样的headers,urllib.request会发送:

    Accept-Encoding: identity
    User-Agent: Python-urllib/3.6
    

    requests 将发送:

    Accept: */*
    Accept-Encoding: gzip, deflate
    User-Agent: python-requests/2.18.1
    

    您必须尝试在 urllib.request 代码中添加和更改标头,看看这些是否重要。

    您可以随时使用http://httpbin.org/post 作为 URL 来查看您发布的信息;该服务回显它作为 JSON 对象接收到的内容。请参阅http://httpbin.org 了解更多信息。

    【讨论】:

    • 我已更改为关键参数(我只是不想显示真实的变量名称)。我将尝试更改 urllib.request 发送的标头。谢谢你的回答。
    猜你喜欢
    • 2016-07-28
    • 2015-01-18
    • 1970-01-01
    • 2017-11-28
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多