microsoftgraph / msgraph-sdk-python

MIT License
397 stars 56 forks source link

Getting Only https scheme with a valid host are supported when calling sites.with_url().get() #362

Open stvpwrs opened 1 year ago

stvpwrs commented 1 year ago

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?

SmithG1997 commented 3 months ago

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