Angularjs $http.post不使用标头

Angularjs $http.post不使用标头,angularjs,api,http,Angularjs,Api,Http,我对angularjs是新手。我正在尝试发出需要授权的API请求。我已经将它包含在请求的标题中,但它仍然不起作用。查看Chrome网络选项卡,它显示使用的方法是选项,而不是POST app.config(['$httpProvider', function ($httpProvider) { $httpProvider.defaults.headers.common = {}; $httpProvider.defaults.headers.put = {}; $httpP

我对angularjs是新手。我正在尝试发出需要授权的API请求。我已经将它包含在请求的标题中,但它仍然不起作用。查看Chrome网络选项卡,它显示使用的方法是选项,而不是POST

app.config(['$httpProvider', function ($httpProvider) {
    $httpProvider.defaults.headers.common = {};
    $httpProvider.defaults.headers.put = {};
    $httpProvider.defaults.headers.patch = {};
    $httpProvider.defaults.headers.post = {};
    $httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";
}]);

app.service('Api', function ($http) {
    return {
        post: function(token){
            $http.defaults.headers.post['Authorization'] = "Bearer " + token
            $http.post('http://localhost:3000/api/profile/me').success(function(data, status, headers, config) {
                console.log(data)
            })
        }
      }
});

我猜它不起作用,你是说你拿到了401。这是IIS和CORS的问题。只要在API上启用了CORS,一些请求就会发送一个预飞行选项请求。问题是,选项请求没有您的身份验证头,IIS需要这些身份验证头,它找不到这些头,因此会以401响应。我遇到了同样的问题,并在文章中找到了解决方法。如果您在IIS上对API使用集成模式,则此修复将很容易。下面是链接中的重要内容

创建IHTTP模块:

public class CORSModule : IHttpModule
{
    public void Dispose() { }

    public void Init(HttpApplication context)
    {
        context.PreSendRequestHeaders += delegate
        {
            if (context.Request.HttpMethod == "OPTIONS")
            {
                var response = context.Response;
                response.StatusCode = (int)HttpStatusCode.OK;
            }
        };
    }
}
然后在配置中注册它

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS" />
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Headers" value="Content-Type,Authorization" />
    </customHeaders>
  </httpProtocol>
  <modules>
    <add name="CORSModule" type="CORSModule" />
  </modules>
</system.webServer>
这会创建一个IHttpModule,仅当您处于集成模式时,它才会在IIS授权之前运行。如果您处于经典模式,我还没有找到对此的修复程序,请检查它是否是选项请求,然后允许它


希望这有帮助。

您在API上使用CORS吗?您能在chrome调试器网络选项卡中看到发送的标题吗?您是否尝试过使用诸如chrome Postman extension之类的工具并手动设置标题,以查看API是否使用正确的内容进行响应?@BenBlack是的,我的API使用CORS。@当我向Postman发送请求时,Mrsieurninja正在使用它。