从 Elm 中的 HTTP 响应中读取自定义标头

Posted

技术标签:

【中文标题】从 Elm 中的 HTTP 响应中读取自定义标头【英文标题】:Read custom headers from HTTP response in Elm 【发布时间】:2020-04-01 16:19:41 【问题描述】:

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

更新

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

【问题讨论】:

Probably CORS-related 如果这解决了您的问题,而不是编辑,请随时接受我的回答 - 或者更好的是,发布您自己的回答,详细说明 CORS 问题以及您如何解决它并接受它! Gareth,我投了赞成票,但不确定如何真正接受答案。 @yagger 你应该看到a tick mark you can press to turn green and accept it。 【参考方案1】:

I can't reproduce this.一些标题不会被返回 - 特别是 Set-CookieSet-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() 确实过滤了前面提到的两个标头:

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

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

【讨论】:

以上是关于从 Elm 中的 HTTP 响应中读取自定义标头的主要内容,如果未能解决你的问题,请参考以下文章

从 WKWebview 检索 HTTP 响应标头

自定义响应头 Jersey/Java

为响应消息使用自定义标头;不好的做法?

WCF 作为 Windows 服务托管 - 自定义 HTTP 标头未反映在响应标头上

使用 java servlet 在重定向响应中丢失 HTTP 自定义标头

在响应中的每个获取请求之前附加自定义标头