Blog JSystems - uwalniamy wiedzę!

Szukaj

Power Query w Excelu, Power BI i Fabric

Web.Contents nie może pobrać zawartości - kod stanu 404, 401 albo 500

W skrócie

  • W Power Query odświeżenie kończy się błędem DataSource.Error: Funkcja Web.Contents nie może pobrać zawartości, a w nawiasie stoi kod stanu HTTP, na przykład 404, 401 albo 500.
  • Kod stanu to odpowiedź serwera: 404 oznacza brak zasobu pod adresem albo brak danych, 401 i 403 problem z poświadczeniami, 429 przekroczony limit zapytań, a 500 błąd po stronie serwera.
  • Skopiuj adres z komunikatu do przeglądarki, popraw ścieżkę albo parametry, odśwież poświadczenia w Ustawieniach źródeł danych, a przewidywalny kod, taki jak 404, obsłuż opcją ManualStatusHandling.

Błąd Web.Contents z kodem stanu 404 w Power Query pojawia się przy pobieraniu danych z API i stron WWW: zapytanie działało, a po zmianie parametru, dnia albo hasła odświeżenie przerywa komunikat DataSource.Error. Pokazujemy, jak odczytać kod stanu z komunikatu, co oznaczają kody 404, 401, 403, 429 i 500 oraz jak naprawić każdy przypadek. Przykłady sprawdziliśmy w polskim Excelu na API kursów walut NBP, którego używamy w lekcji o źródłach danych.

Jak to wygląda w praktyce

Zamiast danych edytor pokazuje żółty pasek z błędem, a odświeżenie tabeli w arkuszu się nie udaje. Tak wygląda komunikat, który dostaliśmy w Excelu, pobierając kurs euro z 1 stycznia 2026 roku:

DataSource.Error: Funkcja Web.Contents nie może pobrać zawartości z „https://api.nbp.pl/api/exchangerates/rates/A/EUR/2026-01-01/?format=json” (404): Not Found - Brak danych

Angielski oryginał to Web.Contents failed to get contents from '{0}' ({1}): {2}. Komunikat ma trzy części: pełny adres żądania razem z parametrami, kod stanu HTTP w nawiasie i opis zwrócony przez serwer. Opis pochodzi z API, dlatego bywa po angielsku albo w języku serwera, jak „Brak danych” z API NBP. Część innych łączników, na przykład HDFS i HDInsight, zgłasza podobny błąd w wariancie {0} nie może pobrać zawartości z „{1}”. Kod stanu: {2}; opis: „{3}”.

Dlaczego tak się dzieje

Kod stanu HTTP to trzycyfrowa odpowiedź serwera na żądanie. Gdy serwer odpowiada kodem błędu, Web.Contents przerywa zapytanie i podaje ten kod w komunikacie. Każdy kod wskazuje inne miejsce do sprawdzenia:

  • 404 (Not Found): pod adresem nic nie ma. Zwykle to literówka w ścieżce albo zły parametr, ale część API zwraca 404 także dla poprawnego zapytania bez danych. API NBP odpowiada tak dla dnia, w którym nie opublikowało tabeli kursów.
  • 401 (Unauthorized) i 403 (Forbidden): serwer nie przyjął poświadczeń albo konto nie ma dostępu. Według dokumentacji Microsoft te dwa kody wywołują błąd poświadczeń i prośbę o ponowne zalogowanie, na przykład po wygaśnięciu tokenu.
  • 429 (Too Many Requests): przekroczony limit liczby zapytań. Web.Contents ponawia takie żądanie do trzech razy, tak samo jak przy kodach 408, 503, 504 i 509.
  • 500 (Internal Server Error): błąd po stronie serwera, którego nie naprawisz w zapytaniu.

