$ http.post无法使用标头

时间:2015-05-11 21:02:16

标签: angularjs api http

我是angularjs的新手。我正在尝试发出需要授权的API请求。我已将它包含在请求的标题中,但它仍然无法正常工作。查看Chrome网络标签,它显示使用的方法是OPTIONS而不是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)
            })
        }
      }
});

1 个答案:

答案 0 :(得分:0)

我猜测它不起作用"你的意思是你得到401.这是IIS和CORS的一个问题。每当您在API上启用CORS时,某些请求将发送预检的OPTIONS请求。这样做的问题是OPTIONS请求没有您的身份验证标头,IIS需要这些身份验证标头,它没有找到它们所以它以401响应。我遇到了同样的问题并找到了我的修复程序在this文章中。如果您在IIS上使用集成模式的API,则此修复程序将很容易。链接中的重要内容如下所示。

创建IHttpModule:

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>

这样做会创建一个在IIS授权之前运行的IHttpModule(只有当你处于集成模式时,如果你处于经典模式,我还没有找到)修复此),检查它是否是OPTIONS请求,然后允许它。

希望这有帮助。