Azure结算API javascript返回CORS错误,但在使用邮递员

时间:2017-08-16 08:54:30

标签: php jquery azure cors azure-billing-api

我现在不知所措。我试图通过我的php应用程序到达Azure Billing & Usage API,但不断收到以下错误:

  

XMLHttpRequest无法加载   https://ea.azure.com/rest/ {agreementnumber} /使用情况的报告。回应   预检请求未通过访问控制检查:否   请求中存在“Access-Control-Allow-Origin”标头   资源。因此,不允许原点“http://localhost”访问。

我知道链接提到的网址是https://consumption.azure.com/v2/enrollments,但是这对我不起作用,在与Azure技术服务联系后我需要使用older ea.azure.com entry point

我正在尝试从我的开发xampp localhost服务器以及生产服务器(实时内部网解决方案),但无济于事。使用postman连接成功,我收到API的有效响应。

基本上API只需要一个API密钥,我有。此后不需要授权。

由于Postman在从API获得有效响应方面取得了成功,我使用他们的代码生成器来获取:

  • php script
  • javascript脚本
  • jquery ajax script

他们都为我返回了同样的错误;显示了jquery ajax one,因为首选的是:

var settings = {
              "async": true,
              "crossDomain": true,
              "url": "https://ea.azure.com/rest/<?php echo $agreement_number; ?>/usage-reports",
              "method": "GET",
              "dataType": 'json',
              "headers": {
                "authorization": "bearer <?php echo $key; ?>"
              },
                error: function (jqXHR, exception) {
                    var msg = '';
                    if (jqXHR.status === 0) {
                        msg = 'Not connected.\n Verify Network.';
                    } else if (jqXHR.status == 404) {
                        msg = 'Requested page not found. [404]';
                    } else if (jqXHR.status == 500) {
                        msg = 'Internal Server Error [500].';
                    } else if (exception === 'parsererror') {
                        msg = 'Requested JSON parse failed.';
                    } else if (exception === 'timeout') {
                        msg = 'Time out error.';
                    } else if (exception === 'abort') {
                        msg = 'Ajax request aborted.';
                    } else {
                        msg = 'Uncaught Error.\n' + jqXHR.responseText;
                    }
                    console.log(msg);
                }
            }

            $.ajax(settings).done(function (response) {
              console.log(response);
            });

我不明白为什么Postman能够连接到API并检索它的信息,而完全相同的代码在我的应用程序中使用时会产生CORS错误。

这是否与我的应用程序托管在公司网络内部的虚拟机中有关,而无法从互联网访问?

编辑:Rory提到了JS的严格安全限制 - 因此我也添加了php脚本。当我使用php 5.6时,我默认没有类httpRequest,所以我使用twslankard的httpRequest class并调整它以接受这样的自定义标题(添加了公共函数):

public function setHeaders($headers) {
  if(is_array($headers)) {
      foreach($headers as $name => $val) {
          $this->headers[$name] = $val;
      }
  }

}

像这样打电话给这个班:

include_once($_SERVER['DOCUMENT_ROOT'].'/functions/class_httprequest.php');
$request = new HttpRequest($url, 'GET');
$request->setHeaders(array(
  'api-version' => '2014-09-02',
  'authorization' => $key
));
try {
    $response = $request->send();
    echo $request->getStatus().'<br>';
    echo $request->getResponseBody();
} catch (HttpException $ex) {
    echo $ex;
}

使用php版本它确实有效,诀窍是添加了api-version标头,之前我使用php脚本得到了一个http 400错误。

1 个答案:

答案 0 :(得分:1)

使用php版本它确实有效,诀窍是添加了api-version标头,之前我使用php脚本得到了一个http 400错误。