使用 fetch 时文本响应为空

Posted

技术标签:

【中文标题】使用 fetch 时文本响应为空【英文标题】:Text response is empty when using fetch 【发布时间】:2017-07-04 10:15:01 【问题描述】:

以下代码:

fetch('http://localhost:8080/root/1487171054127/k_query_bearer_token', 
        mode: 'no-cors', credentials: 'include'
    )
        .then(function (response) 
            return response.text();
        )
        .then(function (text) 
            console.log('Request successful', text.length);
        )
        .catch(function (error) 
            log('Request failed', error)
        );

正在输出:

Request successful 0

如果我使用 curl:

curl 'http://localhost:8080/root/1487171054127/k_query_bearer_token' \
  -H 'Cookie: JSESSIONID=CviS9IK8pcsqADdP-m0MRXX_AvUqfzjJPwk1Yytf.ee16d0a01ad5' 

我得到一个文本形式的令牌(长度!= 0)。

如果我通过以下方式输出响应头:

curl 'http://localhost:8080/root/1487171054127/k_query_bearer_token' 
  -H 'Cookie: JSESSIONID=CviS9IK8pcsqADdP-m0MRXX_AvUqfzjJPwk1Yytf.ee16d0a01ad5'
  --head

我明白了:

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Undertow/1
Server: JBoss-EAP/7
Content-Type: text/plain
Content-Length: 1730
Date: Wed, 15 Feb 2017 16:17:00 GMT

为什么我通过 fetch 没有收到任何文本?

【问题讨论】:

您的预期反应是什么? response.text() 将返回一个包含 USVString 的承诺:developer.mozilla.org/en-US/docs/Web/API/Body/text 【参考方案1】:

删除mode: 'no-cors'

当您使用no-cors 模式时,您明确指定您需要“opaque response”。

您的脚本无法访问不透明响应的任何属性——实际上您所能做的就是缓存它。 no-cors 模式基本上只在使用 Service Worker 进行缓存时才有用。

如果您的脚本使用no-cors 模式的原因是因为对服务器的跨域请求将无法正常工作,那么正确的解决方案是更新服务器端代码以发送Access-Control-Allow-Origin 响应标头和其他 CORS 标头(如果您有权访问服务器,请执行此操作),否则,请使用 https://cors-anywhere.herokuapp.com/ 之类的代理。

【讨论】:

你是个传奇。我认为这是因为客户端代码,因为服务器端正在给出响应.. 不!

以上是关于使用 fetch 时文本响应为空的主要内容,如果未能解决你的问题,请参考以下文章

在 React JS 中使用 fetch 处理响应状态

如何在使用 oauthlib.oauth2 fetch_token 时捕获 API 失败

使用React Native Fetch中的对象响应时未处理的Promise Rejection

JQuery $.ajax 成功数据始终为空

使用 fetch、cors 时如何从 json API 获取属性?

使用 redux-saga 和 fetch 自动处理 401 响应