【问题标题】:Whats the simpelst way to split multiple paramters with query_string?用 query_string 分割多个参数的最简单方法是什么?
【发布时间】:2019-12-23 13:36:03
【问题描述】:

我正在使用这样的 URL 呼叫代理:

http://myserver/db.nsf/testagent?openagent&param1=ONE&param2=TWO

代理 'testagent' 应该尽快获取参数的值。我读到'query_string' 应该这样做,但是当我真的只想获得值 ONETWO 时,代码会变得很长。有没有更简单/更快的方法来获取这些值?

我的 Lotus Script 代码如下所示:

Dim s As New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim arg As String, p1 As Long

arg = s.DocumentContext.Query_String(0)
p1 = InStr(arg, "&")

If p1 = 0 Then
    Print "ERROR: No arugment."
    Exit Sub
Else
    arg = LCase(Mid$(arg, p1 + 1))
    ' (more code): Split again the ARG to & (more code)
    ' (more code): Split the values again to =, after that fill the 2 element as param 1 (ONE) and param 2 (TWO)
End If

【问题讨论】:

    标签: lotus-notes lotus-domino lotusscript lotus


    【解决方案1】:

    您的问题标题中已经有了答案:只需拆分字符串...

    此外,我通常将列表用于此类任务,因为它们访问起来既简单又快捷。我会把它作为一个单独的函数拿出来,以便能够重用代码并使所有内容更具可读性:

    Function GetQuerystringParameters( strQueryString as String ) as Variant
      Dim varParams as Variant
      Dim lstrParams List as String
      varParams = Split( strQueryString, "&")
      Forall strParam in varParams
        If Instr(strParam, "=") > 0 then
          lstrParams( strtoken( strParam, "=", 1))= strtoken( strParam, "=", 2)
        End If
      End ForAll
      GetQuerystringParameters = lstrParams
    End Function
    

    现在您可以简单地获取正确的参数,而且参数甚至不需要按正确的顺序排列:

    Dim urlParams as Variant
    Dim yourArg as String
    urlParams = GetQuerystringParameters( arg )
    If isElement( urlParams( "param1" ) ) then
      yourArg = urlParams( "param1" )
    Else
      Print "Error: no param1"
      Exit Sub
    End If
    

    希望对您有所帮助。

    编辑:我什至可能会以此为基础创建一个类,以进一步减少代码并使其更好地重用:

    Class UrlParameters
      Private lstrParams List as String
      Sub New( strQueryString as String )
        Call Me.GetParameters( strQueryString )
      End Sub
      Private Sub GetParameters( strQs as String )
        Dim varParams as Variant
        varParams = Split( strQs, "&")
        Forall strParam in varParams
          If Instr(strParam, "=") > 0 then
            Me.lstrParams( strtoken( strParam, "=", 1)) = strtoken( strParam, "=", 2)
          End If
        End ForAll
      End Sub
      Function getUrlParameter( strParam as String ) as String
        If Iselement(Me.lstrParams(strParam)) then
          getUrlParameter = Me.lstrParams(strParam)
        Else
          GetUrlParameter = ""
        End If
      End Function
    End Class
    

    你可以这样使用这个类:

    Dim myParams as UrlParameters
    Set myParams = New UrlParameters( arg )
    param1 = myParams.getUrlParameter("param1")
    param2 = myParams.getUrlParameter("param2")
    

    【讨论】:

    • 抱歉延迟回复 - 非常感谢,它有很大帮助..
    • Me.lstrParams( strtoken( strParam, "=", 1) = strtoken( strParam, "=", 2) 行有一条错误消息:Not a sub or function name - 即使我在最后加了一个 ')',它仍然不能正常工作,缺少什么?
    • 缺失的 ')' 就在 '=' 之前,但如果你自己没有发现,那么你不理解代码的作用,可能不应该使用它。 . 但这只是我的拙见....
    • 谢谢,一切都很好。有些功能对我来说是新的,但这不是不学习它们的理由,也不是不使用它的理由。别担心,谢谢! :-)
    • 好的。很抱歉,我忘记了通常的免责声明:我在此处发布的代码是在浏览器中输入的。没有自动完成,没有语法检查,不保证它可以工作......将它用作真正解决方案的样板。
    【解决方案2】:

    为了快速简单,尝试对查询字符串的解码版本使用基本字符串处理:

    'Get the decoded query string value and extract p1 and p2
    arg = s.DocumentContext.Query_String_Decoded(0)
    p1 = StrRight(arg, "param1=")
    If instr(p1, "&") Then p1 = StrLeft(p1, "&")
    p2 = StrRight(arg, "param2=")
    If instr(p2, "&") Then p2 = StrLeft(p1, "&")
    

    所以 p1="ONE" 和 p2="TWO"。解码后的 CGI 变量应该为您处理任何字符编码。 (如果你不使用它,要么编写自己的解码器,要么永远不要在参数中使用非字母数字字符)。

    当然你可以把它抽象成一个函数,但是你会损失一点速度,而且除非你有很多参数,否则函数并不是真正需要的:

    Function GetParam(arg, px) as astring
        GetParam = StrRight(arg, px & "=")
        If instr(GetParam, "&") Then GetParam = StrLeft(GetParam, "&")
    End Function
    

    然后简单地调用它:

    arg = s.DocumentContext.Query_String_Decoded(0)
    p1 = GetParam(arg, "param1")
    p2 = GetParam(arg, "param2")
    

    将参数放在列表中没有任何问题,但很少需要在解析出参数后重用它,尽管列表速度很快,但它们会增加开销和复杂性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 2020-09-16
      • 2021-04-19
      • 2011-07-07
      • 1970-01-01
      相关资源
      最近更新 更多