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

Сервис позволяет определять местонахождения IP - адреса.

В базе сервиса IP – адреса РФ, Украина (с точностью до города). США, Канада, Европа и часть Aзии (с точностью до страны).

 Сайт сервиса - http://ipgeobase.ru/

Документация по API - http://blog.ipgeobase.ru/?p=76

Регистрация / авторизация не требуется.

Параметры запроса.

Примеры запроса:

 http://ipgeobase.ru:7020/geo?ip=109.254.254.155 (ответ – XML).

 http://ipgeobase.ru:7020/geo?ip=109.254.254.155&json=1(ответ JSON).

В ответе содержится: блок ip адресов, страна, город, регион, округ и координаты.

Недостатки: возвращает кириллические символы в кодировке windows-1251, нечитаемые sql server.

CREATE PROCEDURE [dbo].[api_IpGeoBaseru_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

-- IP передается как параметр в Url
SET     @apiUrl1  = 'http://ipgeobase.ru:7020/geo?ip='+ISNULL( @IPStr, '' )

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

	-- SELECT 1  Msg, Result, Url (адрес, куда будет идти запрос)
    	select '' Msg, 1 Result
          , @apiUrl1 Url

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

CREATE PROCEDURE [dbo].[api_IpGeoBaseru_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_IpGeoBaseru_IPLocation_response' , GETDATE() )
	insert into as_trace ( header, text, username, code , created )  values( '@response - 1    , 1024 ', SUBSTRING ( @response , 1    , 1024 ) , @username, 'api_IpGeoBaseru_IPLocation_response' , GETDATE() )

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

DECLARE  @xml_STR Nvarchar(max)
SET      @xml_STR = @response

DECLARE  @xml xml -- переменная в которую преобразуем полученную строку


-- ПРИХОДИТ КОДИРОВКА encoding="windows-1251"
set @xml_STR = REPLACE( @xml_STR ,'UTF-8','UTF-16')
set @xml_STR = REPLACE( @xml_STR ,'windows-1251','UTF-16')
set @xml =convert (xml, @xml_STR)

DECLARE @exist_ipAnswer bit = 0
select  @exist_ipAnswer = @xml.exist('/ip-answer')

      IF @exist_ipAnswer = 0
      BEGIN

          SELECT 'Ошибка! В результате запроса @response нет корневого элемента ip-answer!' Msg, 0 Result, 'Ошибка! В результате запроса @response нет корневого элемента ip-answer!' Response
          RETURN
      END

-- Город 	Москва -- Регион 	Москва -- Округ 	Центральный федеральный округ   -- Страна 	/RU
    DECLARE @value_IP 	NVARCHAR(MAX)  = N'' -- @value_IP
    DECLARE @inetnum 	NVARCHAR(MAX)  = N'' --

    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_IP 	= @xml.value('/ip-answer[1]/ip[1]/@value'     , 'nvarchar(200)'  )
select @inetnum  	= @xml.value('/ip-answer[1]/ip[1]/inetnum[1]' , 'nvarchar(200)'  )
select @country_iso_code = @xml.value('/ip-answer[1]/ip[1]/country[1]', 'nvarchar(200)'  )
select @city   		= @xml.value('/ip-answer[1]/ip[1]/city[1]'     , 'nvarchar(200)'  )
select @region 		= @xml.value('/ip-answer[1]/ip[1]/region[1]'   , 'nvarchar(200)'  )
select @district 	= @xml.value('/ip-answer[1]/ip[1]/district[1]' , 'nvarchar(200)'  )
select @lat  		= @xml.value('/ip-answer[1]/ip[1]/lat[1]'   , 'nvarchar(200)'  )
select @lon  		= @xml.value('/ip-answer[1]/ip[1]/lng[1]'   , 'nvarchar(200)'  )

	-- SELECT 1
	select 'Ok' Msg
         , 1 Result
         -- , @response Response -- ТАК при вызов из формы вернет оригинальный  @response !!!
         , 'Ваш IP: '  +IIF ( @value_IP = '', '' , @value_IP )
          +'; Город: ' +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

Страница-источник на сайте falconspace.ru