2016-03-03 5 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 = полезная нагрузка используется вместо params = работа с полезной нагрузкой. Ошибка 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 
Смежные вопросы