Getting Only https scheme with a valid host are supported when calling sites.with_url().get()
Reporting an Issue or Missing Feature
When attempting to get a SharePoint site a Kiota authentication error is thrown.
Expected behavior
A site object should be returned.
Actual behavior
The following error is thrown:
kiota_authentication_azure._exceptions.HTTPError: Only https scheme with a valid host are supported
Steps to reproduce behavior
import asyncio
from azure.identity.aio import ClientSecretCredential
from kiota_abstractions.api_error import APIError
from msgraph import GraphServiceClient
#############################################################################################################
#Declare Variables
#############################################################################################################
client_id = ""
client_secret = ""
scopes = ['https://graph.microsoft.com/.default']
tenant_id = ""
#############################################################################################################
#Build Microsoft Graph Client
#############################################################################################################
credentials = ClientSecretCredential(
client_id = client_id,
client_secret = client_secret,
tenant_id = tenant_id,
)
client = GraphServiceClient(
credentials = credentials,
scopes = scopes,
)
#############################################################################################################
#Get SharePoint Site
#############################################################################################################
async def get_site():
try:
site = await client.sites.with_url('/sites/example').get()
if site:
print(site)
except APIError as api_error:
print(f'Error: {api_error.error.message}')
asyncio.run(get_site())
Versions
Python 3.10.11
Package Version
------------------------------------ ---------
aiohttp 3.8.5
aiosignal 1.3.1
anyio 4.0.0
async-timeout 4.0.3
attrs 23.1.0
azure-core 1.29.4
azure-identity 1.14.0
certifi 2023.7.22
cffi 1.15.1
charset-normalizer 3.2.0
cryptography 41.0.4
Deprecated 1.2.14
exceptiongroup 1.1.3
frozenlist 1.4.0
h11 0.14.0
h2 4.1.0
hpack 4.0.0
httpcore 0.18.0
httpx 0.25.0
hyperframe 6.0.1
idna 3.4
importlib-metadata 6.8.0
microsoft-kiota-abstractions 0.8.6
microsoft-kiota-authentication-azure 0.3.0
microsoft-kiota-http 0.6.1
microsoft-kiota-serialization-json 0.4.0
microsoft-kiota-serialization-text 0.2.1
msal 1.24.0
msal-extensions 1.0.0
msgraph-core 1.0.0a4
msgraph-sdk 1.0.0a16
multidict 6.0.4
opentelemetry-api 1.20.0
opentelemetry-sdk 1.20.0
opentelemetry-semantic-conventions 0.41b0
pip 23.2.1
portalocker 2.8.2
pycparser 2.21
PyJWT 2.8.0
python-dateutil 2.8.2
pywin32 306
requests 2.31.0
setuptools 65.5.0
six 1.16.0
sniffio 1.3.0
std-uritemplate 0.0.42
typing_extensions 4.8.0
urllib3 2.0.5
wrapt 1.15.0
yarl 1.9.2
zipp 3.17.0
Operating system/environment?
- [X] Windows
- [ ] Linux
- [ ] MacOS
- [ ] Azure Cloud Shell
- [ ] Azure Functions
- [ ] Other : please specify
So I got here after trying to get the drive_item_id of a folder based on its path because I could not find a correct RequestBuilder that would enable me to do that, only HTTP request templates in the docs.
after digging through and debugging the source it turns out that when they write in the docs of any with_url methods that
Using this method means any other path or query parameters are ignored
They mean that any request builders that you've invoked before this method will be invalidated and you have to build your request url completely in this raw_url string from staring with "http" to the last char
For me this was completely counter-intuitive and also tried as you did first.
Here's what I did:
async def get_drive_item_by_path(path: str) -> DriveItem | None:
from msgraph.generated.drives.item.items.item.drive_item_item_request_builder import (
DriveItemItemRequestBuilder,
)
url: str = (
f"{graph_client.request_adapter.base_url}"
f"/drives/{driver_data['drive_id']}/root:{path}"
)
# We need to use the DriveItemItemRequestBuilder with a custom URL
# because it doesn't implement the get_by_path method
drive_request = DriveItemItemRequestBuilder(
azure_module.graph_client.request_adapter, url
)
response: DriveItem | None = await drive_request.get()
return response
any update when this will be fixed ?