【问题标题】:AngularJS unable to get HTTP Headers from PHPAngularJS 无法从 PHP 获取 HTTP 标头
【发布时间】:2015-04-10 09:00:03
【问题描述】:

我正在尝试从来自 PHP 网站的 AngularJS 中的 http 调用获取标头。 我正在调用的网站管理员向我保证 CORS 已启用,并且服务器已设置一个标志以允许 js 访问 cookie。 下面是示例代码:

    $http({
        method: "POST",
        url: 'https://example.com/page',
        data: {'Form[foo]': feild1, 'Form[bar]': field2},
        headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'}
    }).then(function(data, status, headers, config) {
        console.log(data.data);
        console.log(headers()['Set-Cookie']); 
    }, function(err) {
        console.error('ERR', err);
    })

在第一个日志评论中,我可以看到返回的网页。在 Chrome Inspector 中,我可以单击页面的回复并查看标题,包括“Set-Cookie”。 但是,第二条日志评论返回:

 TypeError: undefined is not a function

我已经做了很多寻找答案和试错测试的工作。例如:

  }).then(function(data, status, headers, config) {
        console.log(data.headers);            

结果 ->

function (name) {
  if (!headersObj) headersObj =  parseHeaders(headers);

  if (name) {
    return headersObj[lowercase(name)] || null;
  }

  return headersObj;
}   

还有:

  }).then(function(resp) {
    console.log(resp.headers["Set-Cookie"]); 

结果 -> 未定义

console.log(resp.header('Set-Cookie')); 

结果 -> TypeError: undefined is not a function

console.log(headers());

结果 -> TypeError: undefined is not a function

我也尝试过使用 angular-cookies(在安装 Bower 之后,在索引中添加脚本标签,注入 $cookies 和 $timeout):

        $timeout(function(){
            console.log($cookies.session)
        });

结果 -> 未定义

还有

console.log($cookieStore.get('Set-Cookie'));

结果 -> 未定义。

我已经阅读了很多关于这个问题的问题,但所提出的答案都没有奏效。如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

    标签: javascript php angularjs http cookies


    【解决方案1】:

    从文档中您应该能够按如下方式检索标头

    console.log(headers('Set-Cookie'));
    

    【讨论】:

    • 我试过了。上面的列表并不详尽,因为我尝试了许多变体来寻找正确的方法。 'console.log(headers('Set-Cookie'));'在控制台中显示为:'TypeError: undefined is not a function'。那么这说明了这个问题呢?该错误是否暗示了某些潜在情况?
    • 奇怪的是,我刚刚使用 Plunker 尝试过它,它的工作原理与描述的一样。 plnkr.co/edit/UThkcCHkottOUQ1R8q43?p=preview
    • 感谢 Plunker 的链接。但是,当我单击 fetch 时,警报说内容为空。我使用 Chrome 和 Firefox。可能是什么问题?
    • 我显示它没有给出类型错误,它检索的值是由于标头不存在而为空。
    • 获取的标头为空??
    【解决方案2】:

    $http 服务返回一个由 object 解析的 promise,该对象具有名为 headers 的字段,该字段是获取标头的函数。

    因此,要修复现有代码,您需要更改

    .then(function(data, status, headers, config) {
            console.log(data.data);
            console.log(headers()['Set-Cookie']); 
        }, function(err) {
            console.error('ERR', err);
        })

    .then(function(resolvedObject) {
            console.log(resolvedObject);
            console.log(resolvedObject.headers('Set-Cookie')); 
        }, function(err) {
            console.error('ERR', err);
        })

    您将它与successerror 函数混合在一起,它们与返回的相同承诺相关联。

    编辑:
    从问题更新sn-p:

    $http({
            method: "POST",
            url: 'https://example.com/page',
            data: $.param({'Form[foo]': feild1, 'Form[bar]': field2}),
            headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'}
        }).then(function(resolvedOcject) {
            console.log(resolvedOcject);
            console.log(resolvedOcject.headers('Set-Cookie')); 
        }, function(err) {
            console.error('ERR', err);
        });

    另外,我相信您的意图是使用 Form[foo] 的值作为参数名称。如果是这样上面的代码不会给你,你需要单独提取它(不是在这一行,而是在之前创建参数):

    // As an object
    var params = {};
    params[Form.foo] = 'field1';
    params[Form.bar] = 'field2';
    
    // Or as a query string
    var queryString = Form.foo + '=' + field1 + '&' + Form.bar + '=' + field2;

    【讨论】:

    • 这是一个有趣的答案,但没有给出我可以在控制台网络选项卡中看到的 Set-Cookie 值。第一个日志注释显示何时似乎是标题和 html 响应的长组合。第二条日志注释返回“null”。
    • 我相信这意味着响应中没有“Set-Cookie”标头...我认为您的请求中还有另一个问题:因为您发送的是 x-www-form-urlencoded 请求,所以您需要正文为name1=value1&name2=value2等形式...您可以使用jQuery.param()将JSON转换为params字符串。
    • 在这种情况下如何使用jQuery.param()?请提供一个示例用法吗?
    • 我更新了我的答案。当然,您还必须将 jQuery 添加到您的页面中。如果您能更详细地说明如何获取参数,我也可以帮助您构建这些参数
    • 谢谢@idan。表单参数旨在模仿 php 表单正在执行的操作。我正在尝试制作一个可以与现有 php 站点对话的混合移动客户端。管理员告诉我明确使用 'Form[foo]:asd'。由于上面的原始帖子在控制台网络选项卡中返回 Set-Cookie,看来这只是如何正确访问它的问题,而不是如何发送参数的问题。我已将 jquery 包含在 Bower 组件和索引页面中,但 $.param 调用返回 Uncaught SyntaxError: Unexpected token {。我必须提供服务或工厂吗?
    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2016-01-29
    • 1970-01-01
    • 2021-07-06
    相关资源
    最近更新 更多