首页 > 解决方案 > 从 Elm 中的 HTTP 响应中读取自定义标头

问题描述

我正在使用Http.expectStringResponse将 HTTP 响应元数据与正文(或错误)一起传递。我登录Dict.keys metadata.headers到控制台。根据日志,Elm 没有通过所有的标头。从附图中可以看出,开发工具网络选项卡中的标题集是日志中标题的超集。我在文档中找不到对此的解释。希望 Elm 社区能有所启发。

在此处输入图像描述

更新

正如 glennsl 和 Gareth Latty 所指出的,这与 CORS 相关,与 Elm 无关。XMLHttpRequest产生相同的结果。

标签: corselm

解决方案


我无法重现这个。一些标头不会被返回——特别是Set-Cookieand Set-Cookie2,但你的示例中的所有标头都应该是,至少就 Elm 而言。

你可以看到Http's header parsing的实现:

_Http_parseHeaders(xhr.getAllResponseHeaders())

...

function _Http_parseHeaders(rawHeaders)
{
    if (!rawHeaders)
    {
        return __Dict_empty;
    }

    var headers = __Dict_empty;
    var headerPairs = rawHeaders.split('\r\n');
    for (var i = headerPairs.length; i--; )
    {
        var headerPair = headerPairs[i];
        var index = headerPair.indexOf(': ');
        if (index > 0)
        {
            var key = headerPair.substring(0, index);
            var value = headerPair.substring(index + 2);

            headers = A3(__Dict_update, key, function(oldValue) {
                return __Maybe_Just(__Maybe_isJust(oldValue)
                    ? value + ', ' + oldValue.a
                    : value
                );
            }, headers);
        }
    }
    return headers;
}

您可以在 Elm 中看到,没有发生过滤。

getAllResponseHeaders()确实过滤了前面提到的两个标题:

A表示所有响应的标头(字段名称为或ByteString的标头除外),由 CRLF 分隔,或者如果没有收到响应。如果发生网络错误,则返回一个空字符串。Set-CookieSet-Cookie2null

正如您所看到的,这可能是特定于导致浏览器不返回所有标题的情况。我们需要更多信息(理想情况下是我们可以重现该问题的示例)才能说出更多信息。正如glennsl 的评论中所建议的,这似乎可能是一个 CORS 问题。我建议尝试getAllResponsHeaders()直接在该环境中使用并从等式中删除 Elm。


推荐阅读