Как использовать Global.asa с API - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь использовать API для возврата широты, долготы, города, штата и почтового индекса посетителя веб-сайта.Я нашел тот, который мне нравится - GEO IPIFY

Задача, которая у меня есть, - мой веб-сайт (-ы) выполнен в классическом ASP, а примеры для API - на C #, JAVA, Python и т. Д.

То, чего я пытаюсь добиться, - это получить необходимые значения, lat, lng, zip и т. Д. В моем global.asa и установить их в качестве переменных сеанса.Пример ниже для VB.net.

Imports System
Imports System.Net
Imports System.IO

Class Program
    Public Const IP As String = "63.148.239.195"
    Public Const API_KEY As String = "at_6ZsRWjq..."
    Public Const API_URL As String = "https://geo.ipify.org/api/v1?"

    Private Shared Sub Main()
        Dim url As String = API_URL & $"apiKey={API_KEY}&ipAddress={IP}"
        Dim resultData As String = String.Empty
        Dim req As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
        Using response As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse)
            Using stream As Stream = response.GetResponseStream()
                Using reader As StreamReader = New StreamReader(stream)
                    resultData = reader.ReadToEnd()
                End Using
            End Using
        End Using
        Console.WriteLine(resultData)
    End Sub
End Class

1 Ответ

0 голосов
/ 01 марта 2019

Global.asa имеет подпрограмму Session_OnStart, но вы весьма ограничены в том, что вы можете делать в файле Global.asa, поэтому попытка вызвать API из Session_OnStart может привести к проблемам.Вы также не можете использовать Session_OnStart вне Global.asa или вызывать какие-либо функции или подпрограммы из Global.asa, если функции / подпрограммы также не закодированы в Global.asa.

Что мне нравится делатьэто создать файл global.asp, который я использую для установки различных настроек приложения, включения классов для всего сайта и хранения важных функций и подпрограмм, которые необходимы по всему моему сайту.Затем я включаю global.asp на всех страницах моего сайта asp.В global.asp вы можете установить подпрограмму, которая вызывает API ipify.org и сохраняет результаты в виде переменных сеанса с помощью JSON-класса .Затем вы можете вызывать подпрограмму на каждой странице загрузки и выходить из подпрограммы, если API уже был вызван во время сеанса пользователя, или сделать новый вызов, если это новый сеанс.

global.asp

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%

    ' Set some useful application settings, constants, other site-wide classes etc...

    Server.ScriptTimeout = 20
    Session.Timeout = 720
    Response.Charset = "UTF-8"
    Response.LCID = 1033

%>
<!--#include virtual = "/classes/jsonObject.class.asp" -->
<%

    Sub ipify()

        ' Only call the ipify API once per session (but try 3 times)
        ' If session("ipify_called") is true or 3+ attempts have been  
        ' made to call the API then exit the sub

        if session("ipify_called") OR session("ipify_attempts") >= 3 then exit sub

        ' Assign a value of 0 to ipify_attempts if this is a new session

        if isEmpty(session("ipify_attempts")) then session("ipify_attempts") = 0

        Const api_key = "YOUR_API_KEY"
        Const api_url = "https://geo.ipify.org/api/v1"

        Dim rest : Set rest = Server.CreateObject("MSXML2.ServerXMLHTTP")
        rest.open "GET", api_url, False
        rest.send "apiKey=" & api_key & "&ipAddress=" & Request.ServerVariables("REMOTE_ADDR")

        if rest.status = 200 then

            Dim JSON : Set JSON = New JSONobject
            Dim oJSONoutput : Set oJSONoutput = JSON.Parse(rest.responseText)

                if isObject(oJSONoutput("location")) then

                    session("ipify_country") = oJSONoutput("location")("country")
                    session("ipify_region") = oJSONoutput("location")("region")
                    session("ipify_city") = oJSONoutput("location")("city")
                    session("ipify_lat") = oJSONoutput("location")("lat")
                    session("ipify_lng") = oJSONoutput("location")("lng")
                    session("ipify_postalCode") = oJSONoutput("location")("postalCode")
                    session("ipify_timezone") = oJSONoutput("location")("timezone")

                    ' To prevent the api from being called again during this session

                    session("ipify_called") = true

                else

                    ' oJSONoutput("location") should be an object, but it isn't.
                    ' The rest.responseText is probably invalid

                    session("ipify_attempts") = session("ipify_attempts") + 1

                end if

            Set oJSONoutput = nothing
            Set JSON = nothing

        else

            ' Unexpected status code, probably a good idea to log the rest.responseText

            session("ipify_attempts") = session("ipify_attempts") + 1

        end if

        set rest = nothing

    End Sub


    ' Call the ipify sub on each page load.

    Call ipify()

%>

Используемый класс JSON: https://github.com/rcdmk/aspJSON

Не забудьте включить global.asp на другие страницы вашего сайта asp:

<!--#include virtual = "/global.asp" -->

...