【问题标题】:Classic ASP xmlhttp get how to add authentication for sendgrid api经典 ASP xmlhttp 获取如何为 sendgrid api 添加身份验证
【发布时间】:2016-10-06 18:57:05
【问题描述】:

我正在尝试通过他们的 API 从我的 SendGrid 帐户获取数据。我正在使用经典的 ASP。我找到了some code that works,除了我需要按照in their documentation 的描述添加对SendGrids API 的授权。

我发现几个示例似乎表明我需要在 xmlhttp.open 之后和 xmlhttp.send 之前添加 xmlhttp.setRequestHeader 但是当我取消注释下面的“xmlhttp.setRequestHeader”行时,我在我的浏览器。谁能告诉我现在将授权部分添加到 xmlhttp 对象?

为清楚起见进行编辑:当我评论“xmlhttp.setRequestHeader...”行时,脚本运行并返回预期的 json 结果,表明我需要进行身份验证。当我取消注释该行时,我收到 500 错误。我在下面的代码中用通用占位符替换了我的工作 api 密钥(使用 cURL 命令测试)。真正的密钥在我服务器上的文件中。

这是我正在使用的代码:

<%@ Language=VBScript %>
<%
Set xmlhttp = CreateObject("Msxml2.ServerXMLHTTP.6.0")
xmlhttp.open "GET", "https://api.sendgrid.com/v3/campaigns?limit=10&offset=0 HTTP/1.1", false
'xmlhttp.setRequestHeader "Authorization", "Bearer my-correct-sendgrid-api-key"
xmlhttp.send ""
Response.AddHeader "Content-Type", "application/json;charset=UTF-8"
Response.Charset = "UTF-8"
pageReturn = xmlhttp.responseText

Set xmlhttp = Nothing 
response.write pageReturn
%>

似乎基础工作正常,因为上面的代码返回了预期的 json 结果,错误消息说我需要进行身份验证:

{
    errors: [
        {
        field: null,
        message: "authorization required"
        }
    ]
}

SendGrids 文档使用此示例:

GET https://api.sendgrid.com/v3/resource HTTP/1.1
Authorization: Bearer Your.API.Key-HERE

【问题讨论】:

  • 在您的代码中,xmlhttp.setRequestHeader... 行被注释了吗?
  • added correct syntax highlighting 应该强调@SearchAndResQ 的观点。 ' 字符在 VBScript 中用于注释掉一行,这意味着 VBScript 将在执行时忽略它,因此目前 xmlhttp.setRequestHeader "Authorization", "Bearer my-correct-sendgrid-api-key" 被忽略。删除' 评论。
  • 感谢您的回复,该行已被注释,因为当我取消注释时会产生 500 错误。我想问一下这是否是添加身份验证的正确方法,如果是,我该如何排除故障?
  • 这是一个 Authorization 标头,是的,是检查授权的正确方法,并且被许多主流 API 使用。如果他们希望您传递 HTTP Authorization 标头,那么这就是您传递的内容,但显然 Your.API.Key-HERE 需要替换为 API 创建者 提供的真实 API 密钥(通常有一些 @ 987654324@).
  • 我应该在我原来的问题中指出,在我在服务器上使用的代码中,正确的 api 密钥已经到位。我已经使用返回预期结果的 cURL 命令对其进行了测试。

标签: json asp-classic xmlhttprequest sendgrid


【解决方案1】:

在 cmets 中 some discussion 之后,问题似乎出在这一行

xmlhttp.setRequestHeader "Authorization", "Bearer my-correct-sendgrid-api-key"

这是在 IServerXMLHTTPRequest 实例上设置 HTTP 授权标头的正确方法。

Bearer my-correct-sendgrid-api-key 需要替换为您的实际 API 密钥,否则您可能会收到错误响应。

根据documentation;