Jak to rozwiązać krok po kroku

  1. Skopiuj adres z komunikatu i otwórz go w przeglądarce. Komunikat zawiera pełny adres razem z parametrami z opcji Query. Jeśli przeglądarka dostaje ten sam kod, przyczyna leży w adresie albo po stronie serwera, a nie w krokach zapytania.
  2. Przy 404 sprawdź ścieżkę i parametry. Porównaj adres z dokumentacją API: ukośniki, format daty, kod waluty, identyfikator. Jeśli adres jest poprawny, a API zwraca 404 dla braku danych, potraktuj ten kod jako pusty wynik (krok 5).
  3. Przy 401 i 403 odśwież poświadczenia. Na karcie Dane rozwiń Pobierz dane, wybierz Ustawienia źródeł danych, zaznacz adres i kliknij Wyczyść uprawnienia. Przy kolejnym połączeniu Power Query otworzy okno Dostęp do zawartości sieci Web: po lewej wybierz sposób uwierzytelniania, z listy Wybierz poziom, na którym chcesz zastosować te ustawienia wskaż domenę albo pełny adres i kliknij Połącz.
  4. Klucz API przekazuj przez poświadczenia. Jeśli API oczekuje klucza w adresie, dodaj opcję ApiKeyName z nazwą parametru, na przykład Web.Contents(adres, [ApiKeyName = "api_key"]), i wybierz typ Interfejs API sieci Web, w którym wpiszesz samą wartość klucza. Klucz w nagłówku (opcja Headers) może wymagać dostępu Anonimowy, bo część nagłówków silnik przyjmuje tylko w połączeniach anonimowych: Nagłówek „{0}” jest obsługiwany tylko w połączeniach anonimowych. (ang. The '{0}' header is only supported when connecting anonymously.).
  5. Przewidywalny kod obsłuż w zapytaniu. Opcja ManualStatusHandling (w opisie funkcji: kody stanu HTTP do obsługi ręcznej) wyłącza wbudowaną obsługę wskazanych kodów. Pobierz odpowiedź jako Odp = Web.Contents("https://api.nbp.pl/api/", [RelativePath = sciezka, Query = [format = "json"], ManualStatusHandling = {404}]), a w kolejnym kroku zwróć if Value.Metadata(Odp)[Response.Status] = 404 then null else Json.Document(Odp). Kodów 401 i 403 ta opcja w zwykłym zapytaniu nie obsłuży.
  6. Wolne API: wydłuż limit czasu. Domyślny limit czasu żądania to 100 sekund. Dłuższy ustawisz w tym samym rekordzie opcji, na przykład Timeout = #duration(0, 0, 2, 0) dla dwóch minut.
  7. Przy 429 i 500 ogranicz liczbę żądań i ponów później. Przy 429 Power Query czeka między próbami tyle, ile poda serwer w nagłówku Retry-After (od 0,5 do 120 sekund). Gdy błąd wraca, wysyłaj mniej żądań: pobieraj większe strony i zamiast wywołania API dla każdego wiersza tabeli pobierz całą tabelę raz, tak jak w kursie robi to zapytanie Kursy_NBP. Kod 500 zgłoś właścicielowi API razem z adresem z komunikatu.
Okno Dostęp do zawartości sieci Web w Power Query z typami uwierzytelniania: anonimowy, Windows, podstawowy, interfejs API sieci Web i konto organizacyjne
Okno Dostęp do zawartości sieci Web dla adresu API NBP. Po lewej pięć sposobów uwierzytelniania, niżej lista poziomu, na którym zapiszesz ustawienie: cała domena albo konkretny adres.

Jak sprawdzić, że zadziałało

Odśwież zapytanie (w edytorze Odśwież podgląd, w Excelu Odśwież wszystko) i sprawdź, czy żółty pasek zniknął. Przy obsłudze kodu 404 sprawdź oba przypadki: dla dnia z tabelą kursów zapytanie zwraca dane, a dla 1 stycznia 2026 roku w naszym teście zwróciło null zamiast błędu. Kod odpowiedzi podejrzysz w osobnym kroku formułą Value.Metadata(Odp)[Response.Status], a cały rekord metadanych (między innymi Content.Uri, Headers i Response.Status) zwraca Value.Metadata(Odp). Klucz API trzymaj w poświadczeniach, a nie w kodzie: poświadczenia zostają na komputerze, więc klucz nie wyjdzie razem z plikiem, a osoba, której przekażesz plik, poda własne dane logowania.

Wróć do listy: 88 najczęstszych pytań i problemów związanych z Power Query

Baner szkolenia Microsoft Excel - Power Query w JSystems z edytorem Power Query na ekranie laptopa

Szkolenie Microsoft Excel - Power Query --> Dwa dni warsztatów z Excela: pobieranie danych z plików, folderów, SharePointa i baz SQL, ich czyszczenie i łączenie w Power Query, praca w języku M, a na koniec model danych i oparta na nim tabela przestawna. Prowadzi Sebastian Stasiak.

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Dlaczego adres działa w przeglądarce, a Power Query zgłasza 401 albo 403?
Przeglądarka korzysta z Twojej sesji i zapisanych logowań, a Power Query używa wyłącznie poświadczeń zapisanych dla danego źródła. Wyczyść uprawnienia źródła w Ustawieniach źródeł danych i połącz się ponownie, wybierając właściwy typ uwierzytelniania, na przykład Konto organizacyjne dla usług Microsoft 365.
Czy kod 404 zawsze oznacza zły adres?
Nie. Część API zwraca 404 także dla poprawnego zapytania, dla którego nie ma danych. API NBP odpowiada tak dla dnia bez tabeli kursów, z opisem Not Found - Brak danych. Wtedy obsłuż kod opcją ManualStatusHandling i zwróć pustą wartość zamiast błędu.
Czy opcją ManualStatusHandling obsłużę także kody 401 i 403?
Nie w zwykłym zapytaniu. Dokumentacja Microsoft podaje, że kodów 401 i 403 w tej opcji można użyć tylko w niestandardowym łączniku danych. W zapytaniu w Excelu albo Power BI te kody kończą się prośbą o poświadczenia, więc naprawiasz je w Ustawieniach źródeł danych.
Ile Power Query czeka na odpowiedź serwera?
Domyślny limit czasu żądania Web.Contents to 100 sekund. Inny ustawisz opcją Timeout z wartością typu duration, na przykład #duration(0, 0, 2, 0) dla dwóch minut. Wydłużenie pomaga przy wolnym API, ale nie naprawi kodów 404, 401 ani 500.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...