使用“If-None-Match”获取:“etag”标头在 React Native 应用程序中始终返回 200

waf*_*ffl 5 etag fetch react-native

我在 react native 应用程序中遇到一个非常奇怪的问题,其中使用 etag 进行简单的 fetch 总是返回 a200而不是预期的304

const response = await fetch(url, {
  method: 'GET',
  headers: {
    'If-None-Match': etag
  },
});
Run Code Online (Sandbox Code Playgroud)

哪里etag"33a64df551425fcc55e4d42a148795d9f25f89d4"

当我直接通过 Postman/Insomnia 之类的东西提出这个请求时,它工作正常,我得到了适当的304回应。

检查 Reactotron 中的应用程序,我可以看到网络请求标头似乎是正确的:

反应器截图

如果我将 JSON 请求复制为 cURL,我会得到以下信息:

curl -H "if-none-match:"33a64df551425fcc55e4d42a148795d9f25f89d4"" https://url/to/api

稍作修改以仅显示标题:

curl -sD - -o /dev/null -H "if-none-match:"33a64df551425fcc55e4d42a148795d9f25f89d4"" https://url/to/api

这也只返回 a 200,但如果我像这样转义 etag 周围的引号,它会起作用:

curl -sD - -o /dev/null -H "if-none-match:\"33a64df551425fcc55e4d42a148795d9f25f89d4\"" https://url/to/api

我真的很困惑,因为我已经尝试了以下所有变体:

'If-None-Match': etag
'If-None-Match': `"${etag}"`
'If-None-Match': `\"${etag}\"`
'If-None-Match': '"' + etag + '"'
Run Code Online (Sandbox Code Playgroud)

无济于事,我做错了什么?

将相同的 fetch 请求放入一个 html 文件并在浏览器中进行测试以达到预期的304状态。

Ram*_*rog 0

我在 React Native 应用程序上使用 Axios 时遇到了同样的问题。我还尝试了相反的“If-Match”并得到了 200,所以就好像标题根本不存在一样。

const query = {
  method: 'GET',
  url: `someurl`,
  headers: {
    Authorization: `Bearer ${token}`,
    'If-Match': etag,
  },
};

let response = await axios(query);
Run Code Online (Sandbox Code Playgroud)