角度资源POST方法变成选项

时间:2016-03-01 12:59:43

标签: angularjs api

我正在尝试使用$ resource向API服务器发出请求。 我想做一个帖子,但角度转换方法到选项,并给出一个错误 选项http:/ / l ocalhost / API.DWS / api / v1 / user / login XMLHttpRequest无法加载http:// localhost / API.DWS / api / v1 / user / login。预检的响应具有无效的HTTP状态代码405



var objectMethods = {
    get: { method: 'GET' },
    update: { method: 'PUT' },
    create: { method: 'POST' },
    remove: { method: 'DELETE' },
    patch: { method: 'PATCH' }
};



var apiUrl = "http://localhost/API.DWS";

angular.module('nurby.version.services', [])
    .config(function ($httpProvider) {
    })



.factory('LoginService', ['$resource', '$http', function ($resource, $http) {
    return $resource(apiUrl + "/api/v1/user/login", {},objectMethods);
}])
.controller('LogInController', ['$scope', '$rootScope', '$location','LoginService', '$http', function ($scope, $rootScope, $location, LoginService, $http) {
    $scope.login = function (model) {
        var loginObject = { Username: model.username, Password: model.password };
      
        
        $http.defaults.useXDomain = true;
        $http.defaults.headers['Content-Type'] = 'application/json';
        $http.defaults.headers['Access-Control-Allow-Origin'] = '*';

        LoginService.create({}, loginObject, function (data) {
            if (data) {
                toastr.success("itworks");
            }
            else {
                toastr.error("not working")
            }
        })

    }

}]);




3 个答案:

答案 0 :(得分:0)

您可以定义service.js并使用它,如下所示:

var APP_NAME = 'app';

angular.module(APP_NAME).service('WebService', ["$http", function ($http) {
this.login = function (parameters,callbackFunc)
{
    $http({
        url: 'api/login',
        method: 'POST',
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        data: $.param(parameters)
    }).success(function (data) {
        callbackFunc(data);
    }).error(function (data) {
        callbackFunc([]);
    });
};

并在您的控制器中使用它,如下所示:

LoginController = ['$scope', '$http', '$location', 'WebService','$window', function ($scope, $http, $location,$WebService,$window) {

$scope.login = function(admin){

    var data = {email:admin.email,password:admin.password};
    $WebService.login(data,function(result){
        if(result.success){
            $window.location.replace("index");
        }
        else{
            $scope.loginError = result.fail;
        }
    });
}

}];

答案 1 :(得分:0)

这里的问题是你指定一个以“https://github.com/goldsky/spiefeed/pull/16/files”开头的完整网址,而你没有从同一个域加载网页(也许你使用了不同的端口?)。

这意味着浏览器会将您的请求视为跨域请求。因此,它首先发送一个OPTIONS请求,询问服务器是否允许您发送POST。您可以将服务器配置为正确响应这些请求,或更改代码以使网页和API位于同一域中。

如何配置服务器取决于您运行的服务器。搜索CORS和您的Web服务器,您应该找到有用的信息。

答案 2 :(得分:0)

在我的控制器中,这对我有用

var resource = $resource(
                "your_api_url",
                {
                    callback: "JSON_CALLBACK"
                },
                {
                    getData: {
                        method: "JSONP",
                        isArray: false
                    }
                }
            );

  function loadRemoteData() {

                $scope.isLoading = true;

                resource.getData().$promise.then(
                    function( friends ) {

                        $scope.isLoading = false;


                    },
                    function( error ) {

                        // If something goes wrong with a JSONP request in AngularJS,
                        // the status code is always reported as a "0". As such, it's
                        // a bit of black-box, programmatically speaking.
                        alert( "Something went wrong!" );

                    }
                );

            }
  $scope.searchResources = function() {
$scope.isLoading = true;

                resource.getData().$promise.then(
                    function( friends ) {

                        $scope.isLoading = false;

                    },
                    function( error ) {

                        // If something goes wrong with a JSONP request in AngularJS,
                        // the status code is always reported as a "0". As such, it's
                        // a bit of black-box, programmatically speaking.
                        alert( "Something went wrong!" );

                    }
                );


  };