【问题标题】:Get null response in http get ionic在http中获取空响应获取离子
【发布时间】:2015-02-15 08:59:45
【问题描述】:

我正在使用 ionic 和 angularjs 开发移动应用程序。一切都很好,但我不知道为什么当我尝试发出 http get 请求时,会调用失败方法并且数据为空且状态为 0。我做错了什么?这是我的 app.js

angular.module('starter', ['ionic'])//, 'starter.controllers'])
    .run(function($ionicPlatform) {

      $ionicPlatform.ready(function() {
        // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
        // for form inputs)
      if(window.cordova && window.cordova.plugins.Keyboard) {
        cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
      }
      if(window.StatusBar) {
        StatusBar.styleDefault();
      }
    });
    })

    .config(function($stateProvider, $urlRouterProvider) {
      $stateProvider

      .state('login_page', {
        url: '/login_page',
        templateUrl: 'templates/login_page.html',
        controller: 'LoginPageCtrl'
      })
      $urlRouterProvider.otherwise('/login_page');
    })

    .controller('LoginPageCtrl', function($scope , $http) {
      $http.get('http://91.109.23.124:3000/api/v1/discounts.json').success(function(data, status, headers, config) {
        console.log('success');
      })
      .error(function(data, status) {
        console.log('error');
      })  ;
    })

【问题讨论】:

  • $http 请求中的状态 0 通常意味着未访问服务器。你收到 CORS 错误了吗?
  • 是的,问题解决了。 CORS 问题!

标签: angularjs ionic


【解决方案1】:

这是一个 CORS 问题,但除了 Access-Control-Allow-Origin 之外,还必须允许 HTTP 方法(至少在 express 应用程序中) `访问控制允许方法

PATCH 正在返回 status 0,而 GET, POST, PUT, OPTIONS 正在工作。

这是我处理 CORS 的快速中间件:

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Methods", "POST, GET, OPTIONS,\
    PATCH, PUT, DELETE");
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, \
    Content-Type, Accept, Authorization");
  next();
});

【讨论】:

    【解决方案2】:

    我遇到了这个问题,对我来说这是一个 iOS9 应用程序传输安全问题。我暂时只是在 app.plist 中设置了 NSAllowAribitrayLoads 以继续开发,同时等待后端满足 App Transport Security 规范。

    【讨论】:

      【解决方案3】:

      对我来说,这是白名单问题。有关白名单网址,请参阅 cordova 插件

      https://github.com/apache/cordova-plugin-whitelist

      从 Cordova 4.0 开始,cordova 收紧了其白名单政策。

      【讨论】:

        【解决方案4】:

        对我来说,这是一个 CORS 问题。在 Sails.js 中,我必须设置 origin: '*' 和 headers: 'content-type,X-Bearer-Token'

        【讨论】:

          【解决方案5】:

          0 是一个模糊的状态码,可能意味着很多事情。有关更多信息,请参阅此答案https://stackoverflow.com/a/26451773/1487831

          所以我用你的代码http://plnkr.co/edit/2OWOxuI7kjEzcbOzp9lZ?p=preview创建了一个plunker

          script.js

          // Code goes here
          
          angular.module('starter', []) //, 'starter.controllers'
          
          
          
          .controller('LoginPageCtrl', function($scope, $http) {
            $scope.status = '';
            $scope.data = '';
            $scope.headers = '';
            $scope.config = '';
            $scope.showResponse = false;
          
            $http.get('http://91.109.23.124:3000/api/v1/discounts.json').success(function(data, status, headers, config) {
                    $scope.showResponse = true;
                $scope.data = data;
                $scope.status = status;
                $scope.headers = headers;
                $scope.config = config;
            })
              .error(function(data, status,headers,config) {
                $scope.showResponse = true;
                $scope.data = data;
                $scope.status = status;
                $scope.headers = headers;
                $scope.config = config;
              });
          })
          

          index.html

          <!DOCTYPE html>
          <html ng-app="starter">
          
          <head>
            <script data-require="angular.js@1.3.6" data-semver="1.3.6" src="https://code.angularjs.org/1.3.6/angular.js"></script>
            <link rel="stylesheet" href="style.css" />
            <script src="script.js"></script>
          </head>
          
          <body ng-controller="LoginPageCtrl">
            <div ng-if="!showResponse">
              <span>Requesting...</span>
            </div>
            <div ng-if="showResponse">
              <span>Request finished with </span>
              <span>status {{status}}</span> 
              <br/>
          
              <span>Url : {{config.url}}</span> 
              <br/>
              <span>method : {{config.method}}</span> 
              <br/>
              <span>Request : {{config.transformRequest}}</span> 
              <br/>
              <span>Response : {{config.transformResponse}}</span> 
              <br/>
          
              <span>Header : {{config.headers}}</span> 
              <br/>
            </div>
          </body>
          
          </html>
          

          您似乎遇到了 CORS 问题。

          如果您在服务器端有控制权。将 Access-Control-Allow-Origin 包含到响应标头中,您应该一切顺利。

          【讨论】:

          • 谢谢,关于服务器CORS问题的问题。
          猜你喜欢
          • 1970-01-01
          • 2022-06-28
          • 2016-09-14
          • 2012-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多