cors - 从 Elm 中的 HTTP 响应中读取自定义标头
问题描述
我正在使用Http.expectStringResponse
将 HTTP 响应元数据与正文(或错误)一起传递。我登录Dict.keys metadata.headers
到控制台。根据日志,Elm 没有通过所有的标头。从附图中可以看出,开发工具网络选项卡中的标题集是日志中标题的超集。我在文档中找不到对此的解释。希望 Elm 社区能有所启发。
更新
正如 glennsl 和 Gareth Latty 所指出的,这与 CORS 相关,与 Elm 无关。XMLHttpRequest
产生相同的结果。
解决方案
我无法重现这个。有一些标头不会被返回——特别是Set-Cookie
and 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-Cookie
Set-Cookie2
null
正如您所看到的,这可能是特定于导致浏览器不返回所有标题的情况。我们需要更多信息(理想情况下是我们可以重现该问题的示例)才能说出更多信息。正如glennsl 的评论中所建议的,这似乎可能是一个 CORS 问题。我建议尝试getAllResponsHeaders()
直接在该环境中使用并从等式中删除 Elm。
推荐阅读
- tfs - Team Foundation Server 2015 到 2018 升级错误(步骤 909)
- mule - 无法传递标头
- python - 有没有办法从 python (pydicom) 中的多个 dicom 图像构建单个 dicom 图像?
- python - 我想知道在哪里可以找到可通过 pip install 获得的单行命令行工具的官方来源
- dart - Dart 中覆盖 runtimeType 有什么用
- angular - Angular 6 组件与响应式表单数据的交互
- c# - 运行 asp.net mvc 项目时出现错误“无法启动 iisexpress Web 服务器”
- python - 有什么方法可以提高通过 Magento REST API 调用获取产品的性能?
- cordova - 从 Phonegap 应用程序访问时未保存会话状态
- c# - 具有子集合的实体在 WCF 中导致问题:如果您使用 DataContractSerializer,请考虑使用 DataContractResolver