代码之家  ›  专栏  ›  技术社区  ›  user2369824

使用addheader进行授权的经典asp调用api

  •  0
  • user2369824  · 技术社区  · 10 年前

    我有一个页面调用了一个在测试模式下不需要任何授权的api。
    我们现在正在迁移到一个需要用户名和密码的实时环境。

    api提供程序已发送以下消息:

    要访问这些服务,请通过添加以下HTTP标头来发送请求。 授权:Basic Base64Encode(用户名:密码)

    我不知道正确的语法,想知道是否有人能帮我。

    最初的调用(并且工作正常)是:

    Dim xmlobj, username, password
    username="myusername"
    password="mypassword"
    Set xmlobj = server.CreateObject("MSXML2.DOMDocument.3.0")
    xmlobj.async = false
    xmlobj.setProperty "ServerHTTPRequest", True
    xmlObj.AddHeader "Authorization", "Basic", Base64Encode(username & ":" & password)
    xmlobj.load(sUrl)
    

    上述代码引发错误

    /api-test.asp |20|800a000d|Type_mismatch:_'Base64Encode'
    

    如有任何帮助,将不胜感激。

    1 回复  |  直到 10 年前
        1
  •  0
  •   Community CDub    8 年前

    就像我在 comments ,的语法 Authorization 标头不正确。

    API示例不期望 "Base64Encode('username','password')" 这是API提供的一个示例,向您展示如何获取字符串 "username:password" 并且Base64对其进行编码 批准 标头应为。

    但你仍然需要 Base64Encode() 代码工作的函数定义。

    Base64编码() MyASC() 函数取自 Base64 encode VBS function (vb encoder algorithm), source code

    这样的事情应该会奏效;

    <%
    Function Base64Encode(inData)
      'rfc1521
      '2001 Antonin Foller, Motobit Software, http://Motobit.cz
      Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
      Dim cOut, sOut, I
    
      'For each group of 3 bytes
      For I = 1 To Len(inData) Step 3
        Dim nGroup, pOut, sGroup
    
        'Create one long from this 3 bytes.
        nGroup = &H10000 * Asc(Mid(inData, I, 1)) + _
          &H100 * MyASC(Mid(inData, I + 1, 1)) + MyASC(Mid(inData, I + 2, 1))
    
        'Oct splits the long To 8 groups with 3 bits
        nGroup = Oct(nGroup)
    
        'Add leading zeros
        nGroup = String(8 - Len(nGroup), "0") & nGroup
    
        'Convert To base64
        pOut = Mid(Base64, CLng("&o" & Mid(nGroup, 1, 2)) + 1, 1) + _
          Mid(Base64, CLng("&o" & Mid(nGroup, 3, 2)) + 1, 1) + _
          Mid(Base64, CLng("&o" & Mid(nGroup, 5, 2)) + 1, 1) + _
          Mid(Base64, CLng("&o" & Mid(nGroup, 7, 2)) + 1, 1)
    
        'Add the part To OutPut string
        sOut = sOut + pOut
    
        'Add a new line For Each 76 chars In dest (76*3/4 = 57)
        'If (I + 2) Mod 57 = 0 Then sOut = sOut + vbCrLf
      Next
      Select Case Len(inData) Mod 3
        Case 1: '8 bit final
          sOut = Left(sOut, Len(sOut) - 2) + "=="
        Case 2: '16 bit final
          sOut = Left(sOut, Len(sOut) - 1) + "="
      End Select
      Base64Encode = sOut
    End Function
    
    Function MyASC(OneChar)
      If OneChar = "" Then MyASC = 0 Else MyASC = Asc(OneChar)
    End Function
    
    Dim xmlobj, username, password
    username="myusername"
    password="mypassword"
    Set xmlobj = server.CreateObject("MSXML2.XMLHTTP.3.0")
    xmlobj.Open "GET", sUrl, False
    xmlobj.setRequestHeader "Authorization", "Basic " & Base64Encode(username & ":" & password)
    xmlobj.Send
    
    Dim xmldoc
    If xmlobj.status = 200 Then
      Set xmldoc = Server.CreateObject("MSXML2.DOMDocument.3.0")
      xmldoc.Load xmlobj.ResponseXML
    Else
      Response.Write "An error occurred!"
    End If
    %>