Интеграция API DaData.ru Город по IP-адресу

Сервис DaData.ru (https://dadata.ru) предоставляет API поиска.

Полная документация - API Город по IP-адресу - https://dadata.ru/api/detect_address_by_ip/.

Определяет город по IP-адресу в России.

Поддерживает как IPv4, так и IPv6 адреса.

Возвращает детальную информацию о городе, в том числе почтовый индекс.

Недостатки: работает только по адресам РФ.

Регистрация DaData.ru.

Нужно зарегистрироваться и подтвердить почту.

Регистрация  - https://dadata.ru/suggestions/usage/address/#registration_popup

Подтвердить адрес электронной почты.

API начнет работать после подтверждения. 

После регистрации в личном кабинете  https://dadata.ru/profile/#info

Станут доступны API-ключ и Секретный ключ для стандартизации

 Подписка.

Тариф «Бесплатный», действует бессрочно.

Возможности - Бесплатно до 10 тысяч запросов в день.

API запрос.

Формат запроса.

  • URL - https://suggestions.dadata.ru/suggestions/api/4_1/rs/iplocate/address.
  • Метод – GET.
  • Формат ответа – json.
  • Кодировка -  UTF-8.
  • Заголовок запроса - Content-Type –  application/json.
  • Заголовок запроса - Accept –  application/json.
  • Заголовок запроса - Authorization - Token 1d01d91d91d91d91d9f1d91d9_____ - API-ключ из личного кабинета.

 Заданный IP передается как параметр в URL.

 Пример запроса: https://suggestions.dadata.ru/suggestions/api/4_1/rs/iplocate/address?ip=178.219.186.12.

 В ответе на запрос приходит объект с массивом данных location.

Пример ответа (с сокращениями)

{
    "location": {
        "value": "г Москва",
        "unrestricted_value": "101000, г Москва",
        "data": {
            "postal_code": "101000",
            "country": "Россия",
            "country_iso_code": "RU",
            "federal_district": "Центральный",
…
            "history_values": null,
            "unparsed_parts": null,
            "source": null,
            "qc": null
        }
    }
}

Если город не удалось определить, ответ будет таким:

{ "location": null }

В процедуре парсинга выводиться следующие поля Город, Регион, Округ, Страна (iso код), Координаты.

В ответе сервиса – по одному адресу – более 70 полей, можно получить максимально подробную информацию по каждому адресу, включая значения всех классификаторов.

CREATE PROCEDURE [dbo].[api_daData_IPLocation_request]
	@parameters ExtendedDictionaryParameter READONLY,  -- входящие параметры для внутренней обработки (используйте Key, Value2)
	@username nvarchar(32)  -- текущий пользователь.
AS
BEGIN

DECLARE @IPStr nvarchar(max)
-- получение значений полей формы из @parameters
SELECT  @IPStr  =  ISNULL( Value2 , '' )  FROM @parameters WHERE [Key] = 'IPStr'

IF LEN( ISNULL( @IPStr , '' ) ) = 0
	 SET @IPStr = N'178.219.186.12'

DECLARE @apiUrl1 		nvarchar(max) = '' 		-- Финальная строка для отправки  -- ФАКТИЧЕСКИ ЭТО Url
DECLARE @jsonRequest1	nvarchar(max) = '' 	    -- текст json-объекта
-- IP передается как параметр в Url
SET     @apiUrl1  = 'https://suggestions.dadata.ru/suggestions/api/4_1/rs/iplocate/address?ip='+ISNULL( @IPStr, '' )

-------------------------------------------------------------------------------------------
    -- ОТЛАДКА
	 insert into as_trace ( header, text, username, code , created )   values( 'apiUrl1'       , @apiUrl1      , @username, 'api_daData_IPLocation_request' , GETDATE() )
-------------------------------------------------------------------------------------------

	-- SELECT 1  Msg, Result, Url (адрес, куда будет идти запрос)
    	select '' Msg, 1 Result
          , @apiUrl1 Url
          , 'application/json' ContentType -- явное указание для HEADER


	-- SELECT 2 PARAMETERS - параметры, которые будут передаваться во внешний источник
	 select 'Authorization' name
           , 'Token 1d9d193ed73ec33________' value
           , 'header' [type] -- form (в форме передается), header (в http headers), get запросы передавайте прямо в URL


END

CREATE PROCEDURE [dbo].[api_daData_IPLocation_response]
	@response nvarchar(max),
	@parameters ExtendedDictionaryParameter READONLY,  -- входящие параметры для внутренней обработки (используйте Key, Value2 - те же что и на request)

	@username nvarchar(32)
AS
BEGIN
    -- ОТЛАДКА
   	insert into as_trace ( header, text, username, code , created )  values( 'LEN @response ', LEN ( @response ) , @username, 'api_daData_IPLocation_response' , GETDATE() )
	insert into as_trace ( header, text, username, code , created )  values( '@response - 1    , 1024 ', SUBSTRING ( @response , 1    , 1024 ) , @username, 'api_daData_IPLocation_response' , GETDATE() )

    DECLARE @json1 NVARCHAR(MAX)  = N''
	SET @json1 = @response

    -- Для проверки правильности JSON формата существует функция ISJSON, которая возвращает 1, если это JSON, 0 — если нет и NULL, если был передан NULL
    DECLARE @presentJSON bit = 0
    SELECT @presentJSON = ISNULL( ISJSON( @json1 ) , 0 )

    IF @presentJSON <> 1
    BEGIN
        -- SELECT 'Ошибка! Строка @response не является JSON!' Msg, 0 Result, @response Response
        SELECT 'Ошибка!' AS Msg, 0 Result, 'Ошибка! Строка @response не является JSON!' AS  Response
        RETURN
    END

    IF LEN( ISNULL( @response  , '' ) ) =0
    BEGIN
        SELECT 'Ошибка!' AS Msg, 0 Result, 'Ошибка! Получена срока @response нулевой длины!' AS  Response
        RETURN
    END

    DECLARE @commonResult NVARCHAR(MAX)  = N''
    SET  @commonResult =  (SELECT JSON_QUERY(@json1, '$.location') ) -- строка массива location

    IF LEN( ISNULL(  @commonResult  , '' ) ) =0
    BEGIN
        SELECT 'Ошибка!' AS Msg, 0 Result, 'Ошибка! Город не удалось определить!' AS  Response
        RETURN
    END

-- Город 	Москва -- Регион 	Москва -- Округ 	Центральный федеральный округ   -- Страна 	/RU

    DECLARE @value_Address 	NVARCHAR(MAX)  = N'' -- Адрес одной строкой
    DECLARE @postal_code 	NVARCHAR(MAX)  = N'' -- Индекс
    DECLARE @country 		NVARCHAR(MAX)  = N'' -- Страна -- "country": "Россия"
    DECLARE @country_iso_code NVARCHAR(MAX)= N'' -- Страна 	RU
    DECLARE @city 			NVARCHAR(MAX)  = N'' -- Город 	Москва
    DECLARE @region		    NVARCHAR(MAX)  = N'' -- Регион 	Москва
    DECLARE @district 		NVARCHAR(MAX)  = N'' -- Округ 	Центральный федеральный округ    "Центральный"
    DECLARE @lat 			NVARCHAR(MAX)  = N'' -- data_geo_lat
    DECLARE @lon 			NVARCHAR(MAX)  = N'' -- data_geo_lon

SELECT  @value_Address = ISNULL( Query.value_Address    ,'' )
	  , @postal_code   = ISNULL( Query.data_postal_code ,'' )
	  , @country       = ISNULL( Query.data_country 	,'' )
	  , @country_iso_code = ISNULL( Query.data_country_iso_code,'' )
      , @city          = ISNULL( Query.data_city ,'' )
      , @region	       = ISNULL( Query.data_region_with_type ,'' )
      , @district      = ISNULL( Query.data_federal_district ,'' )
      , @lat           = ISNULL( Query.data_geo_lat 	     ,'' )
      , @lon           = ISNULL( Query.data_geo_lon          ,'' )

FROM OPENJSON(@json1, N'$.location') -- Зашли в массив  , далее в WITH считаем , что адреса уже внути массива
WITH (
       value_Address		VARCHAR(200)    N'$.value' -- Адрес одной строкой (как показывается в списке подсказок)
     , data_postal_code		VARCHAR(200)    N'$.data.postal_code'		-- Индекс
     , data_country			VARCHAR(200)    N'$.data.country'			-- "country": "Россия"
     , data_country_iso_code VARCHAR(200)   N'$.data.country_iso_code'	-- "country_iso_code": "RU",
     , data_city			VARCHAR(200)    N'$.data.city'
     , data_region_with_type VARCHAR(200)   N'$.data.region_with_type'	-- "region_with_type": "Москва",
     , data_federal_district VARCHAR(200)   N'$.data.federal_district'	-- "federal_district": "Центральный",
     , data_geo_lat			VARCHAR(200)    N'$.data.geo_lat'
     , data_geo_lon			VARCHAR(200)    N'$.data.geo_lon'
    ) AS Query

-- Город 	Москва -- Регион 	Москва -- Округ 	Центральный федеральный округ   -- Страна 	/RU

	-- SELECT 1
	select 'Ok' Msg
         , 1 Result
         -- , @response Response -- ТАК при вызов из формы вернет оригинальный  @response !!!
         , 'Город: '  +IIF ( @city = ''    , '' , @city )
          +'; Регион: '+IIF ( @region = ''  , '' , @region )
          +'; Округ: ' +IIF ( @district = '', '' , @district )
          +'; Страна: '+IIF ( @country = '' , '' , @country )  + '-' +IIF ( @country_iso_code  = '' , '' ,@country_iso_code  )
          +'; Координаты : '+IIF ( @lat = '' , '' ,@lat ) + ' ' +IIF ( @lon = '' , '' ,@lon )  + '.'
         AS Response

	-- SELECT 2 Внешние действия

END

Платформа Falcon Space

Это снижение стоимости владения

за счет меньшего количества людей для поддержки

Это быстрое внесение изменений

по ходу эксплуатации программы

Это современный интерфейс

полная адаптация под мобильные устройства

Бесплатное обучение разработке на Falcon Space

Вы можете разрабатывать самостоятельно или сотрудничать с нами в плане веб-разработки на платформе Falcon Space.
Примечание