来自How To Use The Web API v3 - Authentication
可以在您的帐户中生成 API 密钥 - 请访问 https://app.sendgrid.com/settings/api_keys。要使用密钥,您必须设置一个名为“Authorization”的纯文本标头,标头的内容为“Bearer XXX”,其中 XXX 是您的 API 密钥。

【讨论】:

  • 我有一个使用 cURL 命令测试的有效 api 密钥。我只是没有将它包含在我发布的代码中。它在我的服务器上的版本中。很抱歉造成混乱。
  • @slamslam102 在这种情况下,您收到的错误是什么?,您不是很清楚。我们是来帮忙的,但我们不介意读者,您需要以某种方式与我们见面。
  • 当我取消注释该行时,我的浏览器中出现 500 错误。我一定缺少一些基本的东西。我无权访问日志,所以我不能更具体。对困惑感到抱歉。我想我没有很好地提出我的问题。
  • @slamslam102 如果您没有收到详细的错误消息,请确保将 Send Errors to Browser 设置为 True
  • @slamslam102 从您的 URL 中删除 HTTP/1.1,它不是 URL 的一部分,仅供参考。
【解决方案2】:

如果您无法访问错误日志,您可以使用On Error Resume Next 捕获错误并查看错误描述告诉您的内容。

<%@ Language=VBScript %>
<%
Set xmlhttp = CreateObject("Msxml2.ServerXMLHTTP.6.0")

xmlhttp.open "GET", "https://api.sendgrid.com/v3/campaigns?limit=10&offset=0", false
On Error Resume Next
xmlhttp.setRequestHeader "Authorization", "Bearer xx.xxxxx.xxxx"
If Err.Number<>0 Then
    Response.Write "Error:" & Err.Description & "<br>"
End If
On Error GoTo 0
xmlhttp.send ""
Response.AddHeader "Content-Type", "application/json;charset=UTF-8"
Response.Charset = "UTF-8"
pageReturn = xmlhttp.responseText

Set xmlhttp = Nothing 
response.write pageReturn
%>

见:On Error Statement

【讨论】:

    【解决方案3】:

    谢谢大家!感谢Kul-Tigin 指出我的错误,这是对 SendGrids 示例中部分 url 的注释“HTTP/1.1”的误解。

    当我改变时:

    xmlhttp.open "GET", "https://api.sendgrid.com/v3/campaigns?limit=10&offset=0 HTTP/1.1", false
    xmlhttp.setRequestHeader "Authorization", "Bearer my-correct-sendgrid-api-key"
    

    到:

    xmlhttp.open "GET", "https://api.sendgrid.com/v3/campaigns?limit=10&offset=0", false
    xmlhttp.setRequestHeader "Authorization", "Bearer my-correct-sendgrid-api-key"
    

    它开始工作没有错误。这是工作代码:

    <!-- language: lang-js -->
    <%@ Language=VBScript %>
    <%
    Set xmlhttp = CreateObject("Msxml2.ServerXMLHTTP.6.0")
    xmlhttp.open "GET", "https://api.sendgrid.com/v3/campaigns?limit=10&offset=0", false
    xmlhttp.setRequestHeader "Authorization", "Bearer my-correct-sendgrid-api-key"
    xmlhttp.send ""
    Response.AddHeader "Content-Type", "application/json;charset=UTF-8"
    Response.Charset = "UTF-8"
    pageReturn = xmlhttp.responseText
    
    Set xmlhttp = Nothing 
    response.write pageReturn
    %>
    

    SearchAndResQ 我会阅读您提供的关于错误捕获的链接。谢谢!

    【讨论】:

      【解决方案4】:

      这适用于从经典 asp 访问远程 api。

      反过来是创建一个经典的 api 和客户端需要向我们发送一个令牌 auth

      在这种情况下,您会得到这个值:Request.ServerVariables("HTTP_Authorization")

      这需要我数周和数周的理解,但我知道如何并希望与所有 te asp 开发人员分享。永远的asp

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 2011-03-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      相关资源
      最近更新 更多