首页 > 解决方案 > Companies House API jquery ajax 返回 401

问题描述

我正在尝试从 gov.uk 公司内部 API 返回 json,但我得到了 401

加载资源失败:服务器响应状态为 401(未授权)

我正在使用 ajax() 方法使用 jQuery,我的代码如下所示:

var chApiKey = "{{MYAPIKEY}}:";
var company_number = "09963675";

$.ajax({
  async: false,
  url: "https://api.companieshouse.gov.uk/company/",
  type: "GET",
  crossDomain: true,
  contentType: "application/json",
  data: company_number,
  dataType: 'jsonp',
  success: function(data) {
    //Response text
    alert(data);
  },
  beforeSend: function(xhr) {
    xhr.withCredentials = true;
    xhr.setRequestHeader("Authorization", make_base_auth(encodeURIComponent(chApiKey)))
    // xhr.setRequestHeader ("Authorization", make_base_auth(chApiKey))
  },
  error: function() {
    //Gat failure
    console.log("error");
  }
});

function make_base_auth(user) {
  // var user = user + ":"
  console.log("the api is: " + user)
  var hash = btoa(user);
  return "Basic " + hash;
  // console.log("Basic " + hash + ":");
}

gov.uk上的说明允许您使用有效的 API 密钥进行测试。我还在终端中使用 curl 命令返回了 json

curl -u{{MYAPIKEY}}: https://api.companieshouse.gov.uk/company/09963675

标签: javascriptjqueryajax

解决方案


可能您获得的 URL 与您预期的不同(使用?, 因为这是data在 GET 请求中附加到 URL 的方式)。

您需要添加company_number到 URL(并适当地删除dataType: 'jsonp'):

url: "https://api.companieshouse.gov.uk/company/" + company_number,

下面的片段在 3 种情况下显示了您的请求的 URL:

  1. 您当前的代码
  2. dataType: 'jsonp'删除后的代码
  3. company_number直接添加到url

var chApiKey = "{{MYAPIKEY}}:";
var company_number = "09963675";

$.ajax({
  async: false,
  url: "https://api.companieshouse.gov.uk/company/",
  type: "GET",
  crossDomain: true,
  contentType: "application/json",
  data: company_number,
  dataType: 'jsonp',
  success: function(data) {
    //Response text
    alert(data);
  },
  beforeSend: function(xhr, settings) {
    console.log("dataType: 'jsonp' :", settings.url)
    xhr.withCredentials = true;
    xhr.setRequestHeader("Authorization", make_base_auth(encodeURIComponent(chApiKey)))
    // xhr.setRequestHeader ("Authorization", make_base_auth(chApiKey))
  },
  error: function() {
    //Gat failure
    //console.log("error");
  }
});

function make_base_auth(user) {
  // var user = user + ":"
  //console.log("the api is: " + user)
  var hash = btoa(user);
  return "Basic " + hash;
  // console.log("Basic " + hash + ":");
}

$.ajax({
  async: false,
  url: "https://api.companieshouse.gov.uk/company/",
  type: "GET",
  crossDomain: true,
  contentType: "application/json",
  data: company_number,
  success: function(data) {
    //Response text
    alert(data);
  },
  beforeSend: function(xhr, settings) {
    console.log("dataType: 'jsonp' removed  :", settings.url)
    xhr.withCredentials = true;
    xhr.setRequestHeader("Authorization", make_base_auth(encodeURIComponent(chApiKey)))
    // xhr.setRequestHeader ("Authorization", make_base_auth(chApiKey))
  },
  error: function() {
    //Gat failure
    //console.log("error");
  }
});

$.ajax({
  async: false,
  url: "https://api.companieshouse.gov.uk/company/" + company_number,
  type: "GET",
  crossDomain: true,
  contentType: "application/json",
  success: function(data) {
    //Response text
    alert(data);
  },
  beforeSend: function(xhr, settings) {
    console.log("company number added in url  :", settings.url)
    xhr.withCredentials = true;
    xhr.setRequestHeader("Authorization", make_base_auth(encodeURIComponent(chApiKey)))
    // xhr.setRequestHeader ("Authorization", make_base_auth(chApiKey))
  },
  error: function() {
    //Gat failure
    //console.log("error");
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


推荐阅读