Geocoding API w wersji 4 wprowadza kilka nowych metod, które zastępują funkcje z wersji 3. Z tego przewodnika dowiesz się, jak przenieść aplikację, aby korzystała z nowych metod w wersji 4.
Możesz używać dotychczasowych kluczy interfejsu API z nowymi metodami w wersji 4. Jeśli jednak poprosisz o zwiększenie limitu w przypadku interfejsu API w wersji 3, musisz poprosić o zwiększenie limitu w przypadku nowych interfejsów API w wersji 4.
Migracja z geokodowania w wersji 3
Jeśli do geokodowania adresów używasz Geocoding w wersji 3, przejdź na metodę Geocode an address w wersji 4, która akceptuje żądanie GET.
Interfejs API w wersji 4 zmienia nazwy, strukturę i obsługę kilku parametrów. Zdecydowanie zalecamy użycie maski pola, aby określić pola, które chcesz otrzymać w odpowiedzi.
Zmiany parametrów żądania
| Parametr v3 | Parametr v4 | Uwagi |
|---|---|---|
address, components |
address |
Nieustrukturyzowany adres (v3 address) jest teraz przekazywany w ścieżce adresu URL. Ustrukturyzowane komponenty adresu (wersja 3 components) można przekazywać jako parametry zapytania address.*. Zobacz Odtwarzanie filtrów komponentów w wersji 3. |
bounds |
locationBias.rectangle |
Zmieniono nazwę; struktura została zmieniona na obiekt. |
language |
languageCode |
Nazwa została zmieniona. Jeśli zostanie pominięty, wersja 3 używa nagłówka Accept-Language lub domyślnie en, a wersja 4 domyślnie używa lokalnego języka i skryptu lokalizacji. |
region |
regionCode |
Nazwa została zmieniona. Jeśli ten parametr zostanie pominięty, w przypadku wersji 3 domyślnie zostanie użyta wartość us, a w przypadku wersji 4 nie będzie wartości domyślnej. |
extra_computations |
Usunięto | Zastąpiona przez metodę SearchDestinations. |
Zmiany w polu odpowiedzi
| Pole w wersji 3 | Pole v4 | Uwagi |
|---|---|---|
status, error_message |
Usunięto | Wersja 4 używa kodów stanu HTTP i treści błędów. |
results.address_components.long_name/results.address_components.short_name |
results.addressComponents.longText/results.addressComponents.shortText |
Zmieniono nazwę. |
results.geometry.location_type |
results.granularity |
Nazwa została zmieniona. |
results.geometry.location |
results.location |
Nazwy pól: lat/lng –> latitude/longitude. |
results.geometry.viewport |
results.viewport |
Nazwy pól: northeast/southwest –> high/low. |
results.postcode_localities |
results.postalCodeLocalities |
Nazwa została zmieniona. Teraz zwracany w przypadku co najmniej 1 lokalizacji (wersja 3 wymaga wartości >1). |
results.partial_match |
Usunięto | |
| Nowość | results.addressComponents.languageCode |
Język konkretnego komponentu adresu. |
| Nowość | results.bounds |
Jawne granice przy użyciu high/low. |
| Nowość | results.place |
Nazwa zasobu miejsca. |
| Nowość | results.postalAddress |
Uporządkowany obiekt PostalAddress. |
Odtwarzanie filtrów komponentów w wersji 3
Geokodowanie w wersji 3 zawierało parametr components, który umożliwiał dokładne filtrowanie wyników pod kątem określonych komponentów (np. components=country:US). Geokodowanie w wersji 4 nie obsługuje tego typu dokładnego filtrowania w parametrach żądania. W wersji 4 możesz podać informacje o adresie jako pojedynczy nieuporządkowany ciąg znaków w ścieżce lub jako uporządkowane parametry zapytania, takie jak address.addressLines, address.locality, address.administrativeArea, address.postalCode i address.regionCode.
Parametry strukturalne nie działają jak filtry ścisłe. Zamiast tego wszystkie podane komponenty są łączone w pełny adres, który interfejs API spróbuje zakodować geograficznie. Interfejs API wyszukuje najlepsze dopasowanie dla całego adresu we wszystkich komponentach. Podanie komponentów w uporządkowany sposób może pomóc interfejsowi API lepiej zrozumieć intencje, zwłaszcza gdy informacje o adresie są zbierane z oddzielnych pól formularza. Może to pomóc interfejsowi API w obsłudze drobnych literówek lub niejednoznaczności w poszczególnych komponentach, ponieważ typ informacji w każdym polu jest jasny.
Aby uzyskać działanie podobne do filtrów komponentów twardych w wersji 3, musisz zaimplementować filtrowanie po stronie klienta w tablicy results zwracanej przez interfejs API w wersji 4 na podstawie obiektów postalAddress i addressComponents w odpowiedzi.
W tabeli poniżej znajdziesz najlepsze dopasowanie filtrów components w wersji 3 do pól postalAddress w wersji 4:
| filtr komponentów w wersji 3 | Pole odpowiedzi w wersji 4 |
|---|---|
country |
postalAddress.regionCode |
postal_code |
postalAddress.postalCode |
administrative_area |
postalAddress.administrativeArea lub addressComponents |
Przykłady filtrowania po stronie klienta
Poniższe przykłady pokazują, jak filtrować wyniki, aby uzyskać zachowanie podobne do filtrowania komponentów w wersji 3 w przypadku obsługiwanych pól: kraj, region i kod pocztowy. Nie zalecamy filtrowania według innych pól, ponieważ nie ma wiarygodnych kryteriów filtrowania.
Filtruj według kraju
Dopasuj parametr address.regionCode z żądania do parametru postalAddress.regionCode w każdym wyniku. Pamiętaj, że chociaż interfejs API akceptuje w żądaniu kody regionów pisane małymi literami, w odpowiedzi zawsze zwraca je pisane wielkimi literami, więc przed porównaniem musisz znormalizować dane wejściowe do wielkich liter.
Przykład kodu w Pythonie
def filter_by_country(results, region_code): return [ res for res in results if res.get('postalAddress', {}).get('regionCode') == region_code.upper() ] # Example usage: # v4_response = ... # API call response # filtered = filter_by_country(v4_response.get('results', []), 'US')
Przykładowy kod w Node.js
function filterByCountry(results, regionCode) { return results.filter(res => res.postalAddress?.regionCode === regionCode.toUpperCase()); } // Example usage: // const v4Response = ... # API call response // const filtered = filterByCountry(v4Response.results, 'US');
Filtruj według regionu
Dopasuj parametr address.administrativeArea z żądania do parametru postalAddress.administrativeArea w każdym wyniku. Podobnie jak w przypadku kodów krajów, przed porównaniem należy znormalizować dane wejściowe do wielkich liter. Jest to wiarygodne tylko wtedy, gdy parametr administrativeArea w żądaniu jest podany ze standardowym 2-literowym skrótem. Symbol postalAddress.administrativeArea w odpowiedzi może nie odpowiadać bezpośrednio sufiksom kodów ISO 3166-2 z kilku powodów. Po pierwsze, w niektórych obszarach podział odpowiadający kodowi ISO 3166-2 nie jest częścią standardowej reprezentacji adresów pocztowych. Na przykład w Hiszpanii region administracyjny poziomu 1 (np. „CN” dla Wysp Kanaryjskich) może być obecny w addressComponents, ale postalAddress.administrativeArea może zawierać region poziomu 2 (np. „Santa Cruz de Tenerife”). Po drugie, w niektórych obszarach skrót nazwy podregionu nie jest powszechnie używany i jest reprezentowany w postalAddress.administrativeArea dłuższą nazwą (z podobnych powodów addressComponents.shortText dla komponentu adresu odpowiadającego podregionowi może nie pasować do sufiksu kodu ISO 3166-2 podregionu). W niektórych przypadkach podział może być też reprezentowany w komponencie adresu administrative_area_level_n, gdzie n jest większe niż 1.
Aby uzyskać najbardziej wyczerpujące wyniki, sprawdź, czy występuje dopasowanie zarówno w postalAddress.administrativeArea, jak i w dowolnym addressComponents z typem administrative_area_level_n (np. administrative_area_level_1).
Przykładowy kod w Pythonie
def filter_by_admin_area(results, admin_area): target = admin_area.upper() filtered = [] for res in results: # Check postalAddress pa_aa = res.get('postalAddress', {}).get('administrativeArea', '') if pa_aa == target: filtered.append(res) continue # Check all administrative area levels in addressComponents for comp in res.get('addressComponents', []): is_admin_level = any(t.startswith('administrative_area_level_') for t in comp.get('types', [])) if is_admin_level: short = comp.get('shortText', '') if short == target: filtered.append(res) break return filtered # Example usage: # filtered = filter_by_admin_area(v4_response.get('results', []), 'CA')
Przykładowy kod w Node.js
function filterByAdminArea(results, adminArea) { const target = adminArea.toUpperCase(); return results.filter(res => { // Check postalAddress.administrativeArea if (res.postalAddress?.administrativeArea === target) { return true; } // Check addressComponents for any administrative area level return res.addressComponents?.some(c => { const isAdmin = c.types?.some(t => t.startsWith('administrative_area_level_')); return isAdmin && c.shortText === target; }); }); } // Example usage: // const filtered = filterByAdminArea(v4Response.results, 'CA');
Filtrowanie według kodu pocztowego
Dopasuj parametr address.postalCode z żądania do parametru postalAddress.postalCode w każdym wyniku. Przed porównaniem musisz znormalizować zarówno wejściowe, jak i wynikowe kody pocztowe. Logika normalizacji zależy w dużej mierze od regionu. Podstawowe podejście polega na usunięciu spacji i łączników oraz przekształceniu tekstu na jednolity format.
W przypadku prefiksów kodów pocztowych (np. „L2” w Wielkiej Brytanii) lub sufiksów (np. „+4” w kodach pocztowych w USA) może być konieczna bardziej zaawansowana normalizacja. Wymagana logika normalizacji różni się w zależności od kraju i formatów kodów pocztowych. Może być konieczne dostosowanie podanych funkcji normalizacji lub wdrożenie bardziej zaawansowanej logiki w przypadku regionów, na które kierujesz reklamy.
Podany przykład dotyczy kodów pocztowych w USA i umożliwia dopasowanie na podstawie 5-cyfrowego kodu, nawet jeśli podany lub zwrócony jest kod ZIP+4.
Przykład kodu w Pythonie (skupiony na kodach pocztowych w Stanach Zjednoczonych)
import re def normalize_postal_code_us(pc): # Basic normalization for US: uppercase, alphanumeric only if not pc: return "" normalized = re.sub(r'[^A-Z0-9]', '', pc.upper()) # Return only the first 5 digits for US ZIP codes return normalized[:5] def filter_by_postal_code_us(results, postal_code): normalized_input = normalize_postal_code_us(postal_code) if not normalized_input: return [] filtered_results = [] for res in results: pa_pc = res.get('postalAddress', {}).get('postalCode', '') if normalize_postal_code_us(pa_pc) == normalized_input: filtered_results.append(res) return filtered_results # Example usage: # Matches '94043', '94043-1351', '940431351' # filtered = filter_by_postal_code_us(v4_response.get('results', []), '94043') # filtered = filter_by_postal_code_us(v4_response.get('results', []), '94043-1234')
Przykładowy kod w Node.js (skupiony na kodach pocztowych w Stanach Zjednoczonych)
function normalizePostalCodeUs(pc) { // Basic normalization for US: uppercase, alphanumeric only const normalized = (pc || '').toUpperCase().replace(/[^A-Z0-9]/g, ''); // Return only the first 5 digits for US ZIP codes return normalized.substring(0, 5); } function filterByPostalCodeUs(results, postalCode) { const normalizedInput = normalizePostalCodeUs(postalCode); if (!normalizedInput) { return []; } return results.filter(res => { const paPc = res.postalAddress?.postalCode || ''; return normalizePostalCodeUs(paPc) === normalizedInput; }); } // Example usage: // Matches '94043', '94043-1351', '940431351' // const filtered = filterByPostalCodeUs(v4Response.results, '94043'); // const filtered = filterByPostalCodeUs(v4Response.results, '94043-1234');
Migracja z geokodowania odwrotnego w wersji 3
Jeśli używasz geokodowania zwrotnego w wersji 3 do przekształcania współrzędnych w adresy, musisz przejść na metodę Geokodowanie zwrotne lokalizacji w wersji 4, która akceptuje żądanie GET.
Interfejs API w wersji 4 zmienia nazwy, strukturę i obsługę kilku parametrów. Zdecydowanie zalecamy używanie maski pola do określania pól, które mają zostać zwrócone w odpowiedzi.
Zmiany parametrów żądania
| Parametr v3 | Parametr v4 | Uwagi |
|---|---|---|
language |
languageCode |
Zmieniono nazwę. Jeśli zostanie pominięty, wersja 3 używa nagłówka Accept-Language lub domyślnie en, a wersja 4 domyślnie używa lokalnego języka i skryptu lokalizacji. |
region |
regionCode |
Zmieniono nazwę. Jeśli ten parametr zostanie pominięty, w przypadku wersji 3 domyślnie zostanie użyta wartość us, a w przypadku wersji 4 nie będzie wartości domyślnej. |
result_type |
types |
Zmieniono nazwę; używa powtarzanych parametrów zapytania. |
location_type |
granularity |
Zmieniono nazwę; używa powtarzających się parametrów zapytania. |
extra_computations |
Usunięto | Zastąpiona przez metodę SearchDestinations. |
Zmiany w polu odpowiedzi
| Pole w wersji 3 | Pole v4 | Uwagi |
|---|---|---|
status, error_message |
Usunięto | Wersja 4 używa kodów stanu HTTP i treści błędów. |
results.address_components.long_name/results.address_components.short_name |
results.addressComponents.longText/results.addressComponents.shortText |
Zmieniono nazwę. |
results.geometry.location_type |
results.granularity |
Nazwa została zmieniona. |
results.geometry.location |
results.location |
Nazwy pól: lat/lng –> latitude/longitude. |
results.geometry.viewport |
results.viewport |
Nazwy pól: northeast/southwest –> high/low. |
| Nowość | results.addressComponents.languageCode |
Język konkretnego komponentu adresu. |
| Nowość | results.bounds |
Jawne granice przy użyciu high/low. |
| Nowość | results.place |
Nazwa zasobu miejsca. |
| Nowość | results.postalAddress |
Ustrukturyzowany obiekt PostalAddress. |
Migracja z deskryptorów adresu w wersji 3
Jeśli używasz parametru address_descriptor, aby uzyskać dodatkowe informacje o lokalizacji za pomocą Geocoding v3, musisz przejść na używanie pola landmarks w SearchDestinationsResponse.
Migracja z geokodowania miejsc w wersji 3
Jeśli używasz place_id do pobierania adresu dla konkretnego identyfikatora miejsca za pomocą interfejsu Geocoding API w wersji 3, musisz przejść na metodę Place
Geocoding w wersji 4, która akceptuje żądanie GET.
Interfejs API w wersji 4 zmienia nazwy, strukturę i obsługę kilku parametrów. Zdecydowanie zalecamy używanie maski pola do określania pól, które mają zostać zwrócone w odpowiedzi.
Zmiany parametrów żądania
| Parametr v3 | Parametr v4 | Uwagi |
|---|---|---|
place_id |
Pole place w proto żądania |
Identyfikator miejsca jest teraz podawany jako parametr ścieżki places/{place}, na przykład: https://geocode.googleapis.com/v4/geocode/places/ChIJj61dQgK6j4AR4GeTYWZsKWw. Odpowiada to polu place w odpowiedniej prośbie. |
language |
languageCode |
Nazwa została zmieniona. Jeśli zostanie pominięty, wersja 3 używa nagłówka Accept-Language lub domyślnie en, a wersja 4 domyślnie używa lokalnego języka i skryptu lokalizacji. |
region |
regionCode |
Nazwa została zmieniona. Jeśli nie podasz tej wartości, w v3 domyślnie zostanie użyta wartość us, a w v4 nie ma wartości domyślnej. |
Zmiany w polu odpowiedzi
| Pole w wersji 3 | Pole v4 | Uwagi |
|---|---|---|
status, error_message |
Usunięto | Wersja 4 używa kodów stanu HTTP i treści błędów. |
results |
(root) | Wersja 4 zwraca pojedynczy obiekt wynikowy, a nie tablicę results. |
results.address_components.long_name/results.address_components.short_name |
addressComponents.longText/addressComponents.shortText |
Nazwa została zmieniona. |
results.geometry.location_type |
granularity |
Nazwa została zmieniona. |
results.geometry.location |
location |
Nazwy pól: lat/lng –> latitude/longitude. |
results.geometry.viewport |
viewport |
Nazwy pól: northeast/southwest –> high/low. |
results.postcode_localities |
postalCodeLocalities |
Zmieniono nazwę. Teraz zwracane dla co najmniej 1 lokalizacji (wersja 3 wymaga >1). |
| Nowość | addressComponents.languageCode |
Język konkretnego komponentu adresu. |
| Nowość | bounds |
Jawne granice przy użyciu high/low. |
| Nowość | place |
Nazwa zasobu miejsca. |
| Nowość | postalAddress |
Uporządkowany obiekt PostalAddress. |
Migracja z geokodowania hiperlokalnych danych do miejsc docelowych
Te funkcje interfejsu Geocoding API w wersji 3 są zastępowane przez metodę SearchDestinations interfejsu Geocoding API w wersji 4:
- Wejścia
- Punkty nawigacyjne
- Tworzenie konspektów
- Tereny posiadłości
Jeśli do korzystania z powyższych funkcji używasz interfejsu Geocoding API w wersji 3, zapoznaj się z tym dokumentem, aby dowiedzieć się, jak zamiast tego używać metody SearchDestinations.
Z tego dokumentu dowiesz się, gdzie w SearchDestinationsodpowiedziSearchDestinations znajdziesz te funkcje, oraz poznasz różnice w sposobie ich reprezentowania w odpowiedziach interfejsu API między interfejsem Geocoding API w wersji 3 a metodą SearchDestinationsSearchDestinations interfejsu Geocoding API w wersji 4.
Wejścia
Aby uzyskać wejścia powiązane z destination, użyj pola destination.entrances.
Pamiętaj, że format entrance nieco się różni od formatu wejścia w Geocoding API w wersji 3. Każde wejście w obiekcie destination.entrances zawiera te pola:
displayName– to nowe opcjonalne pole, które będzie zawierać zrozumiałą dla człowieka nazwę wejścia, np. „Brama B”.location– jest to lokalizacja typuLatLng, która różni się od formatu używanego w Geocoding API w wersji 3.tags– jest to to samo co poletagswejść z interfejsu Geocoding API w wersji 3.place– odpowiednik polabuildingPlaceIdwejść z interfejsu Geocoding API w wersji 3. Jednak identyfikator miejsca w tym polu może dotyczyć miejsca dowolnego typu, niekoniecznie budynku.
Punkty nawigacyjne
Aby uzyskać punkty nawigacyjne powiązane z destination, użyj pola destination.navigationPoints.
Pamiętaj, że format navigationPoint nieco się różni od formatu punktu nawigacyjnego w Geocoding API w wersji 3. Każdy punkt nawigacyjny w obiekcie destination.navigationPoints ma te pola:
displayName– to nowe opcjonalne pole, które będzie zawierać zrozumiałą dla człowieka nazwę punktu nawigacyjnego, np. „5th Ave”.location– to lokalizacja typuLatLng, która różni się od formatu używanego w Geocoding API w wersji 3.travelModes– jest to podobne do polarestrictedTravelModespunktów nawigacyjnych z interfejsu Geocoding API w wersji 3. Możliwe wartości typu wyliczeniowego są takie same. Jedyna różnica polega na tym, że to pole reprezentuje teraz akceptowalne środki transportu dla punktu nawigacyjnego, a nie ograniczone środki transportu.usage– to nowe pole, które zawiera przypadki użycia obsługiwane przez punkt nawigacyjny.
Tworzenie konspektów
Aby uzyskać kontury budynków powiązane z destination, użyj pola displayPolygon obiektów placeView w destination, które reprezentują budynki. W przypadku każdego elementu placeView możesz sprawdzić, czy jest to budynek, za pomocą pola placeView.structureType. Jeśli typ struktury to BUILDING, możesz pobrać konspekt z pola placeView.displayPolygon. placeView będzie też zawierać dodatkowe pola dotyczące budynku, których nie było w interfejsie Geocoding API w wersji 3.
destination może mieć obiekt placeView reprezentujący budynek w tych polach:
destination.primary– to jest główne miejsce docelowe.destination.containingPlaces– jest to pole powtarzane, które może zawierać większe miejsca, które „zawierają” miejsce główne. Jeśli na przykład głównym miejscem jestsubpremise,containingPlaceszwykle zawieraplaceViewreprezentujący budynek.destination.subDestinations– jest to pole powtarzane, które może zawierać podrzędne miejsca docelowe głównego miejsca. Na przykład poszczególne mieszkania w budynku. To pole zwykle nie zawiera elementuplaceViewreprezentującego budynek.
Pamiętaj, że format placeView.displayPolygon jest zgodny z formatem konturu budynku
w interfejsie Geocoding API
wersji 3, czyli formatem GeoJSON, który korzysta z formatu RFC 7946.
Tereny posiadłości
Podobnie jak w przypadku konturów budynków, aby uzyskać tereny powiązane z destination, użyj pola displayPolygon obiektów placeView w destination, które reprezentują tereny. W przypadku każdego placeView możesz sprawdzić, czy jest to podstawa, korzystając z pola placeView.structureType. Jeśli typ struktury to GROUNDS, możesz pobrać konspekt z pola placeView.displayPolygon. placeView będzie też zawierać dodatkowe pola dotyczące terenów, których nie było w interfejsie Geocoding API w wersji 3.
Obiekt destination może zawierać obiekt placeView, który reprezentuje teren w tych polach:
destination.primarydestination.containingPlacesdestination.subDestinations
Pamiętaj, że format placeView.displayPolygon jest zgodny z formatem konturu terenu w interfejsie Geocoding API w wersji 3, czyli formatem GeoJSON, który korzysta z formatu RFC 7946.
Dokładność wyników
W Geocoding API w wersji 3 pole location_type w geometrii odpowiedzi wskazywało precyzję wyników, a niektórzy klienci klasyfikowali lub filtrowali wyniki na podstawie tych wartości (ROOFTOP, RANGE_INTERPOLATED, GEOMETRIC_CENTER i APPROXIMATE). W przypadku standardowych migracji do Geocoding API w wersji 4 to pole zostało zmienione na granularity.
W interfejsie Destinations API (wersja 4 SearchDestinations) nie ma pola location_type. Zamiast tego informacje przestrzenne są obsługiwane w inny sposób:
- Nie jest wymagane ręczne filtrowanie po stronie klienta: standardowe geokodowanie zapewnia wiele wyników o różnej szczegółowości, natomiast metoda
SearchDestinationsminimalizuje niejednoznaczność, zwracając w miarę możliwości pojedyncze, zoptymalizowane miejsce docelowe. Dzięki temu klienci nie muszą filtrować wyników według typu lokalizacji, aby określić, który z nich jest najlepszy. - Informacje przestrzenne przedstawione za pomocą typu struktury i wielokątów wyświetlania:
geometria przestrzenna i struktura są oznaczone:
displayPolygon(dla dokładnej geometrii).- Pole
structureTypew obiekcieplaceView.
- Mapowanie typu struktury:
- Wartość
structureTypew przypadkuPOINT,BUILDINGlubSECTIONodpowiada zwykle temu, co wcześniej nazywanoROOFTOP. - Wartość
structureTyperównaGROUNDSodpowiada zwykleGEOMETRIC_CENTER.
- Wartość
Używanie maski pola do wysyłania żądań dotyczących tych funkcji
Metoda SearchDestinations wymaga maski pola, jak wyjaśniono w artykule Wybieranie pól do zwrócenia. Maskę pola można ustawić na *, aby zwrócić wszystkie pola, lub na konkretne pola, które chcesz otrzymać. Na przykład to żądanie API ustawia maskę pola, aby otrzymać wszystkie pola wymagane do uzyskania wejść, punktów nawigacyjnych, obrysów budynków i terenów miejsca docelowego:
curl -X POST -d '{"place": "places/ChIJG3kh4hq6j4AR_XuFQnV0_t8"}' \
-H "X-Goog-Api-Key: API_KEY" \
-H "Content-Type: application/json" \
-H "X-Goog-FieldMask: destinations.entrances,destinations.navigationPoints,destinations.primary,destinations.containingPlaces,destinations.subDestinations" \
https://geocode.googleapis.com/v4/geocode/destinations
Bezpieczeństwo
Interfejs Geocoding API w wersji 4 został zaprojektowany jako interfejs API między serwerami. Użytkownicy JavaScript nie mają bezpośredniej ścieżki migracji z wersji 3 do wersji 4. Wywoływanie metod w wersji 4 bezpośrednio z kodu JavaScript po stronie klienta (np. w przeglądarce) przy użyciu klucza interfejsu API naraża ten klucz na kradzież i niewłaściwe użycie.
Ograniczenia dotyczące odsyłającego HTTP, choć przydatne, nie zapewniają wystarczającej ochrony punktów końcowych usług internetowych, ponieważ mogą być łatwo omijane przez atakujących, którzy fałszują nagłówek Referer w swoich żądaniach.
Zalecane działania
Zalecany sposób korzystania z interfejsu Geocoding API w wersji 4 to używanie go na własnym serwerze backendu. Aplikacja kliencka powinna wysyłać żądania do tego serwera pośredniczącego, który następnie bezpiecznie wywołuje interfejs API Google za pomocą chronionego klucza interfejsu API (np. klucza przechowywanego w zmiennej środowiskowej lub Secret Managerze). Dzięki temu klucz interfejsu API nigdy nie będzie widoczny w kodzie interfejsu.
Alternatywne rozwiązania po stronie klienta
Jeśli masz potrzeby po stronie klienta, które wymagają geokodowania, rozważ użycie jednego z istniejących rozwiązań po stronie klienta:
- Usługa geokodowania w interfejsie Maps JavaScript API: usługa geokodowania nadal korzysta z backendu w wersji 3 i jest przeznaczona do użytku w środowisku przeglądarki.
- Places UI Kit: używaj Places UI Kit, w tym elementów autouzupełniania miejsc, do tworzenia elementów interfejsu użytkownika związanych z adresami.