虽然有一些方法可以处理authentication in urllib2,但如果您正在执行基本授权(这意味着以明文形式有效地发送用户名和密码),那么您可以使用 urllib2.Request 和 urllib2 完成所有您想做的事情。网址打开:
import urllib2
def basic_authorization(user, password):
s = user + ":" + password
return "Basic " + s.encode("base64").rstrip()
req = urllib2.Request("http://localhost:8000/36576/speak.json",
headers = {
"Authorization": basic_authorization("7898678", "X"),
"Content-Type": "application/json",
# Some extra headers for fun
"Accept": "*/*", # curl does this
"User-Agent": "my-python-app/1", # otherwise it uses "Python-urllib/..."
},
data = '{"message":{"body":"TEXT"}}')
f = urllib2.urlopen(req)
我使用netcat 对此进行了测试,因此我可以看到发送的数据除了排序顺序外,在两种情况下都是相同的。这里第一个是用 curl 完成的,第二个是用 urllib2 完成的
% nc -l 8000
POST /36576/speak.json HTTP/1.1
Authorization: Basic Nzg5ODY3ODpY
User-Agent: curl/7.19.4 (universal-apple-darwin10.0) libcurl/7.19.4 OpenSSL/0.9.8k zlib/1.2.3
Host: localhost:8000
Accept: */*
Content-Type: application/json
Content-Length: 27
{"message":{"body":"TEXT"}} ^C
% nc -l 8000
POST /36576/speak.json HTTP/1.1
Accept-Encoding: identity
Content-Length: 27
Connection: close
Accept: */*
User-Agent: my-python-app/1
Host: localhost:8000
Content-Type: application/json
Authorization: Nzg5ODY3ODpY
{"message":{"body":"TEXT"}}^C
(这从输出中略有调整。我的测试用例没有使用您使用的相同 url 路径。)
没有必要使用底层的 httplib,它不支持 urllib2 给你的东西,比如代理支持。另一方面,我确实发现 urllib2 在这种简单的请求之外很复杂,如果您想要更好地支持发送哪些标头以及发送它们的顺序,请使用 httplib。