【问题标题】:Not able to get response from API through angular?无法通过角度从 API 获得响应?
【发布时间】:2016-03-18 05:30:44
【问题描述】:

我的代码如下

$scope.LoadSearchResults = function () {
        $scope.hotels = '';
        $scope.allData = '';
        var mydata = '';
        $http({
            url: 'myurl',
            Authorization : 'code',
            method: 'POST',
            header: { 'Content-type': 'text/json' }
        })
        .success(function (mydata) {
           $scope.hotels = JSON.parse(JSON.stringify(mydata.SearchResponse.Hotels.Hotel));
           $scope.allData = JSON.parse(JSON.stringify(mydata.SearchResponse.Hotels.Hotel));

           $scope.AllLocality($scope.allData);
        })
        .error(function (mydata) {
            $scope.hotels = "Failed";
            console.log(JSON.stringify(mydata));
        });        
    }

并且得到错误是 “跨域请求被阻止:同源策略不允许读取位于http://example.com/some-page 的远程资源。(原因:缺少CORS 标头'Access-Control-Allow-Origin')。”

我该如何解决这个问题?

【问题讨论】:

标签: angularjs


【解决方案1】:

这不是 Angular 问题。

原因是您正在触发跨源请求(例如,您的应用程序位于域上,而url: 'myurl' 指定的请求针对不同的域)并且 HTTP 不允许它,除非服务器特别添加了权限接收通过在响应中添加 CORS 标头来请求。

要解决您的问题,请在此处查看 4 个选项之一(我相信您可以根据您的具体设置找到更多):

  • 让您的应用程序向同一个域发出请求,这通常是首选和最安全的方法(例如,托管 Angular 代码的 Web 应用程序还负责通过 $http 响应您正在执行的 xhr)李>
  • 如果您可以控制服务器如何创建响应,则添加此类标头应该相当容易(我无法在此处添加示例,因为它完全取决于您使用的 Web 服务器或应用程序网关)
  • 如果您无法控制服务器响应(最重要的是它的标头),您可以在中间添加自己的服务器作为请求代理,从而使您的 JS 应用程序向您的服务器发出请求(不会产生 CORS 问题)以及服务器本身向第三方提供商发出代理请求
  • 如果您只需要 GET 请求(从您的 sn-p 看来情况并非如此),如果服务器支持此类请求,您可以使用 angular 的 $http JSONP

【讨论】:

  • 您好格鲁,感谢您的回复。由于我无法访问服务器,因此我不确定服务器响应。有没有其他解决方案?我也在尝试以下代码...$http({ method: "Post", url: $rootScope.ServiceBaseUri + "ControllerName/Function", data: { Email: Email }, datatype: "json" }).success(function (res) { accesstoken = res.MESSAGE; })
  • 嘿@Samy 我刚刚用其他几个选项编辑了我的答案。如果您确实需要进行跨域请求,n.3 可能是最安全的,但会涉及一些额外的(后端)编码
【解决方案2】:

您好,我也遇到了同样的问题,但现在我已经通过以下方式解决了:

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Authorization");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");

请在 parent::__construct() 之后在控制器上传递标头;

【讨论】:

    猜你喜欢
    • 2018-04-23
    • 2020-08-25
    • 2022-11-23
    • 1970-01-01
    • 2020-05-08
    • 2017-11-28
    • 2023-01-04
    • 2019-04-27
    相关资源
    最近更新 更多