Запросы получили ошибку, но работают в Graph Explorer
Я получаю сообщение об ошибке 404 при попытке изменить приложение python-sample-console-app для изучения MS Graph API. Однако HTTP-запросы отлично работают в MS Graph Explorer.
Я думаю, что я сделал одинаковые разрешения на доступ к файлам для MS Graph Explorer и моего приложения. Разрешения включают в себя Files.ReadWrite.All, Sites.ReadWrite.All, openid, People.Read.
import config
def api_endpoint(url):
if urllib.parse.urlparse(url).scheme in ['http', 'https']:
return url # url is already complete
return urllib.parse.urljoin(f'{config.RESOURCE}/{config.API_VERSION}/',
url.lstrip('/'))
def device_flow_session(client_id, auto=False):
ctx = AuthenticationContext(config.AUTHORITY_URL, api_version=config.API_VERSION)
device_code = ctx.acquire_user_code(config.RESOURCE, client_id)
# display user instructions
if auto:
pyperclip.copy(device_code['user_code']) # copy user code to clipboard
webbrowser.open(device_code['verification_url']) # open browser
print(f'The code {device_code["user_code"]} has been copied to your clipboard, '
f'and your web browser is opening {device_code["verification_url"]}. '
'Paste the code to sign in.')
else:
print(device_code['message'])
token_response = ctx.acquire_token_with_device_code(config.RESOURCE,
device_code,
client_id)
if not token_response.get('accessToken', None):
return None
session = requests.Session()
session.headers.update({'Authorization': f'Bearer {token_response["accessToken"]}',
'SdkVersion': 'sample-python-adal',
'x-client-SKU': 'sample-python-adal'})
return session
def get_request (session, endpoint):
print ('\n------GET--------\n')
the_response = session.get(api_endpoint(endpoint), stream=True)
print (str(the_response.json()))
status_code = the_response.status_code
print (f'<Response [{status_code}]>')
def mytest ():
GRAPH_SESSION = device_flow_session(config.CLIENT_ID)
if not GRAPH_SESSION:
return
endpoint = 'https://graph.microsoft.com/v1.0/sites/xxxx:/xxxx'
get_request (GRAPH_SESSION, endpoint)
endpoint = 'https://graph.microsoft.com/v1.0/sites/xxxx/drives/<drive_id_1>/root:/<existing_path>/'
get_request (GRAPH_SESSION, endpoint)
endpoint = 'https://graph.microsoft.com/v1.0/drives/<drive_id_1>/items/<item_id_1>/'
get_request (GRAPH_SESSION, endpoint)
if __name__ == '__main__':
mytest ()
Вывод из моего скрипта Python:
------GET--------
Response [200]
------GET--------
{'error': {'code': 'itemNotFound', 'message': 'The resource could not be found.', 'innerError': {'request-id': '2636b686-b1db-4e2f-8f03-0e750e3de008', 'date': '2019-08-24T06:18:10'}}}
<Response [404]>
------GET--------
{'error': {'code': 'itemNotFound', 'message': 'The resource could not be found.', 'innerError': {'request-id': '91bc2e7d-4366-4ffc-bed8-386c7a9861dd', 'date': '2019-08-24T06:18:12'}}}
<Response [404]>
Ответы из Graph Explorer на последние 2 запроса:
Success - Status Code 200
Изменить: Кажется, что мой код не может найти какие-либо элементы в drive_id_1. Я знаю это, потому что я попробовал этот запрос:
GET https://graph.microsoft.com/v1.0/drives/<drive_id_1>/root/children
поле "значение" в ответе пустое
{'@odata.context': "https://graph.microsoft.com/v1.0/$metadata#drives('<drive_id_1>')/root/children", 'value': []}
Но с Graph Explorer, поле правильно, как я ожидал
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#drives('<drive_id_1>')/root/children",
"value": [
{
"createdDateTime": "2018-12-20T18:04:06Z",
"eTag": "\"{xxxx},1\"",
"id": "xxxx",
"lastModifiedDateTime": "2018-12-20T18:04:06Z",
"name": "xxxx",
"webUrl": "xxxx",
"cTag": "\"c:{xxxxx},0\"",
"size": 545056,
"createdBy": {
"user": {
"email": "xxxx",
"id": "xxxx",
"displayName": "xxxx"
}
},
....
},
....
]
}
Почему мой код не может делать то же самое, что и Graph Explorer? У меня есть достаточные разрешения?