【问题标题】:React JS fetch as POST to cross-origin, PHP returns 200 but without body responseReact JS fetch 作为 POST 跨域,PHP 返回 200 但没有正文响应
【发布时间】:2019-10-22 10:19:46
【问题描述】:

我知道有人问过类似的问题,但这里没有任何工作。提前谢谢!

我也在使用来自 react JavaScript 应用程序(位于 http://localhost:3000)的 fetch 来发布数据,并从本地 PHP API(使用 XAMPP 并位于 http://local.api.mysite.com/user)获取响应

每次我获得 200 状态时,没有任何返回的标题或正文。如果我在浏览器中转到 PHP URL,它就可以正常工作

我已确保在 js 和 php 中都设置了 cors,设置了内容类型,关闭了缓存,并尝试了此处和 Google 上的所有建议修复。

这是最后的手段

JS:

fetch('http://local.api.mysite.com/user', {
    method: 'POST',
    mode: 'cors',
    headers: {
        'Content-Type': 'application/json',
        'Cache-Control': 'no-cache'
    },
    body: JSON.stringify(data),
    }).then(console.log(response))

PHP:

// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header("Cache-Control: no-cache");
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
    exit(0);
}
$output = json_encode(['status' => 'recieved']);
header('Content-Length: '.strlen($output));
header('Content-Type: application/json');
echo $output;
exit;

以前我将我的 PHP 标头限制得更严格,但我发现了这个代码块并使用它来让任何东西都通过测试。

解决方案 Rikin 对他的回答的评论让我打开了开发工具,转到网络选项卡,然后直接查看回复。这表明发生了服务器错误并导致空响应,状态为 200

【问题讨论】:

    标签: javascript php reactjs fetch


    【解决方案1】:

    这是fetch 关于其构建方式的问题。您会得到一个 响应,您必须将其解析为jsontextblob,然后寻找我们期望的实际响应。我在下面修改了一些代码,以便为您提供所需的内容。

    fetch('http://local.api.mysite.com/user', {
      method: 'POST',
      mode: 'cors',
      headers: {
        'Content-Type': 'application/json',
        'Cache-Control': 'no-cache'
      },
      body: JSON.stringify(data),
    })
    .then(data => data.ok && data.json())
    .then(response => console.log(response));
    

    这是您在 fetch 响应中返回的内容:https://developer.mozilla.org/en-US/docs/Web/API/Response

    【讨论】:

    • 感谢您的回复!由于响应为空,我得到“JSON.parse:JSON 数据的第 1 行第 1 列的意外字符”。如果我只用“data”交换“data.json()”,那么我得到的响应对象是 bodyUsed: false 和空的 body/headers 和 status: 200 statusText: "OK"
    • 好的,至少你可以读取流,但现在你的响应是空的,所以它更有可能是 API 问题,没有返回 200 状态的响应。
    • 一开始我也是这么想的,但是如果我直接访问 URL,它确实会输出 JSON 响应。我已经验证了拼写问题,甚至点击了登录到 console.log 的 response.url,它可以直接运行
    • 如果有帮助,如果将 API 设置为返回 404,那么 JS 会选择它
    • 如果您直接访问 URL,那么它会变成 GET 调用,因此您不会在那里测试相同的东西。可能您可以尝试在开发控制台打开的情况下转到 url 并转到网络选项卡,然后一旦调用成功,通过右键单击它来捕获提取,然后复制 > 复制为提取。使用它,您将能够比较该 fetch 与您的代码的 fetch
    猜你喜欢
    • 2018-02-20
    • 2019-12-10
    • 1970-01-01
    • 2021-02-05
    • 2018-01-18
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多