excel - 试图获取基本公司信息 - API 给出 ​​{“error” :”Empty Authorization header”, ”type”:”ch:service”}

标签 excel vba api authentication

vba代码

Sub read_from_api() 
    Dim url As String, parametrs As String
    url = "https://api.company-information.service.gov.uk/company/"
    parametrs = "?q={00519500}"
    
    'send request
    Dim request As New WinHttpRequest
    request.Open "Get", url & parametrs
    'auth=(api_key,''))
    request.SetRequestHeader "api_key", "10d54202-df9c-4e72-8753-f11bh5c7c427"
    request.Send
    
    If request.Status <> 200 Then
        MsgBox request.ResponseText
        Exit Sub
    End If
    
    Dim response As Object
    Set response = JsonConverter.ParseJson(request.ResponseText)  
End Sub
请帮忙

最佳答案

看着那个API specification ,请求的规范显示:

GET https://api.company-information.service.gov.uk/company/{companyNumber}
{companyNumber}部分意味着用您要检查的公司编号替换整个事情。 {}字符只是在那里表明您需要用真实数据和那些{}替换这个占位符不应该出现在真实的请求中。
我们还可以看到 companyNumber 是路径的一部分,而不是查询组件的一部分,因此我们将像这样编写对您的示例公司编号的请求(保持您使用的相同变量名称):
url ="https://api.company-information.service.gov.uk/company/00519500"
parametrs = ""
如果您查看 authentication implementation对于此服务,您将看到 API key 应通过基本身份验证发送。因此,与其拥有“api_key” header (根本与本规范无关),不如使用“Authentication” header 。
但是,它并不像在该 header 中包含您的 API key 那么简单。根据关于身份验证的页面,我们需要指定我们正在使用基本身份验证,使用 API key 作为用户名,并且不需要指定密码。该页面提到RFC2617如果你去那里,你会看到你需要在用户名和密码之间放一个冒号,然后 base64 对整个字符串进行编码。即使我们不需要密码,我们仍然必须包含冒号字符。
VBA 没有内置的 base64 编码功能,但来自 this StackOverflow answer 的功能。可能是最容易使用的。只需添加对“Microsoft XML, v3.0”的引用,然后将该答案中的代码添加到您的项目中(或者如果您不想添加新的引用,请参阅 this answer)。
使用该代码,我们可以创建“身份验证” header ,如下所示:
request.SetRequestHeader "Authentication", "Basic " & EncodeBase64("10d54202" & ":")
(请注意,我只包含了您的 API key 的一部分,但您显然应该使用完整的东西)
这些更改有望使您的代码正常工作。
其他要点:
  • 我没有尝试过问题中的 API key 是否有效,但如果它是真正的 key ,那么您应该生成一个新 key 并删除旧 key 。否则,您将冒着有人找到该 key 并滥用它的风险,从而导致您受到速率限制等
  • 该服务有 sandbox environment并且,在可能的情况下,您应该针对该环境进行测试,以确保您的代码在将其用于生产环境之前可以正常工作
  • 关于excel - 试图获取基本公司信息 - API 给出 ​​{“error” :”Empty Authorization header”, ”type”:”ch:service”},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72675804/

    相关文章:

    vba - 如何在 VBA 的列中找到大于零的第一个值?

    excel - 如何找到字符串变量的长度?

    excel - Excel 2010 中的 VBA : Scripting. 函数的字典返回值不会作为参数传递给包装函数调用

    swift - 为什么我收到一个奇怪的错误 : nw_protocol_get_quic_image_block_invoke dlopen libquic failed in SwiftUI?

    sql - CSV 导出 SQL 服务器

    vba - 检索您在其中使用宏的单元格

    arrays - Excel-根据分数的投票制作数组

    vba - 如何在不打开的情况下保存用vba编码的excel文件?

    angular - Angular 4 中的多个顺序 API 调用

    performance - 根据资源的时间戳生成 ETag 的最佳方法是什么