从 Elm 中的 HTTP 响应中读取自定义 headers
Read custom headers from HTTP response in Elm
我正在使用 Http.expectStringResponse
来传递 HTTP 响应元数据以及 body(或错误)。然后我将 Dict.keys metadata.headers
登录到控制台。根据日志,Elm 没有通过所有 headers。从附图中可以看出,dev-tools网络选项卡中的headers组是日志中headers的超集。我在文档中找不到对此的解释。希望 Elm 社区可以提供一些启示。
更新
正如 glennsl 和 Gareth Latty 所指出的,这与 CORS 相关,与 Elm 无关。 XMLHttpRequest
产生相同的结果。
I can't reproduce this. 一些 headers 不会被 returned——特别是 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()
确实过滤了前面提到的两个 headers:
A ByteString
representing all of the response's headers (except those whose field name is Set-Cookie
or Set-Cookie2
) separated by CRLF, or null
if no response has been received. If a network error happened, an empty string is returned.
如您所见,这可能是导致浏览器无法 return 所有 headers 的特定情况。我们需要更多信息(最好是一个我们可以重现问题的示例)才能说得更多。按照建议 in glennsl's comment, it seems likely this might be a CORS issue。我建议尝试在该环境中直接使用 getAllResponsHeaders()
并从等式中删除 Elm。
我正在使用 Http.expectStringResponse
来传递 HTTP 响应元数据以及 body(或错误)。然后我将 Dict.keys metadata.headers
登录到控制台。根据日志,Elm 没有通过所有 headers。从附图中可以看出,dev-tools网络选项卡中的headers组是日志中headers的超集。我在文档中找不到对此的解释。希望 Elm 社区可以提供一些启示。
更新
正如 glennsl 和 Gareth Latty 所指出的,这与 CORS 相关,与 Elm 无关。 XMLHttpRequest
产生相同的结果。
I can't reproduce this. 一些 headers 不会被 returned——特别是 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()
确实过滤了前面提到的两个 headers:
A
ByteString
representing all of the response's headers (except those whose field name isSet-Cookie
orSet-Cookie2
) separated by CRLF, ornull
if no response has been received. If a network error happened, an empty string is returned.
如您所见,这可能是导致浏览器无法 return 所有 headers 的特定情况。我们需要更多信息(最好是一个我们可以重现问题的示例)才能说得更多。按照建议 in glennsl's comment, it seems likely this might be a CORS issue。我建议尝试在该环境中直接使用 getAllResponsHeaders()
并从等式中删除 Elm。