如何使用urllib将参数添加到POST请求的正文中?

3
我需要使用 urllib 发送以下格式的 POST 请求:
POST /oauth/access_token HTTP/1.1
User-Agent: themattharris' HTTP Client
Host: api.twitter.com
Accept: */*
Authorization: OAuth oauth_consumer_key="cChZNFj6T5R0TigYB9yd1w",
                     oauth_nonce="a9900fe68e2573b27a37f10fbad6a755",
                     oauth_signature="39cipBtIOHEEnybAR4sATQTpl2I%3D",
                     oauth_signature_method="HMAC-SHA1",
                     oauth_timestamp="1318467427",
                     oauth_token="NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0",
                     oauth_version="1.0"
Content-Length: 57
Content-Type: application/x-www-form-urlencoded

oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY

对于标题,我是这样添加的:

AccessRequest = urllib.request.Request('https://api.twitter.com/oauth/access_token')
AccessRequest.add_header('Authorization', oauth_header)

什么是将参数添加到请求体中的正确方式?

现在我正在这样做:

values = {
    'oauth_verifier': verifier
}
data = urllib.parse.urlencode(values).encode('ascii')
resp = urllib.request.urlopen(AccessRequest, data=data)

但是由于服务器返回 HTTP 错误 401:需要授权,所以肯定有些问题。我做错了什么?


使用这个包怎么样? - undefined
这个问题可能看起来与这些问题相似:Python 3 urllib如何进行POST请求? - undefined
因为我正在为一次关于在较低级别学习HTTP的考试而做这个,所以我宁愿手动完成而不是使用那个。 - undefined
@Damotorie 已经尝试将其放在构造函数中,但问题并未解决。也许我做错的地方不在那里?请查看我的其他问题,如果可以确定我以正确的方式添加了data,我会删除这个问题。 - undefined
1个回答

6
from urllib import request, parse
data = parse.urlencode({"data":"Hello Word?"}).encode()
req =  request.Request("http://www.naver.com", data=data) # this will make the method "POST"
resp = request.urlopen(req)

如果运行这段代码,数据包看起来像这样。
POST / HTTP/1.1
Accept-Encoding: identity
Host: www.naver.com
Content-Type: application/x-www-form-urlencoded
Connection: close
Content-Length: 18
User-Agent: Python-urllib/3.4

data=Hello+Word%3F

如果我将data = parse.urlencode({"data":"Hello Word?"}).encode()更改为data = parse.urlencode({"oauth_verifier":"uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY"}).encode(),数据包将如下所示:
POST / HTTP/1.1
Accept-Encoding: identity
Host: www.naver.com
Content-Type: application/x-www-form-urlencoded
Connection: close
Content-Length: 57
User-Agent: Python-urllib/3.4

oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY

这正是您想要的吗?


是的,但 Twitter 服务器似乎仍然没有识别授权,所以我一定是做错了其他事情,这更与我在评论中链接到的另一个问题有关。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接