从 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-Cookie
和 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()
确实过滤了前面提到的两个标头:
ByteString
表示所有响应的标头(字段名称为Set-Cookie
或Set-Cookie2
的标头除外),由 CRLF 分隔,如果未收到响应,则为null
。如果发生网络错误,则返回一个空字符串。
正如您所看到的,很可能是特定情况导致浏览器不返回所有标题。我们需要更多信息(理想情况下是我们可以重现该问题的示例)才能说出更多信息。正如in glennsl's comment 所建议的那样,这似乎很可能是a CORS issue。我建议尝试在该环境中直接使用 getAllResponsHeaders()
并从等式中删除 Elm。
【讨论】:
以上是关于从 Elm 中的 HTTP 响应中读取自定义标头的主要内容,如果未能解决你的问题,请参考以下文章
WCF 作为 Windows 服务托管 - 自定义 HTTP 标头未反映在响应标头上