2016-03-03 71 views
0

我正在嘗試一些工作代碼並從urlib2更改爲請求。 原始代碼提供用戶名和密碼的基本登錄信息,並將KEY和SECRET發佈到urllib2請求的標頭中。以下代碼是我嘗試更改爲使用請求模塊並獲得用於進行其他API調用的一些功能。我嘗試了數十種組合,並且都返回了代碼400.顯然,我的請求代碼沒有成功提供所需的信息以返回200響應並提供所需的授權令牌。從urllib2遷移到請求python 2.7

## Import needed modules 

import urllib2, urllib, base64 
import httplib 
import requests 
import json 

## initialize variables 

KEY = "7f1xxxx-3xxx-4xxx-9a7f-8be66839dede" 
SECRET = "45xxxxxx-45xxx-469a-9ae9-a7927a76cfeb" 
userName = "[email protected]" 
passWord = "mypassword" 
URL = "https://company.com/auth/token" 
token = None 
sessionid = None 


DATA = urllib.urlencode({"grant_type":"password", 
         "username":userName, 
          "password":passWord}) 

base64string = base64.encodestring('%s:%s' % (KEY, SECRET)).replace('\n', '') 
request = urllib2.Request(URL, DATA) 
request.add_header("Authorization", "Basic %s" % base64string) 
result = urllib2.urlopen(request) 
token = result.read() 
print token 

這會返回我的授權令牌,一切正常。我可以將令牌傳遞給授權服務器,並且可以完全訪問與數據庫交互的API。以下是嘗試使用請求並添加它提供的附加功能。

client = requests.session() 

payload = {"grant_type":"password", 
      "username":userName, 
      "password":passWord, 
      "applicationId": KEY 
      } 

headers = {'content-type':'application/json', 
      "grant_type":"password", 
      "username":userName, 
      "password":passWord, 
      'applicationsId': KEY, 
      'Authorization': base64string, 
      'token': token, 
      'sessionid': sessionid 
      } 

response = client.post(URL, params = payload, headers=headers) 
token = response.content 
print token 
{"error":"invalid_request"} 

print response 
<Response [400]> 

回答

0

如果你想使用基本身份驗證,你應該使用method from requests ..

您的文章應該像

response = client.post(
     URL, 
     params = payload, 
     headers=headers, 
     auth=HTTPBasicAuth(
      KEY, 
      SECRET 
)) 
+0

感謝@stoer示例。我曾嘗試過,仍然以400響應結束。我發現如果使用data = payload而不是params = payload有效。 auth = HTTPBasicAuth沒有幫助或阻礙。 –

0

某處在某條信息的貢獻者,另一個問題卻提到一些項目需要在請求的正文中而不是標題中。我嘗試了各種組合,接下來解決了400響應並完成了我的目標。

data = {"grant_type":"password", 
      "username":userName, 
      "password":passWord, 
      "applicationId": KEY 
      } 

headers = {'Authorization': "Basic %s" % base64string, 
      'token': token 
      } 


response = client.post(URL, data = data, headers=headers) 
token = response.text 
print token