如何使用 fetch() 和 React Native 处理 set-cookie 标头

Posted

技术标签:

【中文标题】如何使用 fetch() 和 React Native 处理 set-cookie 标头【英文标题】:How to handle set-cookie headers with fetch() and React Native 【发布时间】:2018-09-16 16:26:00 【问题描述】:

我有基于 cookie 的身份验证和会话管理的 spring boot 应用程序。 对于第一个请求,我收到 cookie 名称和会话哈希值作为值。

另一方面,我用 Expo 包装了 React Native 应用程序。 对于第一个请求,我可以从 fetch() 请求中获取这个“set-cookie”标头。然后,即使重新启动应用程序,我也无法获取此标题。

我使用 React Native Debugger 和这行代码对其进行了调试:

GLOBAL.XMLHttpRequest = GLOBAL.originalXMLHttpRequest || GLOBAL.XMLHttpRequest;

我可以在调试器的网络选项卡上看到我的 XHR 请求。清除所有 cookie 后,每次我在请求的预览中收到正确的 set-cookie 标头。但是我用 fetch(...).then(response => response.headers) 看不到它。

为什么?这是我的 cookie 持久化的东西吗?如何在没有插件/库的情况下处理 cookie 数据并将其保存到 AsyncStorage?

【问题讨论】:

【参考方案1】:

解决方案:

如果您在 React Native Debugger 中启用了 Network Inspect,请将其关闭。右键单击 Redux 区域的任意位置,然后按Disable Network Inspect

注意事项:

我知道这是多年以后的事了,但我发现罪魁祸首是 React Native Debugger。如果您启用了 Network Inspect,它会删除 set-cookie 标头,留下未定义的标题。

请注意,我使用的是 Axios 版本 0.20.0,并在我的 POST 配置中将 withCredentials 设置为 true,在 React Native 0.63.3 上使用 React Native Debugger 0.11.5。我知道这不是 fetch,但很可能是那些年前让你感到困扰的东西。当您开始使用 RND 进行检查时,您的 set-cookie 就消失了。

现在的解决方案是禁用 Network Inspect,然后您将再次获得 set-cookie

React Native Debugger 在 2019 年出现了一个 bug,作者提到这是一个不容易克服的限制。

如果您有兴趣,请在此处阅读更多内容:

https://github.com/jhen0409/react-native-debugger/issues/340#issuecomment-514395195

【讨论】:

这在我以为我碰壁后救了我。如此明显但不是......【参考方案2】:

见here

使用获取请求发送凭据

您是否要使用凭据发出提取请求,例如 cookie,您应该将请求的凭据设置为“包含”。

fetch(url, 
  credentials: 'include'
)

【讨论】:

它没有帮助 :( 我的响应标题中仍然没有 cookie。我只在第一次调用时使用它。 同样的问题,你有没有解决这个问题?

以上是关于如何使用 fetch() 和 React Native 处理 set-cookie 标头的主要内容,如果未能解决你的问题,请参考以下文章

React如何使用内置的fetch模块

如何在 React 中使用 fetch 和表单数据发布对象?

如何使用 fetch() 和 React Native 处理 set-cookie 标头

如何在 React 中使用 fetch 正确处理来自 REST API 的数据对象

如何在 React 中使用 fetch() API 来设置状态

react-native upoad imagepicker