2

我正在尝试使用带有我的 $resource 请求的标头传递令牌。通常您可以执行以下操作

  $http.defaults.headers.common

在.config中,但是当应用程序第一次引导时我不知道这些,所以我想我会做以下事情......但它目前没有通过我的标题..

目前令牌是硬编码的,但一旦我确认它工作,那么它将来自持有令牌的注入服务。

    var resource = $resource('http://localhost:port/todos/:id', {
        port:":3001",
        id:'@id'
    }, {
        get: {
            method: "GET",
            headers: {
                "Accept": "application/stuffs;version=3",
                "Authorization": "Token token='xxxxxxxxx '"
            }
        },
        update: {method: 'PUT'}
    });

    return resource;

如果我检查提琴手,我在我的请求中看不到接受或授权标头。

我确实在提琴手中看到了消息,但没有看到我期望的标题。

我在这里错过了什么吗?

有任何想法吗?

谢谢

4

2 回答 2

2

首先,您的客户端代码没有问题。如果您不执行跨源请求(CORS - xhr 请求到与您的脚本不同的主机/端口),它应该可以正常工作。这是一个使用您的代码的非 CORS plkr 示例 - 您可以验证您的自定义标头是否正在发送:http ://plnkr.co/edit/cEBGjvYBpXv1q1D323IL?p=preview

如果您必须执行跨源请求,则必须确保您使用的浏览器都支持 CORS(IE >= 10,最新的 Chrome 或 Firefox),并且您的服务器代码正确响应 CORS 预检 OPTION 请求。这篇文章解释得很好:http ://www.html5rocks.com/en/tutorials/cors/

我创建了另一个 plnkr 示例,并通过设置响应以下内容的服务器来实现此功能(http://plnkr.co/edit/zJVhqJVSnApXGzGGxcN9?p=preview

首先 - 预检 OPTION 请求

Request URL:http://localhost:8080/todos 
Request Method:OPTIONS

服务器响应

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,PUT
Access-Control-Allow-Headers: Authorization
Content-Length: 0

接下来是“真正的”请求

Request URL:http://localhost:8080/todos
Request Method:GET

响应(注意访问控制允许标头也在这里):

HTTP/1.1 200 OK
Content-Type: application/x-json; charset=UTF-8
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,PUT
Access-Control-Allow-Headers: Authorization
Content-Length: 13

回复正文:

{"test":"OK"}
于 2013-06-27T10:39:48.847 回答
1

我通过查看 GitHub 上的 Angular 代码对此进行了调查。我发现从 Angular 1.1.2 开始,您可以完全按照您的问题指定标题。您不能在 1.1.2 之前的任何版本中指定标头。

正如 rGil 建议的那样,确保您使用的是最新版本的 ngResource。将 Angular 升级到 1.1.5 非常容易,但升级 ngResource 则不然。事实上,我对 ngResource 也做过同样的事情。

如果您想 100% 确定,请在 ngResource 中查找以下代码(假设您有未压缩的代码)。此代码循环传递给您的操作的每个属性(示例中的方法和标头)并将它们复制到一个对象(httpConfig)中。然后将 httpConfig 传递给 $http。

      forEach(action, function(value, key) {
        if (key != 'params' && key != 'isArray' ) {
          httpConfig[key] = copy(value);
        }
      });

如果你错过了这个循环,你有一个旧版本的 ngResource。

于 2013-07-03T04:29:59.633 回答