Trong khi có nhiều cách để xử lý authentication in urllib2, nếu bạn làm cơ bản ủy quyền (có nghĩa là gửi một cách hiệu quả tên người dùng và mật khẩu trong văn bản rõ ràng) sau đó bạn có thể làm tất cả những gì bạn muốn với một urllib2.Request và urllib2.urlopen:
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)
tôi thử nghiệm này với netcat vì vậy tôi có thể thấy rằng dữ liệu được gửi là, ngoại trừ thứ tự sắp xếp, giống hệt nhau trong cả hai trường hợp. Dưới đây là người đầu tiên đã được thực hiện với curl và lần thứ hai với 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
(này là hơi tinh chỉnh từ đầu ra. Trường hợp thử nghiệm của tôi không sử dụng đường dẫn url mà bạn đã dùng.)
Không có cần sử dụng httplib cơ bản, không hỗ trợ những thứ mà urllib2 cung cấp cho bạn như hỗ trợ proxy. Mặt khác, tôi thấy urllib2 phức tạp bên ngoài loại yêu cầu đơn giản này và nếu bạn muốn hỗ trợ tốt hơn cho các tiêu đề nào được gửi và thứ tự chúng được gửi thì sử dụng httplib.
Nguồn
2010-01-02 21:19:03
Tới đây - http://stackoverflow.com/questions/4348061/how-to-use-python-urllib2-to-send-json- data-for-login/7469725 # 7469725 – treecoder