问题
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;
}];
});
来源:https://stackoverflow.com/questions/31759426/yii2-how-can-i-manage-angularjs-post-request-in-yii2