yii2:- how can i manage angularjs post request in

2019-07-13 01:39发布

问题:

I am trying to send post request from angular controller to yii front end controller.

Here is my controller.js

 'use strict';

define(['angular', 'd3', 'd3Cloud', 'services'], function (angular, d3) {
/* Controllers */
return angular.module('oc.controllers', ['oc.services'])
    .controller('InitCtrl', ['$scope','$http', function ($scope,$http) {


          $scope.loginFun = function() {

            var formData = {username:$scope.txtUserName, pwd:$scope.txtPassword};
            $http.post("http://localhost/yii2-angular-seed-master/frontend/web/site/login",formData).success(function(data){
              alert(data);
            });

          }             

      $scope.promos=[];
          var requestPromo = $http.get('http://localhost/yii2-angular-seed-master/frontend/web/category/promos');
          requestPromo.success(function( data ) {
            $scope.promos=data;
          });
    }])

    .config(['$httpProvider', function ($httpProvider) {
         $httpProvider.defaults.headers.post['X-CSRF-Token'] = $('meta[name="csrf-token"]').attr("content");
         $httpProvider.defaults.headers.common['Accept'] = 'application/json, text/javascript';
         $httpProvider.defaults.headers.common['Content-Type'] = 'application/json; charset=UTF-8';
    }])


 });

This is my yii2 frontend controller.

 use Yii;

 class SiteController extends Controller
 {
     public function behaviors()
     {
          return [
            'access' => [
            'class' => AccessControl::className(),
            'only' => ['logout', 'signup'],
            'rules' => [
                [
                    'actions' => ['signup'],
                    'allow' => true,
                    'roles' => ['?'],
                ],
                [
                    'actions' => ['logout'],
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ],
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'logout' => ['post'],
            ],
        ],
    ];
}

/**
 * @inheritdoc
 */
public function actions()
{
    return [
        'error' => [
            'class' => 'yii\web\ErrorAction',
        ],
        'captcha' => [
            'class' => 'yii\captcha\CaptchaAction',
            'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
        ],
    ];
}

public function actionIndex()
{
    return $this->render('index');
}


public function actionLogin()
{
// How to handle post request here?
// which code i have to use here?
// My angular get request is successfully work.
// But Post request not work. How can i manage it?
}




public function actionLogout()
{
    Yii::$app->user->logout();

    return $this->goHome();
}

}

I am getting this error in Firebug.

POST http://localhost/yii2-angular-seed-master/frontend/web/site/login 400 Bad Request

"NetworkError: 400 Bad Request - http://localhost/yii2-angular-seed-master/frontend/web/site/login"

Please suggest me a code for:

public function actionLogin()
{
   // How to handle post request here?
  // which code i have to use here?
  // My angular get request is successfully work.
  // But Post request not work. How can i manage it?
}

回答1:

Response with code 400, sends when you do not have sent CSRF or some attributes to GET request. May be you need to fix your $httpProvider to this:

angular.module('app').config(appconfig);
appconfig.$inject = ['$httpProvider'];
function appconfig($httpProvider){
    $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
    $httpProvider.defaults.headers.common['X-CSRF-Token'] = $('meta[name="csrf-token"]').attr('content');
}


回答2:

var app = angular.module("myApp", [], 
function($httpProvider) {
  // Use x-www-form-urlencoded Content-Type  
  $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
  $httpProvider.defaults.headers.common['X-CSRF-Token'] = $('meta[name="csrf-token"]').attr('content');
  $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';

  /**
   * The workhorse; converts an object to x-www-form-urlencoded serialization.
   * @param {Object} obj
   * @return {String}
   */
  var param = function(obj) {
    var query = '', name, value, fullSubName, subName, subValue, innerObj, i;

    for(name in obj) {
      value = obj[name];

      if(value instanceof Array) {
        for(i=0; i<value.length; ++i) {
          subValue = value[i];
          fullSubName = name + '[' + i + ']';
          innerObj = {};
          innerObj[fullSubName] = subValue;
          query += param(innerObj) + '&';
        }
      }
      else if(value instanceof Object) {
        for(subName in value) {
          subValue = value[subName];
          fullSubName = name + '[' + subName + ']';
          innerObj = {};
          innerObj[fullSubName] = subValue;
          query += param(innerObj) + '&';
        }
      }
      else if(value !== undefined && value !== null)
        query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
    }

    return query.length ? query.substr(0, query.length - 1) : query;
  };

  // Override $http service's default transformRequest
  $httpProvider.defaults.transformRequest = [function(data) {
    return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data;
  }];
});